Update RDN with cn from uid

From Notes

Jump to: navigation, search
#!/usr/bin/perl

use strict ;
use Net::LDAP ;

my $server = "ldap://ldap.example.org:389" ;
my $userbase = "ou=People,dc=example,dc=org" ;
my $searchbase = "dc=example,dc=org" ;

my $bind_dn= "cn=Manager,dc=example,dc=org" ;
my $bind_pass = "<secret>" ;

my $ldap = Net::LDAP->new("$server") or die "$@";
my $mesg = $ldap->start_tls(
                           verify => 'require',
                           cafile => '/usr/share/ssl/certs/cacert.crt',
                           sslversion => 'tlsv1',
                           ciphers => 'HIGH:MEDIUM:+SSLv2:RSA'
                         );

$mesg = $ldap->bind($bind_dn,          
                        password => $bind_pass,
                        version => 3 );

# Error checking on bind
$mesg->code && warn "bind failed: ", $mesg->error ;

$mesg = $ldap->search(
                       base    => $searchbase, 
                       filter => "(objectclass=posixaccount)"
                       ) ;

# Error checking on search
$mesg->code && warn "search failed: ", $mesg->error ;

# Print number of results
my $count = $mesg->count ;
printf "Results: %d\n", $count ;

# Iterate through results
for ( my $i = 0 ; $i < $count ; $i++ ) {
  my $entry = $mesg->entry ( $i );
  my $dn = $entry->dn ;
  printf "DN: %s\n", $dn ;
       my @cn = $entry->get_value('cn', alloptions => 0) ;
        printf "CN: %s\n", $cn[0] ;

       $entry->changetype('modrdn') ;
       $entry->replace (
               newrdn => "cn=$cn[0]",
               deleteoldrdn => 0
       ) ;

       my $mod_mesg = $entry->update( $ldap ) ;
  
  # Error checking on modify
  $mod_mesg->code && warn "modify failed: ", $mesg->error ;

}

$mesg = $ldap->unbind() ;
$mesg->code && warn "failed to un-bind: ", $mesg->error ;

exit(0) ;

#vim ts=2