[Fedora-directory-commits] adminserver/admserv/newinst/src AdminUtil.pm.in, 1.13, 1.14 RegDSDialogs.pm, 1.1, 1.2 register-ds-admin.pl.in, 1.3, 1.4 register-ds-admin.res.in, 1.1, 1.2

Noriko Hosoi (nhosoi) fedora-directory-commits at redhat.com
Thu Aug 23 23:51:26 UTC 2007


Author: nhosoi

Update of /cvs/dirsec/adminserver/admserv/newinst/src
In directory cvs-int.fedora.redhat.com:/tmp/cvs-serv24382

Modified Files:
	AdminUtil.pm.in RegDSDialogs.pm register-ds-admin.pl.in 
	register-ds-admin.res.in 
Log Message:
Resolves: #253811
Summary: RFE: registration tool (register-ds-admin.pl)
Fixed problems
1. if ldap servers are installed at the non-standard location using .inf file
(as quickinstall does), register-ds-admin.pl could not find them.
2. provided a method to select ldap servers not to register to the
Configuration Directory Server.



Index: AdminUtil.pm.in
===================================================================
RCS file: /cvs/dirsec/adminserver/admserv/newinst/src/AdminUtil.pm.in,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- AdminUtil.pm.in	7 Aug 2007 23:30:02 -0000	1.13
+++ AdminUtil.pm.in	23 Aug 2007 23:51:24 -0000	1.14
@@ -23,11 +23,13 @@
                 updateAdmConf updateAdmpw updateLocalConf importCACert
                 getLocalConfigDS getPset registerDSWithConfigDS
                 registerManyDSWithConfigDS createSubDSNoConn
+                registerScatteredDSWithConfigDS
                 unregisterDSWithConfigDS isConfigDS);
 @EXPORT_OK = qw(getAdmConf getConfigDSConn createConfigDS createSubDS 
                 updateAdmConf updateAdmpw updateLocalConf importCACert
                 getLocalConfigDS getPset registerDSWithConfigDS
                 registerManyDSWithConfigDS createSubDSNoConn
+                registerScatteredDSWithConfigDS
                 unregisterDSWithConfigDS isConfigDS);
 
 # load perldap
@@ -329,7 +331,7 @@
                                        $inf->{General}->{certdir});
     if (!$conn) {
         @{$errs} = ('error_connection_failed');
-        return 1;
+        return 0;
     }
 
     return internalCreateSubDS($conn, $inf, $errs);
@@ -629,6 +631,47 @@
 
     return 1
 }
