[Fedora-directory-commits] adminserver/admserv/cgi-src40 ds_remove.in, 1.3, 1.4

Noriko Hosoi (nhosoi) fedora-directory-commits at redhat.com
Fri Jul 27 01:35:31 UTC 2007


Author: nhosoi

Update of /cvs/dirsec/adminserver/admserv/cgi-src40
In directory cvs-int.fedora.redhat.com:/tmp/cvs-serv20336/admserv/cgi-src40

Modified Files:
	ds_remove.in 
Log Message:
resolves: #247215
Summary: Reimplement ds_remove (cgi) and ds_removal (command line wrapper) without setuputil code (comment #23)



Index: ds_remove.in
===================================================================
RCS file: /cvs/dirsec/adminserver/admserv/cgi-src40/ds_remove.in,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- ds_remove.in	24 Jul 2007 20:10:15 -0000	1.3
+++ ds_remove.in	27 Jul 2007 01:35:29 -0000	1.4
@@ -30,16 +30,24 @@
 use FileConn;
 use Resource;
 
+# remove_tree($centry, $key, $instname, [$isparent, [$dontremove]])
+#     $centry: entry to look for the path to be removed
+#     $key: key to look for the path in the entry
+#     $instname: instance name "slapd-<ID>" to check the path
+#     $isparent: specify 1 to remove from the parent dir
+#     $dontremove: pattern not to be removed (e.g., ".db$")
 sub remove_tree
 {
     my $centry = shift;
     my $key = shift;
     my $instname = shift;
     my $isparent = shift;
+    my $dontremove = shift;
 
     foreach my $path ( @{$centry->{$key}} )
     {
         my $rmdir = "";
+        my $rc = 0;
         if ( 1 == $isparent )
         {
             $rmdir = dirname($path);
@@ -50,8 +58,55 @@
         }
         if ( -d $rmdir && $rmdir =~ /$instname/ )
         {
-            my $rc = rmtree($rmdir);
-            print STDERR "rmtree: $rmdir => RC: $rc\n";
+            if ( "" eq "$dontremove" )
+            {
+                $rc = rmtree($rmdir);
+                if ( 0 == $rc )
+                {
+                    print "Content-type: text/plain\n\n";
+                    print "NMC_ErrInfo: $rmdir was not removed.\n";
+                    print STDERR "Warning: $rmdir was not removed.\n";
+                }
+            }
+            else
+            {
+                # Skip the dontremove files
+                $rc = opendir(DIR, $rmdir);
+                if ($rc)
+                {
+                    while (defined(my $file = readdir(DIR)))
+                    {
+                        next if ( "$file" =~ /$dontremove/ );
+                        next if ( "$file" eq "." );
+                        next if ( "$file" eq ".." );
+                        my $rmfile = $rmdir . "/" . $file;
+                        my $rc0 = rmtree($rmfile);
+                        if ( 0 == $rc0 )
+                        {
+                            print "Content-type: text/plain\n\n";
+                            print "NMC_ErrInfo: $rmfile was not removed.\n";
+                            print STDERR "Warning: $rmfile was not removed.\n";
+                        }
+                    }
+                    closedir(DIR);
+                }
+                my $newrmdir = $rmdir . ".removed";
+                my $rc1 = 1;
+                if ( -d $newrmdir )
+                {
+                    $rc1 = rmtree($newrmdir);
+                    if ( 0 == $rc1 )
+                    {
+                        print "Content-type: text/plain\n\n";
+                        print "NMC_ErrInfo: $newrmdir was not removed.\n";
+                        print STDERR "Warning: $newrmdir was not removed.\n";
+                    }
+                }
+                if ( 0 < $rc1 )
+                {
+                    rename($rmdir, $newrmdir);
+                }
+            }
         }
     }
 }
@@ -83,12 +138,23 @@
 
 my $instname = $query->param('InstanceName');
 my ($slapd, $inst) = split(/-/, $instname, 2);
+my $configdir = "@instconfigdir@/slapd-$inst";
+if ( ! -d $configdir )
+{
+    print "Content-type: text/plain\n\n";
+    print "NMC_ErrInfo: $configdir does not exist\n";
+    print "NMC_Status: 1\n";
+    print STDERR "Error: $configdir does not exist\n";
+    exit 1;
+}
 my @errs;
-my $inf = createInfFromConfig("@instconfigdir@/slapd-$inst", $inst, \@errs);
-if (@errs) {
+my $inf = createInfFromConfig($configdir, $inst, \@errs);
+if (@errs)
+{
     print "Content-type: text/plain\n\n";
     print "NMC_ErrInfo: ", $res->getText(@errs), "\n";
     print "NMC_Status: 1\n";
+    print STDERR "Error: ", $res->getText(@errs), "\n";
     exit 1;
 }
 
@@ -108,14 +174,43 @@
 
 my $dn = "cn=config";
 my $entry = $conn->search($dn, "base", "(cn=*)", 0);
-if (!$entry) {
+if (!$entry)
+{
     print "Content-type: text/plain\n\n";
     print "NMC_ErrInfo: Search $dn in $dseldif failed: $entry\n";
     print "NMC_Status: 1\n";
+    print STDERR "Error: Search $dn in $dseldif failed: $entry\n";
+    exit 1;
+}
+
+# Unregister the server from the configuration ds
+# get config ds url from input or admconf
+# get admin id from input or admconf
+# must get admin password from input (PASSWORD_PIPE?)
+# get admin domain
+# config ds info
+if (!unregisterDSWithConfigDS($inst, \@errs, $inf))
+{
+    print "Content-type: text/plain\n\n";
+    print "NMC_ErrInfo: ", $res->getText(@errs), "\n";
+    print "NMC_Status: 1\n";
+    print STDERR "Error:", $res->getText(@errs), "\n";
+    exit 1;
+}
+
+$dn = "cn=config,cn=ldbm database,cn=plugins,cn=config";
+my $dbentry = $conn->search($dn, "base", "(cn=*)", 0);
+if (!$dbentry)
+{
+    print "Content-type: text/plain\n\n";
+    print "NMC_ErrInfo: Search $dn in $dseldif failed: $dbentry\n";
+    print "NMC_Status: 1\n";
+    print "Error: Search $dn in $dseldif failed: $dbentry\n";
     exit 1;
 }
+$conn->close();
 
-# stop the server first
+# stop the server
 my $instdir = "";
 foreach my $path ( @{$entry->{"nsslapd-instancedir"}} )
 {
@@ -131,56 +226,51 @@
                 # Ignore the stop failure
                 print "Content-type: text/plain\n\n";
                 print "NMC_ErrInfo: Could not stop directory server: $output\n";
+                print STDERR "Warning: Could not stop directory server: $output\n";
             }
             $instdir = $path;    # need to use it later...
         } else {
             print "Content-type: text/plain\n\n";
             print "NMC_ErrInfo: The program $prog does not exist\n";
             print "NMC_Status: 1\n";
+            print STDERR "Error: The program $prog does not exist\n";
             exit 1;
         }
     }
 }
