diff options
Diffstat (limited to 'ldap/admin/src/scripts/91upgradednformat.pl')
-rw-r--r-- | ldap/admin/src/scripts/91upgradednformat.pl | 152 |
1 files changed, 0 insertions, 152 deletions
diff --git a/ldap/admin/src/scripts/91upgradednformat.pl b/ldap/admin/src/scripts/91upgradednformat.pl deleted file mode 100644 index 611f1e0d..00000000 --- a/ldap/admin/src/scripts/91upgradednformat.pl +++ /dev/null @@ -1,152 +0,0 @@ -use Mozilla::LDAP::Conn; -use Mozilla::LDAP::Utils qw(normalizeDN); -use Mozilla::LDAP::API qw(:constant ldap_url_parse ldap_explode_dn); -use File::Basename; -use File::Copy; - -# Upgrade DN format if needed. -# For each backend instance, -# run upgradednformat with -N (dryrun mode), -# if it returns 0 (Upgrade candidates are found), -# recursively copy the instance dir to the work dir (dnupgrade) -# run upgradednformat w/o -N against the DB in the work dir -# if it went ok, replace the original instance dir with the work dir. -# Note: This script does nothing if the server is up. -sub runinst { - my ($inf, $inst, $dseldif, $conn) = @_; - - # First, check if the server is up or down. - if ($conn->isa("Mozilla::LDAP::Conn")) { - # The server is up, we do nothing. - return (); - } - - my @errs; - - my $config = "cn=config"; - my $mappingtree = "cn=mapping tree,cn=config"; - my $ldbmbase = "cn=ldbm database,cn=plugins,cn=config"; - - my $backend_entry; - my $mtentry = $conn->search($mappingtree, "onelevel", "(cn=*)", 0, @attr); - if (!$mtentry) { - return ("error_no_mapping_tree_entries", $!); - } - - # If a suffix in the mapping tree is doube-quoted and - # the cn value has only the double-quoted value, e.g. - # dn: cn="dc=example,dc=com",cn=mapping tree,cn=config - # cn: "dc=example,dc=com" - # the following code adds non-quoted value: - # cn: dc=example,dc=com - while ($mtentry) { - my $numvals = $mtentry->size("cn"); - my $i; - my $withquotes = -1; - my $noquotes = -1; - for ($i = 0; $i < $numvals; $i++) { - if ($mtentry->{"cn"}[$i] =~ /^".*"$/) { - $withquotes = $i; - } else { - $noquotes = $i; - } - } - if ($withquotes >= 0 && $noquotes == -1) { - # Has only cn: "<suffix>" - # Adding cn: <suffix> - my $stripped = $mtentry->{"cn"}[$withquotes]; - $stripped =~ s/^"(.*)"$/$1/; - $mtentry->addValue("cn", $stripped); - $conn->update($mtentry); - } - $mtentry = $conn->nextEntry(); - } - - my $config_entry = $conn->search($config, "base", "(cn=*)", 0, ("nsslapd-instancedir")); - if (!$config_entry) { - return ("error_no_configuration_entry", $!); - } - my $instancedir = $config_entry->{"nsslapd-instancedir"}[0]; - my $upgradednformat = $instancedir . "/upgradednformat"; - - # Scan through all of the backends to see if any of them - # contain escape characters in the DNs. If we find any - # escapes, we need to run the conversion tool on that - # backend. - $backend_entry = $conn->search($ldbmbase, "onelevel", "(objectClass=nsBackendInstance)", 0, @attr); - if (!$backend_entry) { - return ("error_no_backend_entries", $!); - } - - while ($backend_entry) { - my $backend = $backend_entry->{"cn"}[0]; - my $dbinstdir = $backend_entry->{"nsslapd-directory"}[0]; - my $workdir = $dbinstdir . "/dnupgrade"; - my $dbdir = dirname($dbinstdir); - my $pdbdir = dirname($dbdir); - my $instname = basename($dbinstdir); - - if ("$dbdir" eq "" || "$instname" eq "") { - push @errs, ["error_invalid_dbinst_dir", $dbinstdir]; - return @errs; - } - - # clean up db region files, which might contain the old pages - if ( -d $dbdir && -f $dbdir."/__db.001") { - unlink <$dbdir/__db.*>; - } - - if (-e "$dbinstdir/id2entry.db4") { - # Check if any DNs contain escape characters with dbscan. - # dryrun mode - # return values: 0 -- need to upgrade dn format - # 1 -- no need to upgrade dn format - # -1 -- error - my $escapes = system("$upgradednformat -n $backend -a $dbinstdir -N"); - if (0 == $escapes) { - my $rc = 0; - - if (system("cd $pdbdir; tar cf - db/DBVERSION | (cd $dbinstdir; tar xf -)") || - system("cd $pdbdir; tar cf - db/$instname/{DBVERSION,*.db4} | (cd $dbinstdir; tar xf -)")) { - push @errs, ["error_cant_backup_db", $backend, $!]; - return @errs; - } - my @stat = stat("$dbdir"); - my $mode = $stat[2]; - my $uid = $stat[4]; - my $gid = $stat[5]; - - move("$dbinstdir/db", "$workdir"); - chmod($mode, $workdir); - chown($uid, $gid, $workdir); - - @stat = stat("$dbinstdir"); - $mode = $stat[2]; - $uid = $stat[4]; - $gid = $stat[5]; - - chmod($mode, "$workdir/$instname"); - chown($uid, $gid, "$workdir/$instname"); - - # call conversion tool here and get return status. - $rc = system("$upgradednformat -n $backend -a $workdir/$instname"); - if ($rc == 0) { # success - move("$dbinstdir", "$dbinstdir.orig"); - move("$dbinstdir.orig/dnupgrade/$instname", "$dbinstdir"); - copy("$dbinstdir.orig/dnupgrade/DBVERSION", "$dbdir"); - } else { - # Conversion failed. Cleanup and bail. - unlink <$dbinstdir/dnupgrade/$backend/*>; - rmdir("$dbinstdir/dnupgrade/$backend"); - unlink <$dbinstdir/dnupgrade/*>; - rmdir("$dbinstdir/dnupgrade"); - return ("error_cant_convert_db", $backend, $rc); - } - } - } - - $backend_entry = $conn->nextEntry(); - } - - return (); -} |