+sub registerScatteredDSWithConfigDS {
+    my $inf = shift;
+    my $errs = shift;
+    my $instances_ref = shift;
+    my @configdirs = keys %{$instances_ref};
+    my $configdir = $configdirs[0]; # use the first configdir for admin-serv
+
+    if ( ! $instances_ref ) {
+        return 1; # no instances to register - just return ok
+    }
+
+    # open a connection to the configuration directory server
+    my $conn = getConfigDSConn($inf->{General}->{ConfigDirectoryLdapURL},
+                               $inf->{General}->{ConfigDirectoryAdminID},
+                               $inf->{General}->{ConfigDirectoryAdminPwd},
+                               "$configdir/admin-serv", $errs);
+
+    if (!$conn or @{$errs}) {
+        return 0;
+    }
+
+    my $admConf = getAdmConf("$configdir/admin-serv");
+
+    for $configdir ( @configdirs ) {
+        foreach my $dsinst ( @{$instances_ref->{$configdir}} ) {
+            my $instinf = createInfFromConfig("$configdir/$dsinst", $dsinst);
+            unlink($instinf->{filename});
+            $instinf->{General}->{ConfigDirectoryLdapURL} = 
+                $inf->{General}->{ConfigDirectoryLdapURL};
+            $instinf->{General}->{AdminDomain} = $inf->{General}->{AdminDomain};
+            if (!registerDSWithConfigDS($dsinst, $errs, $instinf,
+                                    $conn, $admConf, $configdir)) {
+                return 0;
+            }
+        }
+    }
+
+    $conn->close();
+
+    return 1
+}
 
 sub registerDSWithConfigDS {
     my $servid = shift;


Index: RegDSDialogs.pm
===================================================================
RCS file: /cvs/dirsec/adminserver/admserv/newinst/src/RegDSDialogs.pm,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- RegDSDialogs.pm	27 Jul 2007 01:42:46 -0000	1.1
+++ RegDSDialogs.pm	23 Aug 2007 23:51:24 -0000	1.2
@@ -58,16 +58,21 @@
         my $ans = shift;
         my $index = shift;
         my $res = $DialogManager::SAME;
-		$self->{manager}->setType($TYPICAL);
+        my %instances = %{$self->{manager}->{inf}->{slapd}->{Instances}};
+        $self->{manager}->setType($TYPICAL);
         if ($index == 0) {
             # validate serverIdentifier?
-            foreach my $inst (@{$self->{manager}->{inf}->{slapd}->{Instances}})
+            foreach my $confdir ( keys %instances )
             {
-                if ( "$inst" eq "slapd-" . $ans )
+                foreach my $inst ( @{$instances{$confdir}} )
                 {
-                    $self->{manager}->{inf}->{slapd}->{ServerIdentifier} = $ans;
-                    $res = $DialogManager::NEXT;
-                    goto out;
+                    if ( "$inst" eq "slapd-" . $ans )
+                    {
+                        $self->{manager}->{inf}->{slapd}->{ServerIdentifier} = $ans;
+                        $self->{manager}->{inf}->{slapd}->{config_dir} = $confdir;
+                        $res = $DialogManager::NEXT;
+                        goto out;
+                    }
                 }
             }
 out:


Index: register-ds-admin.pl.in
===================================================================
RCS file: /cvs/dirsec/adminserver/admserv/newinst/src/register-ds-admin.pl.in,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- register-ds-admin.pl.in	7 Aug 2007 23:30:02 -0000	1.3
+++ register-ds-admin.pl.in	23 Aug 2007 23:51:24 -0000	1.4
@@ -39,6 +39,8 @@
 
 use lib qw(@perlpath@);
 
+use strict;
+
 use File::Basename;
 use Net::Domain qw(hostfqdn);
 
@@ -58,10 +60,22 @@
 {
     my $setup = shift;
     my $key = shift;
-    my $value = shift;
+    my $value0 = shift;
+    my $value1 = shift;
 
     print("\n==============================================================================\n");
-    $setup->msg(0, $key, $value);
+    if ( $value1 )
+    {
+        $setup->msg(0, $key, $value0, $value1);
+    }
+    elsif ( $value0 )
+    {
+        $setup->msg(0, $key, $value0);
+    }
+    else
+    {
+        $setup->msg(0, $key);
+    }
     system("stty -echo");
     my $ans = <STDIN>;
     system("stty echo");
@@ -70,6 +84,20 @@
     return $ans;
 }
 
+sub reg_get_response
+{
+    my $setup = shift;
+    my $key = shift;
+    my $value = shift;
+
+    print("\n==============================================================================\n");
+    $setup->msg(0, $key, $value);
+    my $ans = <STDIN>;
+    print "\n";
+    chop($ans);
+    return $ans;
+}
+
 my $res = new Resource("@propertydir@/register-ds-admin.res",
                        "@propertydir@/setup-ds-admin.res",
                        "@propertydir@/setup-ds.res");
@@ -79,35 +107,130 @@
 $setup->msg('begin_ds_registration');
 # get existing instances
 my $instconfigdir = $setup->{configdir};
-my @instances = ();
-for my $dir (glob("$setup->{configdir}/slapd-*")) {
-    if (-d $dir) {
-        push @instances, basename($dir);
+my %instances = ();
+for my $dir (glob("$setup->{configdir}/slapd-*"))
+{
+    if (-d $dir)
+    {
+        my $dname = dirname($dir);
+        my $bname = basename($dir);
+        push @{$instances{$dname}}, $bname;
+    }
+}
+
+# in case Directory Servers are installed at the unexpected location.
+my $done = 0;
+my $ans;
+while ( !$done && ($ans =  reg_get_response($setup, 'subds_conf_prompt', "@instconfigdir@")) )
+{
+    if ( $ans eq "" || !$ans )
+    {
+        $done = 1;
+    }
+    elsif ( ! -d $ans )
+    {
+        ;
+    }
+    elsif ( basename($ans) =~ /^slapd-/ )
+    {
+        my $dname = dirname($ans);
+        my $bname = basename($ans);
+        if ( exists $instances{$dname} )
+        {
+            my $addit = 1;
+            foreach my $thisslapd ( @{$instances{$dname}} )
+            {
+                if ( $thisslapd eq $bname )
+                {
+                    $addit = 0;
+                    goto out0;
+                }
+            }
+out0:
+            if ( $addit )
+            {
+                push @{$instances{$dname}}, $bname;
+            }
+        }
+        else
+        {
+            push @{$instances{$dname}}, $bname;
+        }
+    }
+    else
+    {
+        $ans =~ s/^\s+//;
+        $ans =~ s/[\/\s]+$//;
+        my $rc = opendir(DIR, $ans);
+        if ( $rc )
+        {
+            my $file = "";
+            while ( defined($file = readdir(DIR)) )
+            {
+                next if ( !("$file" =~ /^slapd-/) );
+                if ( exists $instances{$ans} )
+                {
+                    my $addit = 1;
+                    foreach my $thisslapd ( @{$instances{$ans}} )
+                    {
+                        if ( $thisslapd eq $file )
+                        {
+                            $addit = 0;
+                            goto out1;
+                        }
+                    }
+out1:
+                    if ( $addit )
+                    {
+                        push @{$instances{$ans}}, $file;
+                    }
+                }
+                else
+                {
+                    push @{$instances{$ans}}, $file;
+                }
+            }
+            closedir(DIR);
+        }
     }
 }
-if ( $#instances < 0 )
+
+my @instconfigdirs = keys %instances;
+if ( $#instconfigdirs < 0 )
 {
     $setup->msg($FATAL, 'error_no_ds');
     $setup->doExit(1);
 }
 
+print("\n==============================================================================\n");
+$setup->msg('candidate_list_txt');
+foreach my $c ( @instconfigdirs )
+{
+    foreach my $i ( @{$instances{$c}} )
+    {
+        print "    $c/$i\n";
+    }
+}
+
 # see if there is already a configds
 my $admConf = AdminUtil::getAdmConf("$instconfigdir/admin-serv");
 my @admConfKeys = keys %$admConf;
 my $orig_confdsid = "";
 my $new_confdsid = "";
+my $new_confdir = "";
 my $adminuid = "";
 my @errs = ();
 my $fqdn = hostfqdn();
 
 # set defaults
-if ( $#admConfKeys >= 0 )
+if ( $#admConfKeys >= 4 ) # admserv.conf, console.conf, httpd.conf, nss.conf
 {
     # Admin Server is installed; that is Config DS exists, which may be
     # replaced with a new one in the RegDSDialogs
     $orig_confdsid = getLocalConfigDS("$instconfigdir/admin-serv");
     $setup->{inf}->{slapd}->{ServerIdentifier} = $orig_confdsid;
-    $setup->{inf}->{slapd}->{Instances} = \@instances;
+    $setup->{inf}->{slapd}->{config_dir} = $instconfigdir;
+    $setup->{inf}->{slapd}->{Instances} = \%instances;
     $setup->{inf}->{General}->{ConfigDirectoryLdapURL} = $admConf->{ldapurl};
     $setup->{inf}->{General}->{ConfigDirectoryAdminID} = $admConf->{userdn};
     $setup->{inf}->{General}->{AdminDomain} = $admConf->{AdminDomain};
@@ -147,9 +270,10 @@
     }
 
     $new_confdsid = $setup->{inf}->{slapd}->{ServerIdentifier};
+    $new_confdir = $setup->{inf}->{slapd}->{config_dir};
     my $newinst = "slapd-$new_confdsid";
     my $inf = createInfFromConfig("$instconfigdir/$newinst", $newinst);
-    if ( NULL == $inf )
+    if ( ! $inf )
     {
         $setup->msg($FATAL, 'error_create_inf_from_config',
                                 "$instconfigdir/$newinst");
@@ -184,24 +308,30 @@
     }
     # Set the new inf to $setup->{inf}
     $setup->{inf}->{slapd} = $inf->{slapd};
+    $setup->{inf}->{slapd}->{config_dir} = $instconfigdir;
+    $setup->{inf}->{slapd}->{Instances} = \%instances;
 }
 else
 {
     # Admin Server is not set up.
-    # @instances has more than one instance
+    # %instances has more than one instance
     # note: this is orig_confdsid is just a candidate...
-    ($orig_confdsid = $instances[0]) =~ s/slapd-(.*)/\1/;
+    my $orig_confdir = $instconfigdirs[0];
+    my @orig_confdsids = @{$instances{$orig_confdir}};
+    ($orig_confdsid = $orig_confdsids[0]) =~ s/slapd-(.*)/\1/;
+
     my $originst = "slapd-$orig_confdsid";
-    my $inf = createInfFromConfig("$instconfigdir/$originst", $originst);
-    if ( NULL == $inf )
+    my $inf = createInfFromConfig("$orig_confdir/$originst", $originst);
+    if ( ! $inf )
     {
         $setup->msg($FATAL, 'error_create_inf_from_config',
-                            "$instconfigdir/$originst");
+                            "$orig_confdir/$originst");
         $setup->doExit(1);
     }
     $setup->{inf} = $inf;
     $setup->{inf}->{slapd}->{ServerIdentifier} = $orig_confdsid;
-    $setup->{inf}->{slapd}->{Instances} = \@instances;
+    $setup->{inf}->{slapd}->{config_dir} = $orig_confdir;
+    $setup->{inf}->{slapd}->{Instances} = \%instances;
 
     my $dialogmgr = new DialogManager($setup, $res, $TYPICAL);
 
@@ -220,18 +350,19 @@
         $setup->doExit(1);
     }
     $new_confdsid = $setup->{inf}->{slapd}->{ServerIdentifier};
+    $new_confdir = $setup->{inf}->{slapd}->{config_dir};
     if ( $orig_confdsid ne $new_confdsid )
     {
         my $newinst = "slapd-$new_confdsid";
         $inf = createInfFromConfig("$instconfigdir/$newinst", $newinst);
-        if ( NULL == $inf )
+        if ( ! $inf )
         {
             $setup->msg($FATAL, 'error_create_inf_from_config',
                                 "$instconfigdir/$newinst");
             $setup->doExit(1);
         }
         $setup->{inf}->{slapd} = $inf->{slapd};
-        $setup->{inf}->{slapd}->{Instances} = \@instances;
+        $setup->{inf}->{slapd}->{Instances} = \%instances;
     }
     $setup->{inf}->{General}->{ConfigDirectoryLdapURL} = "ldap://" . $fqdn . ":". $setup->{inf}->{slapd}->{ServerPort} . "/o=NetscapeRoot";
 
@@ -250,11 +381,13 @@
     $adminuid = $setup->{inf}->{General}->{ConfigDirectoryAdminID};
 }
 
+
+
 # Get the ConfigDS's rootDN password
 print("\n==============================================================================\n");
 $setup->msg('register_new_confds', $new_confdsid);
-$setup->{inf}->{slapd}->{RootDNPwd} = reg_get_passwd($setup,
-                                          'input_rootdn_passwd', $new_confdsid);
+$setup->{inf}->{slapd}->{RootDNPwd} =
+    reg_get_passwd($setup, 'input_rootdn_passwd', $new_confdsid);
 
 if ( ($#admConfKeys >= 0 && ($orig_confdsid ne $new_confdsid)) ||
       $#admConfKeys < 0 )
@@ -270,8 +403,8 @@
                 goto out;
             }
         }
-        $setup->{inf}->{slapd}->{RootDNPwd} = reg_get_passwd($setup,
-                                          'input_rootdn_passwd', $new_confdsid);
+        $setup->{inf}->{slapd}->{RootDNPwd} =
+                reg_get_passwd($setup, 'input_rootdn_passwd', $new_confdsid);
         @errs = ();
     }
 out:
@@ -296,43 +429,65 @@
 
 my $hassubinst = 0;
 # Then, register the rest of the Directory Servers, if any
-my @subinstances = ();    # array without the Config DS
-foreach my $subinst (@instances)
+my %subinstances = ();    # hash without the Config DS
+%instances = %{$setup->{inf}->{slapd}->{Instances}};
+foreach my $subconfdir (keys %instances)
 {
-    if ( "$subinst" ne "slapd-" . $new_confdsid )
+    my @subinsts = @{$instances{$subconfdir}};
+    foreach my $subinst ( @subinsts )
     {
-        if ( 0 == $hassubinst )
+        if ( ("$subinst" ne "slapd-" . $new_confdsid) ||
+             ($subconfdir ne $new_confdir) )
         {
-            $hassubinst = 1;
-            print("\n==============================================================================\n");
-            $setup->msg('register_subds');
-        }
-        my $subid = $subinst;
-        $subid =~ s/slapd-//;
-        push(@subinstances, ($subinst));
-        my $subinf = createInfFromConfig("$instconfigdir/$subinst", $subinst);
-        if ( NULL == $subinf )
-        {
-            $setup->msg($FATAL, 'error_create_inf_from_config',
-                                "$subinstconfigdir/$subinst");
-            $setup->doExit(1);
-        }
-        $setup->{inf}->{slapd} = $subinf->{slapd};
-        $setup->{inf}->{slapd}->{RootDNPwd} = reg_get_passwd($setup,
-                                                 'input_rootdn_passwd', $subid);
-        while (createSubDS($setup->{inf}, \@errs))
-        {
-            $setup->msg($FATAL, @errs);
-            $setup->{inf}->{slapd}->{RootDNPwd} = reg_get_passwd($setup,
-                                                 'input_rootdn_passwd', $subid);
+            if ( 0 == $hassubinst )
+            {
+                $hassubinst = 1;
+                print("\n==============================================================================\n");
+                $setup->msg('register_subds');
+            }
+            my $subid = $subinst;
+            $subid =~ s/slapd-//;
+            my $passwd =
+                reg_get_passwd($setup, 'input_rootdn_passwd_sub', $subid, $subid);
+            # if the password is not given, we don't register the server
+            next if ( "" eq $passwd || !$passwd );
+            my $subinf = createInfFromConfig("$subconfdir/$subinst", $subinst);
+            if ( ! $subinf )
+            {
+                $setup->msg($FATAL, 'error_create_inf_from_config',
+                                    "$subconfdir/$subinst");
+            }
+            else
+            {
+                $setup->{inf}->{slapd} = $subinf->{slapd};
+                $setup->{inf}->{slapd}->{RootDNPwd} = $passwd;
+                push @{$subinstances{$subconfdir}}, $subinst;
+                $done = 0;
+                while ( !$done && !createSubDS($setup->{inf}, \@errs) )
+                {
+        $setup->msg($FATAL, @errs);
+                    $passwd = reg_get_passwd($setup, 'input_rootdn_passwd_sub',
+                                                        $subid, $subid);
+                    if ( "" eq $passwd || !$passwd )
+                    {
+                        $done = 1;
+                        pop @{$subinstances{$subconfdir}};
+                    }
+                    else
+                    {
+                        $setup->{inf}->{slapd}->{RootDNPwd} = $passwd;
+                    }
+                }
+            }
         }
     }
 }
 
-if ( $#subinstances >= 0 )
+my @subkeys = keys %subinstances;
+if ( $#subkeys >= 0 )
 {
     @errs = ();
-    if ( !registerManyDSWithConfigDS($setup->{inf}, \@errs, $instconfigdir, @subinstances) )
+    if ( !registerScatteredDSWithConfigDS($setup->{inf}, \@errs, \%subinstances) )
     {
         $setup->msg($FATAL, @errs);
         $setup->doExit(1);


Index: register-ds-admin.res.in
===================================================================
RCS file: /cvs/dirsec/adminserver/admserv/newinst/src/register-ds-admin.res.in,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- register-ds-admin.res.in	27 Jul 2007 01:42:46 -0000	1.1
+++ register-ds-admin.res.in	23 Aug 2007 23:51:24 -0000	1.2
@@ -2,6 +2,10 @@
 
 use_existing_configds_txt = Do you want to use this server as Configuration Directory Server?\n\n
 
+subds_conf_prompt = The Directory Server locates its configuration file (dse.ldif) at %s/slapd-ID, by default.  If you have Directory Server(s) which configuration file is put at the other location, you need to input it to register the server.\n\nIf you have such Directory Server, type the full path that stores the configuration file.\n\nIf you don't, type return.\n[configuration directory path or return]: 
+
+candidate_list_txt = Candidate servers to register:\n
+
 unregister_old_confds = Cleaning up old Config DS: %s\n
 
 register_new_confds = Registering new Config DS: %s\n
@@ -10,7 +14,9 @@
 
 end_ds_registration = Finished registration of the Directory Server
 
-input_rootdn_passwd = Please input the Directory Manager password on the server %s: 
+input_rootdn_passwd = Input the Directory Server password on the server %s: 
+
+input_rootdn_passwd_sub = If you want to register the server %s, input the Directory Manager password on the server.\n\nIf you don't, type return.\n[Directory Manager password on %s or return]: 
 
 input_admin_uid = Please input the password for the Administrator User ID: [%s]
 




More information about the Fedora-directory-commits mailing list