diff options
Diffstat (limited to 'ldap/servers/slapd/main.c')
-rw-r--r-- | ldap/servers/slapd/main.c | 115 |
1 files changed, 112 insertions, 3 deletions
diff --git a/ldap/servers/slapd/main.c b/ldap/servers/slapd/main.c index 67be7902..82f0089d 100644 --- a/ldap/servers/slapd/main.c +++ b/ldap/servers/slapd/main.c @@ -113,6 +113,7 @@ static int slapd_exemode_db2index(); static int slapd_exemode_archive2db(); static int slapd_exemode_db2archive(); static int slapd_exemode_upgradedb(); +static int slapd_exemode_upgradednformat(); static int slapd_exemode_dbverify(); static int slapd_exemode_dbtest(); static int slapd_exemode_suffix2instance(); @@ -374,6 +375,8 @@ name2exemode( char *progname, char *s, int exit_if_unknown ) exemode = SLAPD_EXEMODE_SUFFIX2INSTANCE; } else if ( strcmp( s, "upgradedb" ) == 0 ) { exemode = SLAPD_EXEMODE_UPGRADEDB; + } else if ( strcmp( s, "upgradednformat" ) == 0 ) { + exemode = SLAPD_EXEMODE_UPGRADEDNFORMAT; } else if ( strcmp( s, "dbverify" ) == 0 ) { exemode = SLAPD_EXEMODE_DBVERIFY; } @@ -381,7 +384,7 @@ name2exemode( char *progname, char *s, int exit_if_unknown ) fprintf( stderr, "usage: %s -D configdir " "[ldif2db | db2ldif | archive2db " "| db2archive | db2index | refer | suffix2instance" - " | upgradedb | dbverify] " + " | upgradedb | upgradednformat | dbverify] " "[options]\n", progname ); exit( 1 ); } else { @@ -441,6 +444,9 @@ usage( char *name, char *extraname ) case SLAPD_EXEMODE_UPGRADEDB: usagestr = "usage: %s %s%s-D configdir [-d debuglevel] [-f] -a archivedir\n"; break; + case SLAPD_EXEMODE_UPGRADEDNFORMAT: + usagestr = "usage: %s %s%s-D configdir [-d debuglevel] [-N] -n backend-instance-name -a fullpath-backend-instance-dir-full\n"; + break; case SLAPD_EXEMODE_DBVERIFY: usagestr = "usage: %s %s%s-D configdir [-d debuglevel] [-n backend-instance-name]\n"; break; @@ -484,6 +490,7 @@ static int dbverify_verbose = 0; static char *ldif2db_namespaceid = NULL; int importexport_encrypt = 0; static int upgradedb_force = 0; +static int upgradednformat_dryrun = 0; /* taken from idsktune */ #if defined(__sun) @@ -990,6 +997,11 @@ main( int argc, char **argv) goto cleanup; break; + case SLAPD_EXEMODE_UPGRADEDNFORMAT: + return_value = slapd_exemode_upgradednformat(); + goto cleanup; + break; + case SLAPD_EXEMODE_DBVERIFY: return_value = slapd_exemode_dbverify(); goto cleanup; @@ -1415,6 +1427,16 @@ process_command_line(int argc, char **argv, char *myname, {"configDir",ArgRequired,'D'}, {0,0,0}}; + char *opts_upgradednformat = "vd:a:n:D:N"; + struct opt_ext long_options_upgradednformat[] = { + {"version",ArgNone,'v'}, + {"debug",ArgRequired,'d'}, + {"backend",ArgRequired,'n'}, + {"archive",ArgRequired,'a'}, /* Path to the work db instance dir */ + {"configDir",ArgRequired,'D'}, + {"dryrun",ArgNone,'N'}, + {0,0,0}}; + char *opts_dbverify = "vVfd:n:D:"; struct opt_ext long_options_dbverify[] = { {"version",ArgNone,'v'}, @@ -1520,6 +1542,10 @@ process_command_line(int argc, char **argv, char *myname, opts = opts_upgradedb; long_opts = long_options_upgradedb; break; + case SLAPD_EXEMODE_UPGRADEDNFORMAT: + opts = opts_upgradednformat; + long_opts = long_options_upgradednformat; + break; case SLAPD_EXEMODE_DBVERIFY: opts = opts_dbverify; long_opts = long_options_dbverify; @@ -1622,6 +1648,7 @@ process_command_line(int argc, char **argv, char *myname, break; case 'n': /* which backend to do ldif2db/bak2db for */ if (slapd_exemode == SLAPD_EXEMODE_LDIF2DB || + slapd_exemode == SLAPD_EXEMODE_UPGRADEDNFORMAT || slapd_exemode == SLAPD_EXEMODE_DBTEST || slapd_exemode == SLAPD_EXEMODE_DB2INDEX || slapd_exemode == SLAPD_EXEMODE_ARCHIVE2DB) { @@ -1663,8 +1690,10 @@ process_command_line(int argc, char **argv, char *myname, db2ldif_dump_replica = 1; break; case 'N': /* do not do ldif2db duplicate value check */ + /* Or dryrun mode for upgradednformat */ if ( slapd_exemode != SLAPD_EXEMODE_LDIF2DB && - slapd_exemode != SLAPD_EXEMODE_DB2LDIF) { + slapd_exemode != SLAPD_EXEMODE_DB2LDIF && + slapd_exemode != SLAPD_EXEMODE_UPGRADEDNFORMAT) { usage( myname, *extraname ); exit( 1 ); } @@ -1679,6 +1708,9 @@ process_command_line(int argc, char **argv, char *myname, if ( slapd_exemode == SLAPD_EXEMODE_DB2LDIF ) { ldif_printkey &= ~EXPORT_PRINTKEY; } + if ( slapd_exemode == SLAPD_EXEMODE_UPGRADEDNFORMAT ) { + upgradednformat_dryrun = 1; + } break; @@ -2653,7 +2685,7 @@ slapd_exemode_upgradedb() } /* check for slapi v2 support */ if (! SLAPI_PLUGIN_IS_V2(backend_plugin)) { - LDAPDebug(LDAP_DEBUG_ANY, "ERROR: %s is too old to do convert idl.\n", + LDAPDebug(LDAP_DEBUG_ANY, "ERROR: %s is too old to reindex all.\n", backend_plugin->plg_name, 0, 0); return 1; } @@ -2684,6 +2716,83 @@ slapd_exemode_upgradedb() return( return_value ); } +/* Command to upgrade the old dn format to the new style */ +static int +slapd_exemode_upgradednformat() +{ + int rc = -1; /* error, by default */ + Slapi_PBlock pb; + struct slapdplugin *backend_plugin; + slapdFrontendConfig_t *slapdFrontendConfig = getFrontendConfig(); + + if ( archive_name == NULL ) { + LDAPDebug0Args(LDAP_DEBUG_ANY, "ERROR: Required argument " + "\"-a <path to work db instance dir>\" is missing\n"); + usage( myname, extraname ); + goto bail; + } + + /* this should be the first time to be called! if the init order + * is ever changed, these lines should be changed (or erased)! + */ + mapping_tree_init(); + + if ((backend_plugin = plugin_get_by_name("ldbm database")) == NULL) { + LDAPDebug0Args(LDAP_DEBUG_ANY, + "ERROR: Could not find the ldbm backend plugin.\n"); + goto bail; + } + + /* Make sure we aren't going to run slapd in + * a mode that is going to conflict with other + * slapd processes that are currently running + * Pretending to execute import. + */ + if (add_new_slapd_process(slapd_exemode, 0, skip_db_protect_check) + == -1) { + LDAPDebug0Args(LDAP_DEBUG_ANY, "Shutting down due to possible " + "conflicts with other slapd processes\n"); + goto bail; + } + /* check for slapi v2 support */ + if (! SLAPI_PLUGIN_IS_V2(backend_plugin)) { + LDAPDebug1Arg(LDAP_DEBUG_ANY, + "ERROR: %s is too old to upgrade dn format.\n", + backend_plugin->plg_name); + goto bail; + } + + memset( &pb, '\0', sizeof(pb) ); + pb.pb_backend = NULL; + pb.pb_plugin = backend_plugin; + pb.pb_instance_name = cmd_line_instance_name; + if (upgradednformat_dryrun) { + pb.pb_seq_type = SLAPI_UPGRADEDNFORMAT|SLAPI_DRYRUN; + } else { + pb.pb_seq_type = SLAPI_UPGRADEDNFORMAT; + } + pb.pb_seq_val = archive_name; /* Path to the work db instance dir */ + pb.pb_task_flags = SLAPI_TASK_RUNNING_FROM_COMMANDLINE; + /* borrowing import code, so need to set up the import variables */ + pb.pb_ldif_generate_uniqueid = ldif2db_generate_uniqueid; + pb.pb_ldif_namespaceid = ldif2db_namespaceid; + pb.pb_ldif2db_noattrindexes = 0; + pb.pb_removedupvals = 0; +#ifndef _WIN32 + main_setuid(slapdFrontendConfig->localuser); +#endif + if ( backend_plugin->plg_upgradednformat != NULL ) { + rc = (*backend_plugin->plg_upgradednformat)( &pb ); + } else { + LDAPDebug( LDAP_DEBUG_ANY, + "ERROR: no upgradednformat function defined for " + "%s\n", backend_plugin->plg_name, 0, 0 ); + } +bail: + slapi_ch_free((void**)&myname ); + return( rc ); +} + /* * function to perform DB verify */ |