diff --git a/SystemData.rb b/SystemData.rb index 79fe4a4..ec1652b 100644 --- a/SystemData.rb +++ b/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 diff --git a/SystemDataBackend.rb b/SystemDataBackend.rb index 75df516..fd8e39c 100644 --- a/SystemDataBackend.rb +++ b/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 diff --git a/SystemDataBackendLdap.rb b/SystemDataBackendLdap.rb index 5b28818..dc906f0 100644 --- a/SystemDataBackendLdap.rb +++ b/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 diff --git a/test_dummy.rb b/test_dummy.rb index 963fa28..2a0e348 100644 --- a/test_dummy.rb +++ b/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