]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/bconfig.c
some overlay (rwm?) might set those values
[openldap] / servers / slapd / bconfig.c
index 003b4d61a069b7a34e0092ea5b4579468bd994b6..0ed3bc41b677dda793ee0c6c0ca5d063de565061 100644 (file)
@@ -163,6 +163,7 @@ enum {
        CFG_TTHREADS,
        CFG_MIRRORMODE,
        CFG_HIDDEN,
+       CFG_MONITORING,
 
        CFG_LAST
 };
@@ -382,6 +383,10 @@ static ConfigTable config_back_cf_table[] = {
 #endif
                "( OLcfgGlAt:31 NAME 'olcModulePath' "
                        "SYNTAX OMsDirectoryString SINGLE-VALUE )", NULL, NULL },
+       { "monitoring", "TRUE|FALSE", 2, 2, 0,
+               ARG_MAGIC|CFG_MONITORING|ARG_DB|ARG_ON_OFF, &config_generic,
+               "( OLcfgDbAt:0.18 NAME 'olcMonitoring' "
+                       "SYNTAX OMsBoolean SINGLE-VALUE )", NULL, NULL },
        { "objectclass", "objectclass", 2, 0, 0, ARG_PAREN|ARG_MAGIC|CFG_OC|ARG_NO_DELETE|ARG_NO_INSERT,
                &config_generic, "( OLcfgGlAt:32 NAME 'olcObjectClasses' "
                "DESC 'OpenLDAP object classes' "
@@ -704,7 +709,8 @@ static ConfigOCs cf_ocs[] = {
                 "olcReplicaArgsFile $ olcReplicaPidFile $ olcReplicationInterval $ "
                 "olcReplogFile $ olcRequires $ olcRestrict $ olcRootDN $ olcRootPW $ "
                 "olcSchemaDN $ olcSecurity $ olcSizeLimit $ olcSyncrepl $ "
-                "olcTimeLimit $ olcUpdateDN $ olcUpdateRef $ olcMirrorMode ) )",
+                "olcTimeLimit $ olcUpdateDN $ olcUpdateRef $ olcMirrorMode $ "
+                "olcMonitoring ) )",
                        Cft_Database, NULL, cfAddDatabase },
        { "( OLcfgGlOc:5 "
                "NAME 'olcOverlayConfig' "
@@ -941,6 +947,9 @@ config_generic(ConfigArgs *c) {
                        else
                                rc = 1;
                        break;
+               case CFG_MONITORING:
+                       c->value_int = (SLAP_DBMONITORING(c->be) != 0);
+                       break;
                case CFG_SSTR_IF_MAX:
                        c->value_int = index_substr_if_maxlen;
                        break;
@@ -1028,6 +1037,7 @@ config_generic(ConfigArgs *c) {
                case CFG_DEPTH:
                case CFG_LASTMOD:
                case CFG_MIRRORMODE:
+               case CFG_MONITORING:
                case CFG_SASLSECP:
                case CFG_SSTR_IF_MAX:
                case CFG_SSTR_IF_MIN:
@@ -1418,6 +1428,13 @@ config_generic(ConfigArgs *c) {
                                SLAP_DBFLAGS(c->be) |= SLAP_DBFLAG_SINGLE_SHADOW;
                        break;
 
+               case CFG_MONITORING:
+                       if(c->value_int)
+                               SLAP_DBFLAGS(c->be) |= SLAP_DBFLAG_MONITORING;
+                       else
+                               SLAP_DBFLAGS(c->be) &= ~SLAP_DBFLAG_MONITORING;
+                       break;
+
                case CFG_HIDDEN:
                        if (c->value_int)
                                SLAP_DBFLAGS(c->be) |= SLAP_DBFLAG_HIDDEN;
@@ -2041,7 +2058,7 @@ config_restrict(ConfigArgs *c) {
                { BER_BVC("compare"),           SLAP_RESTRICT_OP_COMPARE },
                { BER_BVC("read"),              SLAP_RESTRICT_OP_READS },
                { BER_BVC("write"),             SLAP_RESTRICT_OP_WRITES },
-               { BER_BVC("extended"),  SLAP_RESTRICT_OP_EXTENDED },
+               { BER_BVC("extended"),          SLAP_RESTRICT_OP_EXTENDED },
                { BER_BVC("extended=" LDAP_EXOP_START_TLS ),            SLAP_RESTRICT_EXOP_START_TLS },
                { BER_BVC("extended=" LDAP_EXOP_MODIFY_PASSWD ),        SLAP_RESTRICT_EXOP_MODIFY_PASSWD },
                { BER_BVC("extended=" LDAP_EXOP_X_WHO_AM_I ),           SLAP_RESTRICT_EXOP_WHOAMI },
@@ -2145,8 +2162,10 @@ config_disallows(ConfigArgs *c) {
 
 static int
 config_requires(ConfigArgs *c) {
-       slap_mask_t requires = 0;
-       int i;
+       slap_mask_t requires = frontendDB->be_requires;
+       int i, argc = c->argc;
+       char **argv = c->argv;
+
        slap_verbmasks requires_ops[] = {
                { BER_BVC("bind"),              SLAP_REQUIRE_BIND },
                { BER_BVC("LDAPv3"),            SLAP_REQUIRE_LDAP_V3 },
@@ -2166,11 +2185,23 @@ config_requires(ConfigArgs *c) {
                }
                return 0;
        }
-       i = verbs_to_mask(c->argc, c->argv, requires_ops, &requires);
+       /* "none" can only be first, to wipe out default/global values */
+       if ( strcasecmp( c->argv[ 1 ], "none" ) == 0 ) {
+               argv++;
+               argc--;
+               requires = 0;
+       }
+       i = verbs_to_mask(argc, argv, requires_ops, &requires);
        if ( i ) {
-               snprintf( c->msg, sizeof( c->msg ), "<%s> unknown feature", c->argv[0] );
-               Debug(LDAP_DEBUG_ANY, "%s: %s %s\n",
-                       c->log, c->msg, c->argv[i]);
+               if (strcasecmp( c->argv[ i ], "none" ) == 0 ) {
+                       snprintf( c->msg, sizeof( c->msg ), "<%s> \"none\" (#%d) must be listed first", c->argv[0], i - 1 );
+                       Debug(LDAP_DEBUG_ANY, "%s: %s\n",
+                               c->log, c->msg, 0);
+               } else {
+                       snprintf( c->msg, sizeof( c->msg ), "<%s> unknown feature #%d", c->argv[0], i - 1 );
+                       Debug(LDAP_DEBUG_ANY, "%s: %s \"%s\"\n",
+                               c->log, c->msg, c->argv[i]);
+               }
                return(1);
        }
        c->be->be_requires = requires;
@@ -2327,6 +2358,28 @@ loglevel2bvarray( int l, BerVarray *bva )
        return mask_to_verbs( loglevel_ops, l, bva );
 }
 
+int
+loglevel_print( FILE *out )
+{
+       int     i;
+
+       if ( loglevel_ops == NULL ) {
+               loglevel_init();
+       }
+
+       fprintf( out, "Installed log subsystems:\n\n" );
+       for ( i = 0; !BER_BVISNULL( &loglevel_ops[ i ].word ); i++ ) {
+               fprintf( out, "\t%-30s (%d)\n",
+                       loglevel_ops[ i ].word.bv_val,
+                       loglevel_ops[ i ].mask );
+       }
+
+       fprintf( out, "\nNOTE: custom log subsystems may be later installed "
+               "by specific code\n\n" );
+
+       return 0;
+}
+
 static int config_syslog;
 
 static int
@@ -2616,6 +2669,8 @@ config_replica(ConfigArgs *c) {
                        nr = add_replica_info(c->be, replicauri, replicahost);
                        break;
                } else if(!strncasecmp(c->argv[i], "uri=", STRLENOF("uri="))) {
+                       ber_len_t       len;
+
                        if ( replicauri ) {
                                snprintf( c->msg, sizeof( c->msg ), "<%s> replica host/URI already specified", c->argv[0] );
                                Debug(LDAP_DEBUG_ANY, "%s: %s \"%s\"\n", c->log, c->msg, replicauri );
@@ -2634,11 +2689,28 @@ config_replica(ConfigArgs *c) {
                                Debug(LDAP_DEBUG_ANY, "%s: %s\n", c->log, c->msg, 0 );
                                return(1);
                        }
+
+                       len = strlen(ludp->lud_scheme) + strlen(ludp->lud_host) +
+                               STRLENOF("://") + 1;
+                       if (ludp->lud_port != LDAP_PORT) {
+                               if (ludp->lud_port < 1 || ludp->lud_port > 65535) {
+                                       ldap_free_urldesc(ludp);
+                                       snprintf( c->msg, sizeof( c->msg ), "<%s> invalid port",
+                                               c->argv[0] );
+                                       Debug(LDAP_DEBUG_ANY, "%s: %s\n", c->log, c->msg, 0 );
+                                       return(1);
+                               }
+                               len += STRLENOF(":65535");
+                       }
+                       replicauri = ch_malloc( len );
+                       replicahost = lutil_strcopy( replicauri, ludp->lud_scheme );
+                       replicahost = lutil_strcopy( replicahost, "://" );
+                       if (ludp->lud_port == LDAP_PORT) {
+                               strcpy( replicahost, ludp->lud_host );
+                       } else {
+                               sprintf( replicahost, "%s:%d",ludp->lud_host,ludp->lud_port );
+                       }
                        ldap_free_urldesc(ludp);
-                       replicauri = c->argv[i] + STRLENOF("uri=");
-                       replicauri = ch_strdup( replicauri );
-                       replicahost = strchr( replicauri, '/' );
-                       replicahost += 2;
                        nr = add_replica_info(c->be, replicauri, replicahost);
                        break;
                }
@@ -4370,7 +4442,7 @@ Entry *
 config_build_entry( Operation *op, SlapReply *rs, CfEntryInfo *parent,
        ConfigArgs *c, struct berval *rdn, ConfigOCs *main, ConfigOCs *extra )
 {
-       Entry *e = ch_calloc( 1, sizeof(Entry) );
+       Entry *e = entry_alloc();
        CfEntryInfo *ce = ch_calloc( 1, sizeof(CfEntryInfo) );
        struct berval val;
        struct berval ad_name;
@@ -4647,6 +4719,7 @@ config_back_db_open( BackendDB *be )
                return -1;
        }
        ce = e->e_private;
+       ce->ce_private = cfb->cb_config;
 
        /* Create schema nodes for included schema... */
        if ( cfb->cb_config->c_kids ) {