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();

In reply to Using Net::LDAP (Need help) by Anonymous Monk

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.