Browse Source

add first basic code to create new database entries

master
Georg Hopp 15 years ago
committed by Georg Hopp
parent
commit
aab45409ff
  1. 12
      SystemData.rb
  2. 18
      SystemDataBackend.rb
  3. 58
      SystemDataBackendLdap.rb
  4. 7
      test_dummy.rb

12
SystemData.rb

@ -7,10 +7,18 @@ class SystemData
end
def save
kind = self.class.to_s.to_sym
if @id
@backend.update(self)
@backend.update(kind, to_h)
else
@backend.insert(self)
@backend.insert(kind, to_h)
end
end
def to_h
Hash[instance_variables.map do |var|
[var[1...var.size].to_sym, eval(var)] if var != '@backend'
end]
end
end

18
SystemDataBackend.rb

@ -12,23 +12,23 @@ class SystemDataBackend
end
def users
load(:user)
load(:User)
end
def groups
load(:group)
load(:Group)
end
def sites
load(:site)
load(:Site)
end
def mailAliases
load(:mailAlias)
load(:MailAlias)
end
def mailAccounts
load(:mailAccount)
load(:MailAccount)
end
def userByName(name)
@ -70,13 +70,11 @@ class SystemDataBackend
end
def load!(kind)
@data[kind] = Array.new
class_str = kind.to_s
class_str[0] = class_str[0..0].capitalize
@data[kind] = Array.new
@backend.load(kind) do |data|
data[:backend] = @backend
@data[kind].push(
eval(class_str + '.new(data)')
eval(kind.to_s + '.new(data)')
)
end
end

58
SystemDataBackendLdap.rb

@ -21,20 +21,35 @@ class SystemDataBackendLdap
LDAP_SITE_MAP = {:o => :name}
LDAP_MAP = {
:user => LDAP_USER_MAP,
:group => LDAP_GROUP_MAP,
:site => LDAP_SITE_MAP
:User => LDAP_USER_MAP,
:Group => LDAP_GROUP_MAP,
:Site => LDAP_SITE_MAP
}
LDAP_FILTER = {
:user => Net::LDAP::Filter::eq('objectClass', 'posixAccount'),
:group => Net::LDAP::Filter::eq('objectClass', 'posixGroup'),
:site => Net::LDAP::Filter::eq('objectClass', 'organization') &
:User => Net::LDAP::Filter::eq('objectClass', 'posixAccount'),
:Group => Net::LDAP::Filter::eq('objectClass', 'posixGroup'),
:Site => Net::LDAP::Filter::eq('objectClass', 'organization') &
(~Net::LDAP::Filter::eq('o', 'hosting')),
:mailAlias => Net::LDAP::Filter::eq('objectClass', 'mailAlias'),
:mailAccount => Net::LDAP::Filter::eq('objectClass', 'mailAccount')
:MailAlias => Net::LDAP::Filter::eq('objectClass', 'mailAlias'),
:MailAccount => Net::LDAP::Filter::eq('objectClass', 'mailAccount')
}
LDAP_OBJECTCLASS = {
:User => [ 'account', 'posixAccount', 'shadowAccount' ],
:Group => 'posixGroup'
}
LDAP_LAMBDA_USER = lambda do |entry|
entry[:cn] = entry[:uid]
entry[:shadowlastchange] = (Time::now.to_i/60/60/24).to_s
entry[:shadowmax] = '99999'
entry[:shadowwarning] = '7'
end
LDAP_LAMBDA = {
:User => LDAP_LAMBDA_USER
}
def initialize(host, port, baseDn, args={})
@baseDn = baseDn
@ -62,8 +77,7 @@ class SystemDataBackendLdap
map = { :dn => :id }
map.merge!(LDAP_MAP[kind]) if LDAP_MAP[kind]
ydata = { :backend => self }
ydata = {}
data.each do |key,value|
ydata.merge!({ map[key] || key => value.size==1?value[0]:value.to_a })
end
@ -72,12 +86,32 @@ class SystemDataBackendLdap
end
end
def update(kind, data)
map = {}
map.merge!(LDAP_MAP[kind].invert) if LDAP_MAP[kind]
entry = Net::LDAP::Entry.new(data[:id])
data.delete(:id)
entry[:changetype] = 'add'
entry[:objectclass] = LDAP_OBJECTCLASS[kind]
data.each do |key,value|
key = map[key] if map[key]
entry[key] = value
end
LDAP_LAMBDA[kind].call(entry) if LDAP_LAMBDA[kind]
puts entry.to_ldif
end
private
def ldapBase(kind)
case(kind)
when :user, :group: @systemDn
when :site, :mailAlias, :mailAccount: @hostingDn
when :User, :Group: @systemDn
when :Site, :MailAlias, :MailAccount: @hostingDn
end
end

7
test_dummy.rb

@ -44,3 +44,10 @@ backend.mailAccounts.each do |mailAccount|
puts 'mailAccount: '+mailAccount.mail.inspect+','+mailAccount.mailbox.inspect
end
puts
backend.userByName('georg').save
puts
backend.groupByName('wheel').save
Loading…
Cancel
Save