-
-# Unregister the server from the configuration ds
-# get config ds url from input or admconf
-# get admin id from input or admconf
-# must get admin password from input (PASSWORD_PIPE?)
-# get admin domain
-# config ds info
-if (!unregisterDSWithConfigDS($inst, \@errs, $inf)) {
-    print "Content-type: text/plain\n\n";
-    print "NMC_ErrInfo: ", $res->getText(@errs), "\n";
-    print "NMC_Status: 1\n";
-    exit 1;
-}
-
+    
 # remove physical dirs/files
-$dn = "cn=config,cn=ldbm database,cn=plugins,cn=config";
-my $dbentry = $conn->search($dn, "base", "(cn=*)", 0);
-if (!$dbentry) {
-    print "Content-type: text/plain\n\n";
-    print "NMC_ErrInfo: Search $dn in $dseldif failed: $dbentry\n";
-    print "NMC_Status: 1\n";
-    exit 1;
-}
 remove_tree($dbentry, "nsslapd-directory", $instname, 1);
 remove_tree($dbentry, "nsslapd-db-logdirectory", $instname, 1);
 remove_tree($entry, "nsslapd-lockdir", $instname);
 remove_tree($entry, "nsslapd-tmpdir", $instname);
 remove_tree($entry, "nsslapd-bakdir", $instname, 1);
 remove_tree($entry, "nsslapd-errorlog", $instname, 1);
-remove_tree($entry, "nsslapd-schemadir", $instname, 1);
 
 # instance dir
-if ( -d $instdir )
+if ( -d $instdir && $instdir =~ /$instname/ )
 {
     # clean up pid files (if any)
     remove_pidfile("STARTPIDFILE", $instdir, $instname);
     remove_pidfile("PIDFILE", $instdir, $instname);
 
+    if ( 1 == isConfigDS($instname, "@instconfigdir@/admin-serv") )
+    {
+        # if it is the Config DS, adm.conf and local.conf needs to be removed.
+        unlink("@instconfigdir@/admin-serv/adm.conf");
+        unlink("@instconfigdir@/admin-serv/local.conf");
+    }
+
     my $rc = rmtree($instdir);
+    if ( 0 == $rc )
+    {
+        print "Content-type: text/plain\n\n";
+        print "NMC_ErrInfo: $instdir was not removed.\n";
+        print STDERR "Warning: $instdir was not removed.\n";
+    }
 }
+# Finally, config dir
+remove_tree($entry, "nsslapd-schemadir", $instname, 1, "\.db\$");
 
 # if we got here, report success
 print "Content-type: text/plain\n\n";




More information about the Fedora-directory-commits mailing list