]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/slapcommon.c
Fix backend selection diagnostics
[openldap] / servers / slapd / slapcommon.c
index 9c9bf65975b0a17270b1fedd72969ce23800ac86..2667e2e7dc67ec0476e536fe579a62856c68435b 100644 (file)
@@ -36,6 +36,7 @@
 
 #include "slapcommon.h"
 #include "lutil.h"
+#include "ldif.h"
 
 tool_vars tool_globals;
 
@@ -44,23 +45,25 @@ static char *leakfilename;
 static FILE *leakfile;
 #endif
 
+static LDIFFP dummy;
+
 static void
 usage( int tool, const char *progname )
 {
        char *options = NULL;
        fprintf( stderr,
-               "usage: %s [-v] [-c] [-d debuglevel] [-f configfile]",
+               "usage: %s [-v] [-d debuglevel] [-f configfile] [-F configdir]",
                progname );
 
        switch( tool ) {
        case SLAPACL:
-               options = "\n\t[-U authcID | -D authcDN]"
-                       " -b DN [attr[/access][:value]] [...]\n";
+               options = "\n\t[-U authcID | -D authcDN] [-X authzID | -o authzDN=<DN>]"
+                       "\n\t-b DN -o <var>[=<val>] [-u] [attr[/access][:value]] [...]\n";
                break;
 
        case SLAPADD:
-               options = "\n\t[-n databasenumber | -b suffix]\n"
-                       "\t[-l ldiffile] [-u] [-p [-w] | -r [-i syncreplidlist] [-w]]\n";
+               options = " [-c]\n\t[-n databasenumber | -b suffix]\n"
+                       "\t[-l ldiffile] [-q] [-u] [-w]\n";
                break;
 
        case SLAPAUTH:
@@ -68,16 +71,16 @@ usage( int tool, const char *progname )
                break;
 
        case SLAPCAT:
-               options = "\n\t[-n databasenumber | -b suffix]"
-                       " [-l ldiffile] [-a filter] [-m] [-k]\n";
+               options = " [-c]\n\t[-n databasenumber | -b suffix]"
+                       " [-l ldiffile] [-a filter]\n";
                break;
 
        case SLAPDN:
-               options = " DN [...]\n";
+               options = "\n\t[-N | -P] DN [...]\n";
                break;
 
        case SLAPINDEX:
-               options = "\n\t[-n databasenumber | -b suffix]\n";
+               options = " [-c]\n\t[-n databasenumber | -b suffix] [-q]\n";
                break;
 
        case SLAPTEST:
@@ -91,6 +94,65 @@ usage( int tool, const char *progname )
        exit( EXIT_FAILURE );
 }
 
+static int
+parse_slapacl( void )
+{
+       size_t  len;
+       char    *p;
+
+       p = strchr( optarg, '=' );
+       if ( p == NULL ) {
+               return -1;
+       }
+
+       len = p - optarg;
+       p++;
+
+       if ( strncasecmp( optarg, "sockurl", len ) == 0 ) {
+               if ( !BER_BVISNULL( &listener_url ) ) {
+                       ber_memfree( listener_url.bv_val );
+               }
+               ber_str2bv( p, 0, 1, &listener_url );
+
+       } else if ( strncasecmp( optarg, "domain", len ) == 0 ) {
+               if ( !BER_BVISNULL( &peer_domain ) ) {
+                       ber_memfree( peer_domain.bv_val );
+               }
+               ber_str2bv( p, 0, 1, &peer_domain );
+
+       } else if ( strncasecmp( optarg, "peername", len ) == 0 ) {
+               if ( !BER_BVISNULL( &peer_name ) ) {
+                       ber_memfree( peer_name.bv_val );
+               }
+               ber_str2bv( p, 0, 1, &peer_name );
+
+       } else if ( strncasecmp( optarg, "sockname", len ) == 0 ) {
+               if ( !BER_BVISNULL( &sock_name ) ) {
+                       ber_memfree( sock_name.bv_val );
+               }
+               ber_str2bv( p, 0, 1, &sock_name );
+
+       } else if ( strncasecmp( optarg, "ssf", len ) == 0 ) {
+               ssf = atoi( p );
+
+       } else if ( strncasecmp( optarg, "transport_ssf", len ) == 0 ) {
+               transport_ssf = atoi( p );
+
+       } else if ( strncasecmp( optarg, "tls_ssf", len ) == 0 ) {
+               tls_ssf = atoi( p );
+
+       } else if ( strncasecmp( optarg, "sasl_ssf", len ) == 0 ) {
+               sasl_ssf = atoi( p );
+
+       } else if ( strncasecmp( optarg, "authzDN", len ) == 0 ) {
+               ber_str2bv( p, 0, 1, &authzDN );
+
+       } else {
+               return -1;
+       }
+
+       return 0;
+}
 
 /*
  * slap_tool_init - initialize slap utility, handle program options.
@@ -107,7 +169,8 @@ slap_tool_init(
        int argc, char **argv )
 {
        char *options;
-       char *conffile = SLAPD_DEFAULT_CONFIGFILE;
+       char *conffile = NULL;
+       char *confdir = NULL;
        struct berval base = BER_BVNULL;
        char *filterstr = NULL;
        char *subtree = NULL;
@@ -127,36 +190,36 @@ slap_tool_init(
 
        switch( tool ) {
        case SLAPADD:
-               options = "b:cd:f:i:l:n:prtuvWw";
+               options = "b:cd:f:F:l:n:qtuvw";
                break;
 
        case SLAPCAT:
-               options = "a:b:cd:f:kl:mn:s:v";
+               options = "a:b:cd:f:F:l:n:s:v";
                mode |= SLAP_TOOL_READMAIN | SLAP_TOOL_READONLY;
                break;
 
        case SLAPDN:
-               options = "d:f:v";
+               options = "d:f:F:NPv";
                mode |= SLAP_TOOL_READMAIN | SLAP_TOOL_READONLY;
                break;
 
        case SLAPTEST:
-               options = "d:f:uv";
+               options = "d:f:F:uv";
                mode |= SLAP_TOOL_READMAIN | SLAP_TOOL_READONLY;
                break;
 
        case SLAPAUTH:
-               options = "d:f:M:R:U:vX:";
+               options = "d:f:F:M:R:U:vX:";
                mode |= SLAP_TOOL_READMAIN | SLAP_TOOL_READONLY;
                break;
 
        case SLAPINDEX:
-               options = "b:cd:f:n:v";
+               options = "b:cd:f:F:n:qv";
                mode |= SLAP_TOOL_READMAIN;
                break;
 
        case SLAPACL:
-               options = "b:D:d:f:U:v";
+               options = "b:D:d:f:F:o:uU:vX:";
                mode |= SLAP_TOOL_READMAIN | SLAP_TOOL_READONLY;
                break;
 
@@ -192,53 +255,44 @@ 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, progname );
-                               exit( EXIT_FAILURE );
-                       }
-                       slap_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;
+               case 'F':       /* specify a conf dir */
+                       confdir = strdup( optarg );
                        break;
 
                case 'l':       /* LDIF file */
                        ldiffile = strdup( optarg );
                        break;
 
-               case 'm':       /* Retrieve ldapsync entry */
-                       retrieve_ctxcsn = 1;
-                       break;
-
                case 'M':
                        ber_str2bv( optarg, 0, 0, &mech );
                        break;
 
+               case 'N':
+                       if ( dn_mode && dn_mode != SLAP_TOOL_LDAPDN_NORMAL ) {
+                               usage( tool, progname );
+                       }
+                       dn_mode = SLAP_TOOL_LDAPDN_NORMAL;
+                       break;
+
                case 'n':       /* which config file db to index */
-                       dbnum = atoi( optarg ) - 1;
+                       dbnum = atoi( optarg );
                        break;
 
-               case 'p':       /* replica promotion */
-                       replica_promotion = 1;          
+               case 'o':
+                       if ( parse_slapacl() ) {
+                               usage( tool, progname );
+                       }
                        break;
 
-               case 'r':       /* replica demotion */
-                       replica_demotion = 1;           
+               case 'P':
+                       if ( dn_mode && dn_mode != SLAP_TOOL_LDAPDN_PRETTY ) {
+                               usage( tool, progname );
+                       }
+                       dn_mode = SLAP_TOOL_LDAPDN_PRETTY;
+                       break;
+
+               case 'q':       /* turn on quick */
+                       mode |= SLAP_TOOL_QUICK;
                        break;
 
                case 'R':
@@ -266,13 +320,8 @@ 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;
+               case 'w':       /* write context csn at the end */
+                       update_ctxcsn++;
                        break;
 
                case 'X':
@@ -293,14 +342,6 @@ slap_tool_init(
                        usage( tool, progname );
                }
 
-               if ( replica_promotion && replica_demotion ) {
-                       usage( tool, progname );
-
-               } else if ( !replica_promotion && !replica_demotion ) {
-                       if ( update_ctxcsn != SLAP_TOOL_CTXCSN_KEEP ) {
-                               usage( tool, progname );
-                       }
-               }
                break;
 
        case SLAPDN:
@@ -335,10 +376,13 @@ slap_tool_init(
                break;
        }
 
+       ldap_syslog = 0;
+
        if ( ldiffile == NULL ) {
-               ldiffp = tool == SLAPCAT ? stdout : stdin;
+               dummy.fp = tool == SLAPCAT ? stdout : stdin;
+               ldiffp = &dummy;
 
-       } else if ((ldiffp = fopen( ldiffile, tool == SLAPCAT ? "w" : "r" ))
+       } else if ((ldiffp = ldif_open( ldiffile, tool == SLAPCAT ? "w" : "r" ))
                == NULL )
        {
                perror( ldiffile );
@@ -356,17 +400,17 @@ slap_tool_init(
        }
 #endif
                
-       rc = slap_init( mode, progname );
+       rc = slap_schema_init();
 
        if ( rc != 0 ) {
-               fprintf( stderr, "%s: slap_init failed!\n", progname );
+               fprintf( stderr, "%s: slap_schema_init failed!\n", progname );
                exit( EXIT_FAILURE );
        }
 
-       rc = slap_schema_init();
+       rc = slap_init( mode, progname );
 
        if ( rc != 0 ) {
-               fprintf( stderr, "%s: slap_schema_init failed!\n", progname );
+               fprintf( stderr, "%s: slap_init failed!\n", progname );
                exit( EXIT_FAILURE );
        }
 
@@ -380,14 +424,14 @@ slap_tool_init(
                exit( EXIT_FAILURE );
        }
 
-       rc = read_config( conffile, 0 );
+       rc = read_config( conffile, confdir );
 
        if ( rc != 0 ) {
                fprintf( stderr, "%s: bad configuration file!\n", progname );
                exit( EXIT_FAILURE );
        }
 
-       ldap_syslog = 0;
+       at_oc_cache = 1;
 
        switch ( tool ) {
        case SLAPADD:
@@ -476,52 +520,63 @@ slap_tool_init(
                /* If the named base is a glue master, operate on the
                 * entire context
                 */
-               if (SLAP_GLUE_INSTANCE(be)) {
+               if ( SLAP_GLUE_INSTANCE( be ) ) {
                        nosubordinates = 1;
                }
 
        } else if ( dbnum == -1 ) {
+               /* no suffix and no dbnum specified, just default to
+                * the first available database
+                */
                if ( nbackends <= 0 ) {
                        fprintf( stderr, "No available databases\n" );
                        exit( EXIT_FAILURE );
                }
+               LDAP_STAILQ_FOREACH( be, &backendDB, be_next ) {
+                       dbnum++;
+
+                       /* db #0 is cn=config, don't select it as a default */
+                       if ( dbnum < 1 ) continue;
                
-               be = &backends[dbnum=0];
+                       if ( SLAP_MONITOR(be))
+                               continue;
+
                /* If just doing the first by default and it is a
                 * glue subordinate, find the master.
                 */
-               while (SLAP_GLUE_SUBORDINATE(be) || SLAP_MONITOR(be)) {
-                       if (SLAP_GLUE_SUBORDINATE(be)) {
+                       if ( SLAP_GLUE_SUBORDINATE(be) ) {
                                nosubordinates = 1;
+                               continue;
                        }
-                       be++;
-                       dbnum++;
+                       break;
                }
 
-
-               if ( dbnum >= nbackends ) {
+               if ( !be ) {
                        fprintf( stderr, "Available database(s) "
                                        "do not allow %s\n", progname );
                        exit( EXIT_FAILURE );
                }
                
-               if ( nosubordinates == 0 && dbnum > 0 ) {
+               if ( nosubordinates == 0 && dbnum > 1 ) {
                        Debug( LDAP_DEBUG_ANY,
                                "The first database does not allow %s;"
                                " using the first available one (%d)\n",
-                               progname, dbnum + 1, 0 );
+                               progname, dbnum, 0 );
                }
 
        } else if ( dbnum < 0 || dbnum > (nbackends-1) ) {
                fprintf( stderr,
                        "Database number selected via -n is out of range\n"
-                       "Must be in the range 1 to %d"
-                       " (number of databases in the config file)\n",
-                       nbackends );
+                       "Must be in the range 0 to %d"
+                       " (number of configured databases)\n",
+                       nbackends-1 );
                exit( EXIT_FAILURE );
 
        } else {
-               be = &backends[dbnum];
+               LDAP_STAILQ_FOREACH( be, &backendDB, be_next ) {
+                       if ( dbnum == 0 ) break;
+                       dbnum--;
+               }
        }
 
 startup:;
@@ -530,8 +585,8 @@ startup:;
        mal_leaktrace(1);
 #endif
 
-       if ( !dryrun && slap_startup( be ) ) {
-
+       /* slapdn doesn't specify a backend to startup */
+       if ( !dryrun && tool != SLAPDN && slap_startup( be ) ) {
                switch ( tool ) {
                case SLAPTEST:
                        fprintf( stderr, "slap_startup failed "
@@ -550,10 +605,10 @@ startup:;
 
 void slap_tool_destroy( void )
 {
-       if ( !dryrun && be != NULL ) {
+       if ( !dryrun ) {
                slap_shutdown( be );
+               slap_destroy();
        }
-       slap_destroy();
 #ifdef SLAPD_MODULES
        if ( slapMode == SLAP_SERVER_MODE ) {
        /* always false. just pulls in necessary symbol references. */