Commit aab45409ffa88ad13485a3adcb8e175c969e8be5

Authored by Georg GH. Hopp
Committed by Georg Hopp
1 parent d7a3f878

add first basic code to create new database entries

... ... @@ -7,10 +7,18 @@ class SystemData
7 7 end
8 8
9 9 def save
  10 + kind = self.class.to_s.to_sym
  11 +
10 12 if @id
11   - @backend.update(self)
  13 + @backend.update(kind, to_h)
12 14 else
13   - @backend.insert(self)
  15 + @backend.insert(kind, to_h)
14 16 end
15 17 end
  18 +
  19 + def to_h
  20 + Hash[instance_variables.map do |var|
  21 + [var[1...var.size].to_sym, eval(var)] if var != '@backend'
  22 + end]
  23 + end
16 24 end
... ...
... ... @@ -12,23 +12,23 @@ class SystemDataBackend
12 12 end
13 13
14 14 def users
15   - load(:user)
  15 + load(:User)
16 16 end
17 17
18 18 def groups
19   - load(:group)
  19 + load(:Group)
20 20 end
21 21
22 22 def sites
23   - load(:site)
  23 + load(:Site)
24 24 end
25 25
26 26 def mailAliases
27   - load(:mailAlias)
  27 + load(:MailAlias)
28 28 end
29 29
30 30 def mailAccounts
31   - load(:mailAccount)
  31 + load(:MailAccount)
32 32 end
33 33
34 34 def userByName(name)
... ... @@ -70,13 +70,11 @@ class SystemDataBackend
70 70 end
71 71
72 72 def load!(kind)
73   - @data[kind] = Array.new
74   - class_str = kind.to_s
75   - class_str[0] = class_str[0..0].capitalize
76   -
  73 + @data[kind] = Array.new
77 74 @backend.load(kind) do |data|
  75 + data[:backend] = @backend
78 76 @data[kind].push(
79   - eval(class_str + '.new(data)')
  77 + eval(kind.to_s + '.new(data)')
80 78 )
81 79 end
82 80 end
... ...
... ... @@ -21,20 +21,35 @@ class SystemDataBackendLdap
21 21 LDAP_SITE_MAP = {:o => :name}
22 22
23 23 LDAP_MAP = {
24   - :user => LDAP_USER_MAP,
25   - :group => LDAP_GROUP_MAP,
26   - :site => LDAP_SITE_MAP
  24 + :User => LDAP_USER_MAP,
  25 + :Group => LDAP_GROUP_MAP,
  26 + :Site => LDAP_SITE_MAP
27 27 }
28 28
29 29 LDAP_FILTER = {
30   - :user => Net::LDAP::Filter::eq('objectClass', 'posixAccount'),
31   - :group => Net::LDAP::Filter::eq('objectClass', 'posixGroup'),
32   - :site => Net::LDAP::Filter::eq('objectClass', 'organization') &
  30 + :User => Net::LDAP::Filter::eq('objectClass', 'posixAccount'),
  31 + :Group => Net::LDAP::Filter::eq('objectClass', 'posixGroup'),
  32 + :Site => Net::LDAP::Filter::eq('objectClass', 'organization') &
33 33 (~Net::LDAP::Filter::eq('o', 'hosting')),
34   - :mailAlias => Net::LDAP::Filter::eq('objectClass', 'mailAlias'),
35   - :mailAccount => Net::LDAP::Filter::eq('objectClass', 'mailAccount')
  34 + :MailAlias => Net::LDAP::Filter::eq('objectClass', 'mailAlias'),
  35 + :MailAccount => Net::LDAP::Filter::eq('objectClass', 'mailAccount')
36 36 }
37 37
  38 + LDAP_OBJECTCLASS = {
  39 + :User => [ 'account', 'posixAccount', 'shadowAccount' ],
  40 + :Group => 'posixGroup'
  41 + }
  42 +
  43 + LDAP_LAMBDA_USER = lambda do |entry|
  44 + entry[:cn] = entry[:uid]
  45 + entry[:shadowlastchange] = (Time::now.to_i/60/60/24).to_s
  46 + entry[:shadowmax] = '99999'
  47 + entry[:shadowwarning] = '7'
  48 + end
  49 +
  50 + LDAP_LAMBDA = {
  51 + :User => LDAP_LAMBDA_USER
  52 + }
38 53
39 54 def initialize(host, port, baseDn, args={})
40 55 @baseDn = baseDn
... ... @@ -62,8 +77,7 @@ class SystemDataBackendLdap
62 77 map = { :dn => :id }
63 78 map.merge!(LDAP_MAP[kind]) if LDAP_MAP[kind]
64 79
65   - ydata = { :backend => self }
66   -
  80 + ydata = {}
67 81 data.each do |key,value|
68 82 ydata.merge!({ map[key] || key => value.size==1?value[0]:value.to_a })
69 83 end
... ... @@ -72,12 +86,32 @@ class SystemDataBackendLdap
72 86 end
73 87 end
74 88
  89 + def update(kind, data)
  90 + map = {}
  91 + map.merge!(LDAP_MAP[kind].invert) if LDAP_MAP[kind]
  92 +
  93 + entry = Net::LDAP::Entry.new(data[:id])
  94 + data.delete(:id)
  95 +
  96 + entry[:changetype] = 'add'
  97 + entry[:objectclass] = LDAP_OBJECTCLASS[kind]
  98 +
  99 + data.each do |key,value|
  100 + key = map[key] if map[key]
  101 + entry[key] = value
  102 + end
  103 +
  104 + LDAP_LAMBDA[kind].call(entry) if LDAP_LAMBDA[kind]
  105 +
  106 + puts entry.to_ldif
  107 + end
  108 +
75 109 private
76 110
77 111 def ldapBase(kind)
78 112 case(kind)
79   - when :user, :group: @systemDn
80   - when :site, :mailAlias, :mailAccount: @hostingDn
  113 + when :User, :Group: @systemDn
  114 + when :Site, :MailAlias, :MailAccount: @hostingDn
81 115 end
82 116 end
83 117
... ...
... ... @@ -44,3 +44,10 @@ backend.mailAccounts.each do |mailAccount|
44 44 puts 'mailAccount: '+mailAccount.mail.inspect+','+mailAccount.mailbox.inspect
45 45 end
46 46
  47 +puts
  48 +
  49 +backend.userByName('georg').save
  50 +
  51 +puts
  52 +
  53 +backend.groupByName('wheel').save
... ...
Please register or login to post a comment