Hello All,
May I just start by saying thank heavens this the LDAP bundle exists!!!
It holds the promise of greatly simplifying a lot of my directory
administration. That said, I don't appear to fully understand the
Net::LDAP update() method's calling convention.
I have an LDIF file which contains many changes that need to be
performed on an LDAP server. I have successfully created an $ldap
object for the server and have been able to bind() to the server with
no problems. I have also created an $ldif object which opens my LDIF
in read-only mode.
Seriously, I have looked at result codes for every call up to this
point and even examined the objects returned in ptkdb and I know I'm
bound to the server and read_entry() is returning good Entry objects
from the LDIF. So...operating on those assumptions...
The following code attempts to loop through the $ldif file, getting one
Entry at a time and performing the changes contained in that Entry
object on the $ldap server. Here was my first stab:
while (my $entry = $ldif->read_entry())
{
$mesg = $ldap->modify($entry); ## THE ACTION LINE
$mesg->code && die $mesg->error;
}
I figured, the modify() method is getting the DN from the $entry
object, so it's probably getting the changes from there, too, right?
Uhhh, I figured wrong. It reports:
no modifications specified at ./ldap.pl line 27, <GEN1> line 2.
So I think, okay, well I'll just use the changes contained in
$entry->changes as an argument in OPTIONS. So I substitute this for
the "action line" above:
$mesg = $ldap->modify($entry, changes => $entry->changes);
No DN specified at ./ldap.pl line 27, <GEN1> line 2.
Oops. That didn't work. Looking closer at what OPTIONS expects in the
'changes =>' part, I see that it's actually expecting a hash, and
$entry->changes returns an array that's close but not quite right. So
I try this:
while (my $entry = $ldif->read_entry())
{
my %changes = $entry->changes; # convert the array to a hash
$mesg = $ldap->modify($entry, changes => \%changes); ## THE ACTION
LINE
$mesg->code && die $mesg->error;
}
Not an ARRAY reference at /usr/local/.../LDAP.pm line 475, <GEN1> line
2.
Okay, so I admit, I'm a little confounded at this point. I thought
surely since the changes were all encoded in the $entry, I would be
able to leverage that either in $modify or even maybe by
$entry->update() but no luck. Can someone help me figure this out?
I am smart enough to write a loop to look at every change and execute
it separately if I have to, but I can't help feeling that Graham's code
offers a more elegant solution.
Thank you to anyone who responds.