diff --git a/contrib/bin/fusiondirectory-setup b/contrib/bin/fusiondirectory-setup index be69a56d0e7fa3199422abaef23534a0b0883ae2..c6b017ca11112ac61be1d8f1e3f00242858aa2e8 100644 --- a/contrib/bin/fusiondirectory-setup +++ b/contrib/bin/fusiondirectory-setup @@ -85,10 +85,14 @@ my $yes_flag = 0; my %classes_hash_result = (); my %i18n_hash_result = (); -my $oupeople = "people"; -my $peopleou = "ou=$oupeople"; -my $ouroles = "aclroles"; -my $rolesou = "ou=$ouroles"; +#~ my $oupeople = "people"; +#~ my $peopleou = "ou=$oupeople"; +#~ my $ouroles = "aclroles"; +#~ my $rolesou = "ou=$ouroles"; +my $configrdn = "cn=config,ou=fusiondirectory"; +my $userrdn = "ou=people"; +my $aclrolerdn = "ou=aclroles"; +my $grouprdn = "ou=groups"; ################################################################################################################################################# @@ -160,7 +164,7 @@ sub die_on_ldap_errors my ($cn,$dn,$mesg); do { $cn = $prefix.'-'.$indice; - $dn = "cn=$cn,$rolesou,$base"; + $dn = "cn=$cn,$aclrolerdn,$base"; $indice++; $mesg = $ldap->search( base => "$dn", @@ -181,11 +185,11 @@ sub create_role { 'gosaAclTemplate' => "0:$acl" ); - if (!branch_exists($ldap, "$rolesou,$base")) { - create_branch($ldap, $base, $ouroles); + if (!branch_exists($ldap, "$aclrolerdn,$base")) { + create_branch($ldap, $base, $aclrolerdn); } - my $role_dn = "cn=$cn,$rolesou,$base"; + my $role_dn = "cn=$cn,$aclrolerdn,$base"; # Add the administator role object my @options = %role; my $role_add = $ldap->add( $role_dn, attr => \@options ); @@ -662,7 +666,7 @@ sub add_ldap_admin { print "Error : invalid account primary attribute $attr, using uid\n"; $attr = 'uid'; } - $dn = "$attr=".$obj{$attr}.",$peopleou,$base"; + $dn = "$attr=".$obj{$attr}.",$userrdn,$base"; # Add the administator user object my @options = %obj; @@ -925,14 +929,16 @@ sub check_admin { sub create_branch { my ($ldap, $base, $ou) = @_; - my $branch_add = $ldap->add( "ou=$ou,$base", + $ou =~ m/^ou=([^,]*),?$/ or die "Can’t create branch of unknown type $ou\n"; + print "$1\n"; + my $branch_add = $ldap->add( "$ou,$base", attr => [ - 'ou' => $ou, + 'ou' => $1, 'objectClass' => 'organizationalUnit' ] ); - $branch_add->code && die "! failed to add LDAP's ou=$ou,$base branch: ".$branch_add->error."\n"; + $branch_add->code && die "! failed to add LDAP's $ou,$base branch: ".$branch_add->error."\n"; } sub branch_exists { @@ -962,36 +968,36 @@ sub check_ldap { my $admin_add = ""; # Collect existing people branches (even if main one may not exists); - my $people = $ldap->search (base => $base, filter => $peopleou); + my $people = $ldap->search (base => $base, filter => $userrdn); $people->code && die $people->error; my @people_entries = $people->entries; @people_entries = map {$_->dn} @people_entries; - # if ou=people exists - if ( branch_exists($ldap, "$peopleou,$base") ) { + # if people branch exists + if ( branch_exists($ldap, "$userrdn,$base") ) { check_admin($base, $ldap, \@people_entries); # if ou=people doesn't exists } else { - print ( "! $peopleou,$base not found in your LDAP directory\n" ); + print ( "! $userrdn,$base not found in your LDAP directory\n" ); # if user's answer is "yes", creating ou=people branch if ( ask_yn_question("Do you want to create it ?: ") ) { - create_branch($ldap, $base, $oupeople); - push @people_entries, "$peopleou,$base"; + create_branch($ldap, $base, $userrdn); + push @people_entries, "$userrdn,$base"; check_admin($base, $ldap, \@people_entries); } else { print ("Skipping...\n"); } } - # if ou=groups does not exist - if (!branch_exists($ldap, "ou=groups,$base")) { - print ("! ou=groups,$base not found in your LDAP directory\n"); + # if groups branch does not exist + if (!branch_exists($ldap, "$grouprdn,$base")) { + print ("! $grouprdn,$base not found in your LDAP directory\n"); - # if user's answer is "yes", creating ou=groups branch + # if user's answer is "yes", creating groups branch if ( ask_yn_question("Do you want to create it ?: ") ) { - create_branch($ldap, $base, 'groups'); + create_branch($ldap, $base, $grouprdn); } else { print ("Skipping...\n"); } @@ -1020,7 +1026,7 @@ sub check_ldap { if ( ask_yn_question("Do you want to move and rename this entry? ") ) { if (!branch_exists($ldap, "ou=fusiondirectory,$base")) { - create_branch($ldap, $base, 'fusiondirectory'); + create_branch($ldap, $base, 'ou=fusiondirectory'); } my $result = $ldap->moddn ( "cn=fusiondirectory,ou=configs,$base", @@ -1118,8 +1124,6 @@ sub install_plugins { # function that add object classes to people branch users sub migrate_users { - my $scope="one"; - # initiate the LDAP connexion my %hash_ldap_param = get_ldap_connexion(); @@ -1127,24 +1131,60 @@ sub migrate_users { my $base = $hash_ldap_param{base}; my $ldap = $hash_ldap_param{ldap}; - print ("Add FusionDirectory attributes for the following users from $peopleou,$base\n"); - print ("---------------------------------------------\n"); - my $mesg = $ldap->search( - filter => "(|(!(objectClass~=inetOrgPerson))(!(objectClass~=organizationalPerson))(!(objectClass~=Person)))", - base => "$peopleou,$base", - scope => $scope + filter => '(&'. + '(|'. + '(objectClass=posixAccount)'. + '(objectClass=person)'. + '(objectClass=OpenLDAPperson)'. + ')'. + '(!(objectClass=inetOrgPerson))'. + '(uid=*)'. + ')', + base => $base ); $mesg->code && die $mesg->error; - my @entries = $mesg->entries; - - foreach my $entry (@entries) { - $mesg = $ldap->modify($entry->dn(), add => { "ObjectClass" => "inetOrgPerson"}); - $mesg = $ldap->modify($entry->dn(), add => { "ObjectClass" => "organizationalPerson"}); - $mesg = $ldap->modify($entry->dn(), add => { "ObjectClass" => "Person"}); - print $entry->dn(); - print "\n"; + + if ($mesg->count > 0) { + print ("The following users are missing objectClasses:\n"); + + my @entries = $mesg->entries; + + foreach my $entry (@entries) { + print $entry->dn()."\n"; + } + + if (ask_yn_question("Add the inetOrgPerson objectClass to all these entries?")) { + foreach my $entry (@entries) { + $mesg = $ldap->modify($entry->dn(), add => { "objectClass" => ["person","organizationalPerson","inetOrgPerson"]}); + $mesg->code && print $mesg->error; + } + } } + + $mesg = $ldap->search( + filter => '(objectClass=gosaAccount)', + base => $base + ); + $mesg->code && die $mesg->error; + + if ($mesg->count > 0) { + print ("The following users are using the obsolete gosaAccount objectClass:\n"); + + my @entries = $mesg->entries; + + foreach my $entry (@entries) { + print $entry->dn()."\n"; + } + + if (ask_yn_question("Remove the gosaAccount objectClass from these entries?")) { + foreach my $entry (@entries) { + $mesg = $ldap->modify($entry->dn(), delete => { "objectClass" => "gosaAccount" }); + $mesg->code && print $mesg->error; + } + } + } + # unbind to the LDAP server my $unbind = $ldap->unbind; $unbind->code && warn "! Unable to unbind from LDAP server: ", $unbind->error."\n"; @@ -1424,6 +1464,31 @@ sub ldif_deprecated { } } +# Read FD config in the LDAP +sub read_ldap_config { + # 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 $mesg = $ldap->search (base => "$configrdn,$base", filter => '(objectClass=fusionDirectoryConf)', scope => 'base'); + $mesg->code && die $mesg->error; + + if ($mesg->count > 0) { + if (($mesg->entries)[0]->exists('fdUserRDN')) { + $userrdn = ($mesg->entries)[0]->get_value('fdUserRDN'); + } + if (($mesg->entries)[0]->exists('fdGroupRDN')) { + $grouprdn = ($mesg->entries)[0]->get_value('fdGroupRDN'); + } + if (($mesg->entries)[0]->exists('fdAclRoleRDN')) { + $aclrolerdn = ($mesg->entries)[0]->get_value('fdAclRoleRDN'); + } + } +} + sub show_version { my $variables_common_path = "$vars{fd_home}/include/variables_common.inc"; if (-e $variables_common_path) { @@ -1493,6 +1558,8 @@ die ("! You have to run this script as root\n") if ($<!=0); set_vars(); + read_ldap_config(); + foreach my $arg ( @ARGV ) { if (( lc($arg) =~ m/^--set-(.*)=(.*)/ ) && (grep {$_ eq lc($1)} @vars_keys)) { $vars{lc($1)} = $2; diff --git a/setup/class_setupStep_Migrate.inc b/setup/class_setupStep_Migrate.inc index a7eedcd452aeadc794e38fb894ef363ebde92165..de9785f5763f8e9e501a80459c6a8fdc187ee349 100644 --- a/setup/class_setupStep_Migrate.inc +++ b/setup/class_setupStep_Migrate.inc @@ -536,7 +536,7 @@ class Step_Migrate extends setupStep '(&'. '(|'. '(objectClass=posixAccount)'. - '(objectClass=organizationalPerson)'. + '(objectClass=person)'. '(objectClass=OpenLDAPperson)'. ')'. '(!(objectClass=inetOrgPerson))'.