Browse Source

build insert and delete ldif files - still missing for mailAlias and mailAccount

master
Georg Hopp 15 years ago
committed by Georg Hopp
parent
commit
56b9c94ac1
  1. 68
      SystemDataBackendLdap.rb

68
SystemDataBackendLdap.rb

@ -37,7 +37,8 @@ class SystemDataBackendLdap
LDAP_OBJECTCLASS = { LDAP_OBJECTCLASS = {
:User => [ 'account', 'posixAccount', 'shadowAccount' ], :User => [ 'account', 'posixAccount', 'shadowAccount' ],
:Group => 'posixGroup'
:Group => 'posixGroup',
:Site => 'organization'
} }
LDAP_LAMBDA_USER = lambda do |entry| LDAP_LAMBDA_USER = lambda do |entry|
@ -92,9 +93,16 @@ class SystemDataBackendLdap
map = {} map = {}
map.merge!(LDAP_MAP[kind].invert) if LDAP_MAP[kind] map.merge!(LDAP_MAP[kind].invert) if LDAP_MAP[kind]
entry = Net::LDAP::Entry.new(data[:id])
odata = @ldapData[kind][:external].find{|edata| edata[:id] == data[:id]} odata = @ldapData[kind][:external].find{|edata| edata[:id] == data[:id]}
data.each do |key,value|
pat_key = map[key] ? map[key] : key
if odata[:id] =~ /(^|, *)#{pat_key.to_s}=([^, ]+)/ && $2 != value
return replace(kind, data)
end
end
entry = Net::LDAP::Entry.new(data[:id])
data = data.find_all{|key,value| value != odata[key]} data = data.find_all{|key,value| value != odata[key]}
data.delete(:id) data.delete(:id)
@ -105,17 +113,52 @@ class SystemDataBackendLdap
entry[key] = value entry[key] = value
end end
if not replace.empty?
if replace.empty?
puts 'INFO: no changes'
else
entry[:changetype] = 'modify' entry[:changetype] = 'modify'
entry[:replace] = replace entry[:replace] = replace
LDAP_LAMBDA[kind].call(entry) if LDAP_LAMBDA[kind] LDAP_LAMBDA[kind].call(entry) if LDAP_LAMBDA[kind]
puts entry.to_ldif puts entry.to_ldif
else
puts 'INFO: no changes'
end end
end end
def replace(kind, data)
puts 'INFO: do replace'
puts '----------------'
odata = @ldapData[kind][:external].find{|edata| edata[:id] == data[:id]}
delete(odata)
puts
insert(kind, data)
puts '----------------'
end
def delete(data)
entry = Net::LDAP::Entry.new(data[:id])
entry[:changetype] = 'delete'
puts entry.to_ldif
end
def insert(kind, data)
map = {}
map.merge!(LDAP_MAP[kind].invert) if LDAP_MAP[kind]
data.delete(:id)
entry = Net::LDAP::Entry.new(ldapDn(kind, data))
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)
@ -125,4 +168,17 @@ class SystemDataBackendLdap
end end
end end
def ldapDn(kind, data)
case(kind)
when :User
"uid=#{data[:name]},ou=user,#{ldapBase(kind)}"
when :Group
"cn=#{data[:name]},ou=group,#{ldapBase(kind)}"
when :Site
"o=#{data[:name]},#{ldapBase(kind)}"
else
"not yet implemented"
end
end
end end
Loading…
Cancel
Save