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 end
def save def save
kind = self.class.to_s.to_sym
if @id if @id
@backend.update(self)
@backend.update(kind, to_h)
else else
@backend.insert(self)
@backend.insert(kind, to_h)
end end
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 end

18
SystemDataBackend.rb

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

58
SystemDataBackendLdap.rb

@ -21,20 +21,35 @@ class SystemDataBackendLdap
LDAP_SITE_MAP = {:o => :name} LDAP_SITE_MAP = {:o => :name}
LDAP_MAP = { 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 = { 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')), (~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={}) def initialize(host, port, baseDn, args={})
@baseDn = baseDn @baseDn = baseDn
@ -62,8 +77,7 @@ class SystemDataBackendLdap
map = { :dn => :id } map = { :dn => :id }
map.merge!(LDAP_MAP[kind]) if LDAP_MAP[kind] map.merge!(LDAP_MAP[kind]) if LDAP_MAP[kind]
ydata = { :backend => self }
ydata = {}
data.each do |key,value| data.each do |key,value|
ydata.merge!({ map[key] || key => value.size==1?value[0]:value.to_a }) ydata.merge!({ map[key] || key => value.size==1?value[0]:value.to_a })
end end
@ -72,12 +86,32 @@ class SystemDataBackendLdap
end end
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 private
def ldapBase(kind) def ldapBase(kind)
case(kind) case(kind)
when :user, :group: @systemDn
when :site, :mailAlias, :mailAccount: @hostingDn
when :User, :Group: @systemDn
when :Site, :MailAlias, :MailAccount: @hostingDn
end end
end end

7
test_dummy.rb

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