diff --git a/Site.rb b/Site.rb index 313166a..133ccbe 100644 --- a/Site.rb +++ b/Site.rb @@ -1,9 +1,11 @@ require 'SystemData' class Site < SystemData - attr_accessor :name, :mailAccounts, :mailAliases + attr_accessor :name def initialize(args = {}) + super(args) + @name = args[:name] end end diff --git a/SystemDataBackendLdap.rb b/SystemDataBackendLdap.rb index dc906f0..5fcca2e 100644 --- a/SystemDataBackendLdap.rb +++ b/SystemDataBackendLdap.rb @@ -43,8 +43,7 @@ class SystemDataBackendLdap 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' + entry[:replace] += ['shadowreplace'] if entry[:replace] end LDAP_LAMBDA = { @@ -64,7 +63,9 @@ class SystemDataBackendLdap end def load!(kind) - @ldapData[kind] = @ldap.search( + @ldapData[kind] = Hash.new if ! @ldapData[kind] + + @ldapData[kind][:internal] = @ldap.search( :base => ldapBase(kind), :filter => LDAP_FILTER[kind] ) @@ -73,7 +74,7 @@ class SystemDataBackendLdap def load(kind) load!(kind) if ! @ldapData[kind] - @ldapData[kind].each do |data| + @ldapData[kind][:external] = @ldapData[kind][:internal].map do |data| map = { :dn => :id } map.merge!(LDAP_MAP[kind]) if LDAP_MAP[kind] @@ -81,9 +82,10 @@ class SystemDataBackendLdap data.each do |key,value| ydata.merge!({ map[key] || key => value.size==1?value[0]:value.to_a }) end + ydata + end if ! @ldapData[kind][:external] - yield ydata - end + @ldapData[kind][:external].each{|ydata| yield ydata} end def update(kind, data) @@ -91,19 +93,27 @@ class SystemDataBackendLdap 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] + odata = @ldapData[kind][:external].find{|edata| edata[:id] == data[:id]} + data = data.find_all{|key,value| value != odata[key]} + data.delete(:id) + replace = Array.new data.each do |key,value| key = map[key] if map[key] + replace.push(key.to_s) entry[key] = value end - - LDAP_LAMBDA[kind].call(entry) if LDAP_LAMBDA[kind] - puts entry.to_ldif + if not replace.empty? + entry[:changetype] = 'modify' + entry[:replace] = replace + LDAP_LAMBDA[kind].call(entry) if LDAP_LAMBDA[kind] + + puts entry.to_ldif + else + puts 'INFO: no changes' + end end private diff --git a/User.rb b/User.rb index 68bb781..6f55ccd 100644 --- a/User.rb +++ b/User.rb @@ -6,11 +6,13 @@ class User < SystemData def initialize(args = {}) super(args) - @name = args[:name] - @pass = args[:pass] - @uid = args[:uid] - @gid = args[:gid] - @shell = args[:shell] - @home = args[:home] + @name = args[:name] + @pass = args[:pass] + @uid = args[:uid] + @gid = args[:gid] + @shell = args[:shell] + @home = args[:home] + @shadowmax = args[:shadowmax] + @shadowwarning = args[:shadowwarning] end end diff --git a/test_dummy.rb b/test_dummy.rb index 2a0e348..d69dfd2 100644 --- a/test_dummy.rb +++ b/test_dummy.rb @@ -46,8 +46,30 @@ end puts -backend.userByName('georg').save +georg = backend.userByName('georg') +georg.save puts -backend.groupByName('wheel').save +georg.uid = 1001 +georg.save + +puts + +wheel = backend.groupByName('wheel') +wheel.save + +puts + +wheel.gid = 100 +wheel.save + +puts + +site = backend.siteByName('kommandozeilenchef.de') +site.save + +puts + +site.name = 'wumbaba.de' +site.save