X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Ftools%2Fslapcommon.c;h=cea438712da9aab77266541e59001388c8df12ec;hb=701f6b9d5d708e2bb55d2ec6da4d6d7433fa70c8;hp=7e8514f277f57b71cd4813b0aaa393496f6d76fb;hpb=6aa36375457daa267dd6dceab0cb4f14565c0fa0;p=openldap diff --git a/servers/slapd/tools/slapcommon.c b/servers/slapd/tools/slapcommon.c index 7e8514f277..cea438712d 100644 --- a/servers/slapd/tools/slapcommon.c +++ b/servers/slapd/tools/slapcommon.c @@ -23,6 +23,14 @@ char *progname = NULL; char *conffile = SLAPD_DEFAULT_CONFIGFILE; int truncatemode = 0; int verbose = 0; +int update_ctxcsn = SLAP_TOOL_CTXCSN_KEEP; +int retrieve_ctxcsn = 0; +int retrieve_synccookie = 0; +int replica_promotion = 0; +int replica_demotion = 0; +char *replica_id_string = NULL; +char **replica_id_strlist = NULL; +int *replica_id_list = NULL; int continuemode = 0; int nosubordinates = 0; int dryrun = 0; @@ -48,11 +56,11 @@ usage( int tool ) switch( tool ) { case SLAPADD: - options = "\t[-l ldiffile] [-u]\n"; + options = "\n\t[-l ldiffile] [-u] [-p [-w] | -r [-i syncreplidlist] [-w]]\n"; break; case SLAPCAT: - options = "\t[-l ldiffile]\n"; + options = "\t[-l ldiffile] [-m] [-k]\n"; break; case SLAPINDEX: @@ -100,7 +108,7 @@ slap_tool_init( switch( tool ) { case SLAPADD: - options = "b:cd:f:l:n:tuv"; + options = "b:cd:f:i:l:n:prtuvWw"; break; case SLAPINDEX: @@ -109,7 +117,7 @@ slap_tool_init( break; case SLAPCAT: - options = "b:cd:f:l:n:s:v"; + options = "b:cd:f:kl:mn:s:v"; mode |= SLAP_TOOL_READMAIN | SLAP_TOOL_READONLY; break; @@ -141,14 +149,51 @@ slap_tool_init( conffile = strdup( optarg ); break; + case 'i': /* specify syncrepl id list */ + replica_id_string = strdup( optarg ); + if ( !isdigit( (unsigned char) *replica_id_string )) { + usage( tool ); + exit( EXIT_FAILURE ); + } + str2clist( &replica_id_strlist, replica_id_string, "," ); + for ( i = 0; replica_id_strlist && replica_id_strlist[i]; i++ ) ; + replica_id_list = ch_calloc( i + 1, sizeof( int ) ); + for ( i = 0; replica_id_strlist && replica_id_strlist[i]; i++ ) { + replica_id_list[i] = atoi( replica_id_strlist[i] ); + if ( replica_id_list[i] >= 1000 ) { + fprintf(stderr, + "%s: syncrepl id %d is out of range [0..999]\n", + progname, replica_id_list[i] ); + exit( EXIT_FAILURE ); + } + } + replica_id_list[i] = -1; + break; + + case 'k': /* Retrieve sync cookie entry */ + retrieve_synccookie = 1; + break; + case 'l': /* LDIF file */ ldiffile = strdup( optarg ); break; + case 'm': /* Retrieve ldapsync entry */ + retrieve_ctxcsn = 1; + break; + case 'n': /* which config file db to index */ dbnum = atoi( optarg ) - 1; break; + case 'p': /* replica promotion */ + replica_promotion = 1; + break; + + case 'r': /* replica demotion */ + replica_demotion = 1; + break; + case 's': /* dump subtree */ subtree = strdup( optarg ); break; @@ -166,6 +211,15 @@ slap_tool_init( verbose++; break; + case 'W': /* write context csn on every entry add */ + update_ctxcsn = SLAP_TOOL_CTXCSN_BATCH; + /* FIXME : update_ctxcsn = SLAP_TOOL_CTXCSN_ENTRY; */ + break; + + case 'w': /* write context csn on at the end */ + update_ctxcsn = SLAP_TOOL_CTXCSN_BATCH; + break; + default: usage( tool ); break; @@ -176,6 +230,14 @@ slap_tool_init( usage( tool ); } + if ( replica_promotion && replica_demotion ) { + usage( tool ); + } else if ( !replica_promotion && !replica_demotion ) { + if ( update_ctxcsn != SLAP_TOOL_CTXCSN_KEEP ) { + usage( tool ); + } + } + if ( ldiffile == NULL ) { ldiffp = tool == SLAPCAT ? stdout : stdin;