1 |
slords |
1.1 |
diff -up e-smith-ldap-5.2.0/root/etc/e-smith/events/actions/ldap-update.rename_old_record_fix 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_fix 2010-09-25 13:59:31.000000000 -0600 |
3 |
|
|
+++ e-smith-ldap-5.2.0/root/etc/e-smith/events/actions/ldap-update 2010-09-25 14:39:31.000000000 -0600 |
4 |
|
|
@@ -120,11 +120,14 @@ my $o = $l->prop('defaultCompany') || $d |
5 |
|
|
my %seen; |
6 |
|
|
my @objects = qw(top organization dcObject); |
7 |
|
|
my $result = $ldap->search( base => $base, filter => '(objectClass=*)', scope => 'base' ); |
8 |
|
|
-warn "failed checking base entry $base: ", $result->error if $result->code; |
9 |
|
|
-if ($result->count == 0) |
10 |
|
|
+if ($result->code == 32) |
11 |
|
|
{ |
12 |
|
|
$result = $ldap->add( $base, attr => [ dc => $dc, o => $o, objectClass => \@objects ] ); |
13 |
|
|
} |
14 |
|
|
+elsif ($result->code) |
15 |
|
|
+{ |
16 |
|
|
+ warn "failed checking base entry $base: ", $result->error; |
17 |
|
|
+} |
18 |
|
|
else |
19 |
|
|
{ |
20 |
|
|
# Don't overwrite objectClass (just update if necessary) |
21 |
|
|
@@ -132,18 +135,21 @@ else |
22 |
|
|
@objects = grep { ! $seen{$_} ++ } (@objects, $result->entry(0)->get_value('objectClass') ); |
23 |
|
|
$ldap->modify( $base, replace => { dc => $dc, o => $o, objectClass => \@objects } ); |
24 |
|
|
} |
25 |
|
|
-warn "failed(",$result->code,") to add/update entry $base: ", $result->error if $result->code; |
26 |
|
|
+warn "failed to add/update entry $base: ", $result->error if $result->code; |
27 |
|
|
|
28 |
|
|
# Try and find container records |
29 |
|
|
foreach my $obj ( qw(Users Groups Computers) ) |
30 |
|
|
{ |
31 |
|
|
@objects = qw(top organizationalUnit); |
32 |
|
|
- $result = $ldap->search( base => $base, filter => "(ou=$obj)" ); |
33 |
|
|
- warn "failed checking base entry ou=$obj,$base: ", $result->error if $result->code; |
34 |
|
|
- if ($result->count == 0) |
35 |
|
|
+ $result = $ldap->search( base => "ou=$obj,$base", filter => '(objectClass=*)', scope => 'base' ); |
36 |
|
|
+ if ($result->code == 32) |
37 |
|
|
{ |
38 |
|
|
$result = $ldap->add( "ou=$obj,$base", attr => [ ou => $obj, objectClass => \@objects ] ); |
39 |
|
|
} |
40 |
|
|
+ elsif ($result->code) |
41 |
|
|
+ { |
42 |
|
|
+ warn "failed checking base entry ou=$obj,$base: ", $result->error; |
43 |
|
|
+ } |
44 |
|
|
else |
45 |
|
|
{ |
46 |
|
|
# Don't overwrite objectClass (just update if necessary) |
47 |
|
|
@@ -266,42 +272,11 @@ endpwent(); |
48 |
|
|
#------------------------------------------------------------ |
49 |
|
|
foreach my $dn (keys %$updates) |
50 |
|
|
{ |
51 |
|
|
- # Try and find old record (sme7) |
52 |
|
|
- my ($oldfilter, undef, $oldsearchbase) = split /,/, $dn, 3; |
53 |
|
|
- my $oldresult = $ldap->search( base => $oldsearchbase, filter => "($oldfilter)", scope => 'one' ); |
54 |
|
|
- if ( $result->code ) |
55 |
|
|
- { |
56 |
|
|
- warn "failed looking up old entry $oldfilter,$oldsearchbase: ", $result->error; |
57 |
|
|
- next; |
58 |
|
|
- } |
59 |
|
|
- |
60 |
|
|
# Try and find record |
61 |
|
|
- my ($filter, $searchbase) = split /,/, $dn, 2; |
62 |
|
|
- $result = $ldap->search( base => $searchbase, filter => "($filter)" ); |
63 |
|
|
- if ( $result->code ) |
64 |
|
|
- { |
65 |
|
|
- warn "failed looking up entry $dn: ", $result->error; |
66 |
|
|
- next; |
67 |
|
|
- } |
68 |
|
|
- my $cnt = $result->count; |
69 |
|
|
- my @objectClass = $cnt == 0 ? () : $result->entry(0)->get_value('objectClass'); |
70 |
|
|
- |
71 |
|
|
- # If we have an old record either rename it or remove it |
72 |
|
|
- if ( $oldresult->count == 1) |
73 |
|
|
- { |
74 |
|
|
- if ( $cnt == 0 ) |
75 |
|
|
- { |
76 |
|
|
- $result = $ldap->moddn( "$oldfilter,$oldsearchbase", newrdn => $filter, newsuperior => $searchbase, deleteoldrdn => 1 ); |
77 |
|
|
- warn "failed to rename old entry $oldfilter,$oldsearchbase: ", $result->error if $result->code; |
78 |
|
|
- $cnt = $oldresult->count; |
79 |
|
|
- @objectClass = $oldresult->entry(0)->get_value('objectClass'); |
80 |
|
|
- } |
81 |
|
|
- else |
82 |
|
|
- { |
83 |
|
|
- $result = $ldap->delete( "$oldfilter,$oldsearchbase" ); |
84 |
|
|
- warn "failed to remove old entry $oldfilter,$oldsearchbase: ", $result->error if $result->code; |
85 |
|
|
- } |
86 |
|
|
- } |
87 |
|
|
+ $result = $ldap->search( base => $dn, filter => '(objectClass=*)', scope => 'base' ); |
88 |
|
|
+ warn "failed looking up entry $dn: ", $result->error if $result->code && $result->code != 32; |
89 |
|
|
+ my $code = $result->code; |
90 |
|
|
+ my @objectClass = $code == 32 ? () : $result->entry(0)->get_value('objectClass'); |
91 |
|
|
|
92 |
|
|
# Clean up attributes and convert to utf8 |
93 |
|
|
delete $updates->{$dn}->{'junk'}; |
94 |
|
|
@@ -309,7 +284,7 @@ foreach my $dn (keys %$updates) |
95 |
|
|
{ |
96 |
|
|
if ( ref($updates->{$dn}->{$attr}) eq 'ARRAY' ) |
97 |
|
|
{ |
98 |
|
|
- if ( $cnt == 0 and scalar(@{$updates->{$dn}->{$attr}}) == 0 ) |
99 |
|
|
+ if ( $code == 32 and scalar(@{$updates->{$dn}->{$attr}}) == 0 ) |
100 |
|
|
{ |
101 |
|
|
delete $updates->{$dn}->{$attr}; |
102 |
|
|
} |
103 |
|
|
@@ -327,7 +302,7 @@ foreach my $dn (keys %$updates) |
104 |
|
|
{ |
105 |
|
|
utf8::upgrade($updates->{$dn}->{$attr}); |
106 |
|
|
} |
107 |
|
|
- elsif ( $cnt == 0 ) |
108 |
|
|
+ elsif ( $code == 32 ) |
109 |
|
|
{ |
110 |
|
|
delete $updates->{$dn}->{$attr}; |
111 |
|
|
} |
112 |
|
|
@@ -338,25 +313,45 @@ foreach my $dn (keys %$updates) |
113 |
|
|
} |
114 |
|
|
} |
115 |
|
|
|
116 |
|
|
+ # Try and find old record (sme7) |
117 |
|
|
+ my ($oldfilter, undef, $oldsearchbase) = split /,/, $dn, 3; |
118 |
|
|
+ my $oldresult = $ldap->search( base => "$oldfilter,$oldsearchbase", filter => '(objectClass=*)', scope => 'base' ); |
119 |
|
|
+ if ($oldresult->code) |
120 |
|
|
+ { |
121 |
|
|
+ warn "failed looking up old entry $oldfilter,$oldsearchbase: ", $result->error if $oldresult->code != 32; |
122 |
|
|
+ } |
123 |
|
|
+ else |
124 |
|
|
+ { |
125 |
|
|
+ if ($code == 32) |
126 |
|
|
+ { |
127 |
|
|
+ my ($newdn, $newbase) = split /,/, $dn, 2; |
128 |
|
|
+ $result = $ldap->moddn( "$oldfilter,$oldsearchbase", newrdn => $newdn, newsuperior => $newbase, deleteoldrdn => 1 ); |
129 |
|
|
+ warn "failed to rename old entry $oldfilter,$oldsearchbase: ", $result->error if $result->code; |
130 |
|
|
+ $code = $oldresult->code; |
131 |
|
|
+ @objectClass = $oldresult->entry(0)->get_value('objectClass'); |
132 |
|
|
+ } |
133 |
|
|
+ else |
134 |
|
|
+ { |
135 |
|
|
+ $result = $ldap->delete( "$oldfilter,$oldsearchbase" ); |
136 |
|
|
+ warn "failed to remove old entry $oldfilter,$oldsearchbase: ", $result->error if $result->code; |
137 |
|
|
+ } |
138 |
|
|
+ } |
139 |
|
|
+ |
140 |
|
|
# Perform insert or update |
141 |
|
|
- if ( $cnt == 0 ) |
142 |
|
|
+ if ( $code == 32 ) |
143 |
|
|
{ |
144 |
|
|
$result = $ldap->add( $dn, attrs => [ %{$updates->{$dn}} ] ); |
145 |
|
|
$result->code && warn "failed to add entry $dn: ", $result->error; |
146 |
|
|
} |
147 |
|
|
- elsif ( $cnt == 1 ) |
148 |
|
|
+ else |
149 |
|
|
{ |
150 |
|
|
- # Don't overwrite objectClass (just update if necessary) |
151 |
|
|
- %seen = (); |
152 |
|
|
+ # Don't overwrite objectClass (just remove person if existing) |
153 |
|
|
+ %seen = ( person => 1 ); |
154 |
|
|
@{$updates->{$dn}->{objectClass}} = grep { ! $seen{$_} ++ } (@{$updates->{$dn}->{objectClass}}, @objectClass ); |
155 |
|
|
|
156 |
|
|
$result = $ldap->modify( $dn, replace => $updates->{$dn}); |
157 |
|
|
$result->code && warn "failed to modify entry $dn: ", $result->error; |
158 |
|
|
} |
159 |
|
|
- else |
160 |
|
|
- { |
161 |
|
|
- warn "failed looking up entry $dn: found $cnt results"; |
162 |
|
|
- } |
163 |
|
|
} |
164 |
|
|
$ldap->unbind; |
165 |
|
|
|