diff --git a/contrib/bin/fusiondirectory-setup b/contrib/bin/fusiondirectory-setup index c214dd00d1585992a0d05b3bfba9d8e0e9965668..22171fcc615bf7abf0a660cb09a4ac4dbc85afa8 100644 --- a/contrib/bin/fusiondirectory-setup +++ b/contrib/bin/fusiondirectory-setup @@ -1637,6 +1637,72 @@ sub migrate_phones { $unbind->code && warn "! Unable to unbind from LDAP server: ", $unbind->error."\n"; } +# function that migrates interfaces from FD<1.4 to FD>=1.4 +sub migrate_interfaces { + # initiate the LDAP connexion + my %hash_ldap_param = get_ldap_connexion(); + + # LDAP's connection's parameters + my $base = $hash_ldap_param{base}; + my $ldap = $hash_ldap_param{ldap}; + + my $interface_cn = ask_user_input ("Please enter the name for interfaces created by this migration", "eth0"); + + my @systemOCs = ('fdWorkstation', 'fdServer', 'fdTerminal', 'fdPrinter', 'fdPhone', 'fdMobilePhone', 'device'); + foreach my $i (0 .. $#systemOCs) { + my $systemOC = $systemOCs[$i]; + + my $mesg = $ldap->search( + filter => "(&(objectClass=$systemOC)(|(ipHostNumber=*)(macAddress=*)))", + base => $base + ); + $mesg->code && die $mesg->error; + + my @entries = $mesg->entries; + + foreach my $entry (@entries) { + my $mesg2 = $ldap->search( + filter => "(objectClass=fdNetworkInterface)", + base => $entry->dn, + scope => "one" + ); + $mesg2->code && die $mesg2->error; + if ($mesg2->count == 0) { + print $entry->dn." is missing interfaces nodes\n"; + my @macs = $entry->get_value('macAddress'); + my @ips = $entry->get_value('ipHostNumber'); + if (scalar(@macs) > 1) { + print "Cannot migrate ".$entry->dn." as it has more than one MAC address: ".join(',', @macs)."\n"; + next; + } + if (ask_yn_question("Add an interface node with MAC ".join(',', @macs)." and IP ".join(',', @ips))) { + my %interface = ( + 'cn' => $interface_cn, + 'objectClass' => 'fdNetworkInterface', + ); + + if (scalar(@macs) > 0) { + $interface{'macAddress'} = \@macs; + } + + if (scalar(@ips) > 0) { + $interface{'ipHostNumber'} = \@ips; + } + + my @options = %interface; + my $interface_add = $ldap->add( "cn=$interface_cn,".$entry->dn, attr => \@options ); + + $interface_add->code && die "! failed to add interface: ".$interface_add->error."\n"; + } + } + } + } + + # unbind to the LDAP server + my $unbind = $ldap->unbind; + $unbind->code && warn "! Unable to unbind from LDAP server: ", $unbind->error."\n"; +} + # function that removes SupAnn root information from FD<1.4 sub remove_supann_root { # initiate the LDAP connexion @@ -1926,6 +1992,7 @@ die ("! You have to run this script as root\n") if ($<!=0); $commands{"--migrate-systems"} = ["Migrating your systems from FD < 1.1", \&migrate_systems, 1]; $commands{"--migrate-winstations"} = ["Migrating your winstations from FD < 1.1", \&migrate_winstations, 1]; $commands{"--migrate-dhcp"} = ["Migrating DHCP configurations for FD >= 1.0.17",\&migrate_dhcp, 1]; + $commands{"--migrate-interfaces"} = ["Migrating your systems from FD < 1.4", \&migrate_interfaces, 1]; $commands{"--remove-supann-root"} = ["Remove SupAnn root establishment from FD < 1.4",\&remove_supann_root, 1]; $commands{"--delete-gosa-locks"} = ["Delete lock tokens using old gosaLockEntry class", \&delete_gosa_locks]; $commands{"--install-plugins"} = ["Installing FusionDirectory's plugins", \&install_plugins]; @@ -2043,6 +2110,10 @@ This option replace old winstations objectClasses by new objectClasses from FD 1 This option moves DHCP configurations from systems branch to DHCP branch, which is necessary for FusionDirectory 1.0.17 and above. +=item --migrate-interfaces + +This option creates interfaces objects for old systems from FD < 1.4. + =item --delete-gosa-locks This option will delete old GOsa style lock tokens from 1.0.15 or older