Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

Hello all. I am not Perl programmer, but i need script to change user DN and any attributes that contains username, written on perl of course. I have tried something, but it doesn't work, without any errors.
use Net::LDAP; use MIME::Base64; use Sys::Hostname; my $username = @ARGV[0]; my $destination = @ARGV[1]; my $ldap; my $basedn = "dc=example,dc=com"; my $adminbinddn = "cn=admin,$basedn"; my $bindpass = "admin_pass"; my $ldap_server = "somehost.example.com"; my $dn_users = "ou=users,$base_dn"; my $dn_groups = "ou=groups,$base_dn"; my $dn_domains = "ou=domains,$base_dn"; my $scope = "subtree"; $ldap = Net::LDAP->new($ldap_server); $ldap->bind( $adminbinddn, password=> $bindpass, version=> 2); sub handle_operation_result { my $subroutine_name = $_[0]; my $result = $_[1]; if ($result->code) { print "\nReturn code: ", $result->code; print "\n\tMessage: ", $result->error_name; print " :", $result->error_text; print "\nMessageID: ", $result->mesg_id; print "\n\t DN: ", $result->dn; } else { print "OK: " . $subroutine_name . "\n"; } } sub slug_wc_name { my $curr_server_name = substr(hostname,0, index(hostname, '.')); my $cpanel_num = $curr_server_name =~ /(\d+)/; if (index($curr_server_name, "test") != -1) { return "wc1"; } elsif (index($curr_server_name, "cpanel") != -1) { return "cp" . $cpanel_num; } elsif (index($curr_server_name, "webcloud") != -1) { return "wc" . $cpanel_num; } elsif (index($curr_server_name, "rsl") != -1) { return "rsl-cp" . $cpanel_num; } else { printf "Unknown cpanel name\n"; exit 1; } } sub ldap_search { my ($base, $scope, $filter) = @_; my $result = $ldap -> search ( base => "$base", scope => "$scope", filter => "$filter", ); return $result; } sub get_user_entry { my $filter = "cn=$_[0]"; my $result = ldap_search("$dn_users", "$scope", "$filter"); if ($result->count == 1) { my @entries = $result->entries; return @entries[0]; } else { printf "User entry not found with filter: $filter\n"; } } sub get_groups_entry { my $filter = "cn=$_[0]"; my $result = ldap_search("$dn_groups", "$scope", "$filter"); if ($result->count == 1) { my @entries = $result->entries; return @entries[0]; } else { printf "Group entry not found with filter: $filter\n"; } } sub get_domains_entries { my $filter = "domainAdmin=$_[0]"; my $result = ldap_search("$dn_domains", "$scope", "$filter"); if ($result->count > 0) { my @entries = $result->entries; return @entries; } else { printf "Domain entry not found with filter: $filter\n"; } } sub get_email_accounts_entries { my $domain = $_[0]; my $filter = "(&(domainName=$domain)(objectClass=mailUser))"; my $result = ldap_search("$dn_domains", "$scope", "$filter"); if ($result->count > 0) { my @entries = $result->entries; return @entries; } else { printf "Email accounts not found for: $domain\n"; printf "Using filter: $filter\n"; } } sub get_source_username { my $current_wc = slug_wc_name(); return "$current_wc-$username"; } sub get_dest_username { return "$destination-$username"; } sub change_user_rdn { my $entry = $_[0]; my $new_username = get_dest_username(); my $new_userdn = "cn=" . $new_username . "," . $dn_users, my $result = $ldap->moddn ( $entry->dn, newrdn => $new_userdn, deleteoldrdn => '1'); handle_operation_result("change_user_rdn", $result); } sub change_group_rdn { my $entry = $_[0]; my $new_username = get_dest_username(); my $new_userdn = "cn=" . $new_username . "," . $dn_groups, my $result = $ldap->moddn ( $entry->dn, newrdn => $new_userdn, deleteoldrdn => '1'); handle_operation_result("change_group_rdn", $result); } sub update_group_entry { my $new_username = get_dest_username(); my $curr_username = get_source_username(); my $entry = get_group_entry($curr_username); my $result = $ldap->modify( $entry->dn, changes => [ replace => [ "cn", "$new_username", "memberUid", "$new_username", ] ] ); handle_operation_result("update_group_entry", $result); change_group_rdn($entry); } sub update_domain_entry { my $new_username = get_dest_username(); my $entry = $_[0]; my $result = $ldap->modify( $entry->dn, changes => [ replace => [ "domainAdmin", $new_username ] ] ); handle_operation_result("update_domain_entry", $result); } sub update_domains_entries { my $curr_username = get_source_username(); my $new_username = get_dest_username(); my @domains = get_domains_entries($curr_username); foreach my $domain (@domains) { update_domain_entry($domain); } } sub update_user_entry { my $new_username = get_dest_username(); my $curr_username = get_source_username(); my $entry = get_user_entry($curr_username); my $current_home_dir = $entry->get_value(homeDirectory); my $new_home_dir = $current_home_dir =~ s/$current_username/$new_use +rname/ig; my $result = $ldap->modify( $entry->dn, changes => [ replace => [ "cn", "$new_username", "uid", "$new_username", "homeDirectory", "$new_homedir" ] ] ); handle_operation_result("update_user_entry", $result); change_user_rdn($entry); #update_home_dir_path($entry->get_value(homeDirectory), $new_home_di +r); } sub update_email_entry { my $entry = $_[0]; my $new_username = get_dest_username(); my $current_home_dir = $entry->get_value(homeDirectory); my $new_home_dir = $current_home_dir =~ s/$current_username/$new_use +rname/ig; my $result = $ldap->modify( $entry->dn, changes => [ replace => [ "homeDirectory", "$new_home_dir", ] ] ); handle_operation_result("update_email_entry", $result); } sub update_email_entries { my $domain = $_[0]; my @entries = get_email_accounts_entries($domain); for my $entry (@entries) { update_email_entry($entry); } } sub migrate_user { my @user_domains = get_domains_entries(get_source_username()); update_user_entry(); update_domains_entries(); update_group_entry(); foreach my $domain (@user_domains) { update_email_entries($domain); } } migrate_user();

Replies are listed 'Best First'.
Re: Using Net::LDAP (Need help)
by roboticus (Chancellor) on Aug 22, 2014 at 12:17 UTC

    Your code doesn't do proper error checking (you'll want to read the Net::LDAP documentation). You should probably also put in some print statements to show what's being returned at various places in your code. Since the example program is trying to connect to example.com, I'd guess that you're not properly connecting to your LDAP server.

    ...roboticus

    When your only tool is a hammer, all problems look like your thumb.

      ldap connection is working perfectly. example.com and other fields was replaced. Search works perfectly on all things. I found place of error in change_user_rdn.

       LDAP_INVALID_DN_SYNTAX :The request contained an invalid DN
      Fixed. Everything is working fine for now.