1 |
slords |
1.1 |
diff -up e-smith-ldap-5.2.0/root/etc/e-smith/events/actions/ldap-update.rename_old_record e-smith-ldap-5.2.0/root/etc/e-smith/events/actions/ldap-update |
2 |
|
|
--- e-smith-ldap-5.2.0/root/etc/e-smith/events/actions/ldap-update.rename_old_record 2010-09-25 12:20:02.000000000 -0600 |
3 |
|
|
+++ e-smith-ldap-5.2.0/root/etc/e-smith/events/actions/ldap-update 2010-09-25 12:19:15.000000000 -0600 |
4 |
|
|
@@ -260,15 +260,42 @@ endpwent(); |
5 |
|
|
#------------------------------------------------------------ |
6 |
|
|
foreach my $dn (keys %$updates) |
7 |
|
|
{ |
8 |
|
|
+ # Try and find old record (sme7) |
9 |
|
|
+ my ($oldfilter, undef, $oldsearchbase) = split /,/, $dn, 3; |
10 |
|
|
+ my $oldresult = $ldap->search( base => $oldsearchbase, filter => "($oldfilter)", scope => 'one' ); |
11 |
|
|
+ if ( $result->code ) |
12 |
|
|
+ { |
13 |
|
|
+ warn "failed looking up old entry $oldfilter,$oldsearchbase: ", $result->error; |
14 |
|
|
+ next; |
15 |
|
|
+ } |
16 |
|
|
+ |
17 |
|
|
# Try and find record |
18 |
|
|
my ($filter, $searchbase) = split /,/, $dn, 2; |
19 |
|
|
- my $result = $ldap->search( base => $searchbase, filter => "($filter)" ); |
20 |
|
|
+ $result = $ldap->search( base => $searchbase, filter => "($filter)" ); |
21 |
|
|
if ( $result->code ) |
22 |
|
|
{ |
23 |
|
|
warn "failed looking up entry $dn: ", $result->error; |
24 |
|
|
next; |
25 |
|
|
} |
26 |
|
|
my $cnt = $result->count; |
27 |
|
|
+ my @objectClass = $cnt == 0 ? () : $result->entry(0)->get_value('objectClass'); |
28 |
|
|
+ |
29 |
|
|
+ # If we have an old record either rename it or remove it |
30 |
|
|
+ if ( $oldresult->count == 1) |
31 |
|
|
+ { |
32 |
|
|
+ if ( $cnt == 0 ) |
33 |
|
|
+ { |
34 |
|
|
+ $result = $ldap->moddn( "$oldfilter,$oldsearchbase", newrdn => $filter, newsuperior => $searchbase, deleteoldrdn => 1 ); |
35 |
|
|
+ warn "failed to rename old entry $oldfilter,$oldsearchbase: ", $result->error if $result->code; |
36 |
|
|
+ $cnt = $oldresult->count; |
37 |
|
|
+ @objectClass = $oldresult->entry(0)->get_value('objectClass'); |
38 |
|
|
+ } |
39 |
|
|
+ else |
40 |
|
|
+ { |
41 |
|
|
+ $result = $ldap->delete( "$oldfilter,$oldsearchbase" ); |
42 |
|
|
+ warn "failed to remove old entry $oldfilter,$oldsearchbase: ", $result->error if $result->code; |
43 |
|
|
+ } |
44 |
|
|
+ } |
45 |
|
|
|
46 |
|
|
# Clean up attributes and convert to utf8 |
47 |
|
|
delete $updates->{$dn}->{'junk'}; |
48 |
|
|
@@ -313,6 +340,10 @@ foreach my $dn (keys %$updates) |
49 |
|
|
} |
50 |
|
|
elsif ( $cnt == 1 ) |
51 |
|
|
{ |
52 |
|
|
+ # Don't overwrite objectClass (just update if necessary) |
53 |
|
|
+ %seen = (); |
54 |
|
|
+ @{$updates->{$dn}->{objectClass}} = grep { ! $seen{$_} ++ } (@{$updates->{$dn}->{objectClass}}, @objectClass ); |
55 |
|
|
+ |
56 |
|
|
$result = $ldap->modify( $dn, replace => $updates->{$dn}); |
57 |
|
|
$result->code && warn "failed to modify entry $dn: ", $result->error; |
58 |
|
|
} |