#include "lutil.h"
#include "back-bdb.h"
-#ifdef SLAPD_MONITOR
-
#include "../back-monitor/back-monitor.h"
static ObjectClass *oc_olmBDBDatabase;
};
static struct {
- char *name;
char *desc;
AttributeDescription **ad;
} s_at[] = {
- { "olmBDBEntryCache", "( olmBDBAttributes:1 "
+ { "( olmBDBAttributes:1 "
"NAME ( 'olmBDBEntryCache' ) "
"DESC 'Number of items in Entry Cache' "
"SUP monitorCounter "
"USAGE directoryOperation )",
&ad_olmBDBEntryCache },
- { "olmBDBEntryInfo", "( olmBDBAttributes:2 "
+ { "( olmBDBAttributes:2 "
"NAME ( 'olmBDBEntryInfo' ) "
"DESC 'Number of items in EntryInfo Cache' "
"SUP monitorCounter "
"USAGE directoryOperation )",
&ad_olmBDBEntryInfo },
- { "olmBDBIDLCache", "( olmBDBAttributes:3 "
+ { "( olmBDBAttributes:3 "
"NAME ( 'olmBDBIDLCache' ) "
"DESC 'Number of items in IDL Cache' "
"SUP monitorCounter "
"USAGE directoryOperation )",
&ad_olmBDBIDLCache },
- { "olmDbDirectory", "( olmBDBAttributes:4 "
+ { "( olmBDBAttributes:4 "
"NAME ( 'olmDbDirectory' ) "
"DESC 'Path name of the directory "
"where the database environment resides' "
};
static struct {
- char *name;
char *desc;
ObjectClass **oc;
} s_oc[] = {
/* augments an existing object, so it must be AUXILIARY
* FIXME: derive from some ABSTRACT "monitoredEntity"? */
- { "olmBDBDatabase", "( olmBDBObjectClasses:1 "
+ { "( olmBDBObjectClasses:1 "
"NAME ( 'olmBDBDatabase' ) "
"SUP top AUXILIARY "
"MAY ( "
int i, rc;
+ /* NOTE: if slap_shutdown != 0, priv might have already been freed */
+
/* Remove objectClass */
mod.sm_op = LDAP_MOD_DELETE;
mod.sm_desc = slap_schema.si_ad_objectClass;
/* don't care too much about return code... */
/* remove attrs */
- for ( i = 0; s_at[ i ].name != NULL; i++ ) {
+ for ( i = 0; s_at[ i ].desc != NULL; i++ ) {
mod.sm_desc = *s_at[ i ].ad;
mod.sm_values = NULL;
rc = modify_delete_values( e, &mod, 1, &text,
return SLAP_CB_CONTINUE;
}
-#endif /* SLAPD_MONITOR */
-
/*
* call from within bdb_initialize()
*/
-int
+static int
bdb_monitor_initialize( void )
{
-#ifdef SLAPD_MONITOR
int i, code;
- const char *err;
static int bdb_monitor_initialized = 0;
- /* register schema here; if compiled as dynamic object,
- * must be loaded __after__ back_monitor.la */
+ if ( backend_info( "monitor" ) == NULL ) {
+ return -1;
+ }
if ( bdb_monitor_initialized++ ) {
return 0;
}
+ /* register schema here */
+
for ( i = 0; s_oid[ i ].name; i++ ) {
char *argv[ 3 ];
}
}
- for ( i = 0; s_at[ i ].name != NULL; i++ ) {
- LDAPAttributeType *at;
-
- at = ldap_str2attributetype( s_at[ i ].desc,
- &code, &err, LDAP_SCHEMA_ALLOW_ALL );
- if ( !at ) {
- Debug( LDAP_DEBUG_ANY,
- "bdb_monitor_initialize: "
- "AttributeType load failed: %s %s\n",
- ldap_scherr2str( code ), err, 0 );
- return LDAP_INVALID_SYNTAX;
- }
-
- code = at_add( at, 0, NULL, &err );
- if ( code != LDAP_SUCCESS ) {
- Debug( LDAP_DEBUG_ANY,
- "bdb_monitor_initialize: "
- "AttributeType load failed: %s %s\n",
- scherr2str( code ), err, 0 );
- code = LDAP_INVALID_SYNTAX;
- goto done_at;
- }
-
- code = slap_str2ad( s_at[ i ].name,
- s_at[ i ].ad, &err );
+ for ( i = 0; s_at[ i ].desc != NULL; i++ ) {
+ code = register_at( s_at[ i ].desc, s_at[ i ].ad, 1 );
if ( code != LDAP_SUCCESS ) {
Debug( LDAP_DEBUG_ANY,
- "bdb_monitor_initialize: "
- "unable to find AttributeDescription "
- "\"%s\": %d (%s)\n",
- s_at[ i ].name, code, err );
- code = LDAP_UNDEFINED_TYPE;
- goto done_at;
- }
-
-done_at:;
- if ( code ) {
- ldap_attributetype_free( at );
- return code;
+ "bdb_monitor_initialize: register_at failed\n",
+ 0, 0, 0 );
}
-
- ldap_memfree( at );
}
- for ( i = 0; s_oc[ i ].name != NULL; i++ ) {
- LDAPObjectClass *oc;
-
- oc = ldap_str2objectclass( s_oc[ i ].desc,
- &code, &err, LDAP_SCHEMA_ALLOW_ALL );
- if ( !oc ) {
- Debug( LDAP_DEBUG_ANY,
- "bdb_monitor_initialize: "
- "ObjectClass load failed: %s %s\n",
- ldap_scherr2str( code ), err, 0 );
- return LDAP_INVALID_SYNTAX;
- }
-
- code = oc_add( oc, 0, NULL, &err );
+ for ( i = 0; s_oc[ i ].desc != NULL; i++ ) {
+ code = register_oc( s_oc[ i ].desc, s_oc[ i ].oc, 1 );
if ( code != LDAP_SUCCESS ) {
Debug( LDAP_DEBUG_ANY,
- "bdb_monitor_initialize: "
- "ObjectClass load failed: %s %s\n",
- scherr2str( code ), err, 0 );
- code = LDAP_INVALID_SYNTAX;
- goto done_oc;
- }
-
- *s_oc[ i ].oc = oc_find( s_oc[ i ].name );
- if ( *s_oc[ i ].oc == NULL ) {
- code = LDAP_UNDEFINED_TYPE;
- Debug( LDAP_DEBUG_ANY,
- "bdb_monitor_initialize: "
- "unable to find objectClass \"%s\"\n",
- s_oc[ i ].name, 0, 0 );
- goto done_oc;
- }
-
-done_oc:;
- if ( code != LDAP_SUCCESS ) {
- ldap_objectclass_free( oc );
- return code;
+ "bdb_monitor_initialize: register_oc failed\n",
+ 0, 0, 0 );
}
-
- ldap_memfree( oc );
}
-#endif /* SLAPD_MONITOR */
return 0;
}
* call from within bdb_db_init()
*/
int
-bdb_monitor_init( BackendDB *be )
+bdb_monitor_db_init( BackendDB *be )
{
-#ifdef SLAPD_MONITOR
- SLAP_DBFLAGS( be ) |= SLAP_DBFLAG_MONITORING;
-#endif /* SLAPD_MONITOR */
+ struct bdb_info *bdb = (struct bdb_info *) be->be_private;
+
+ if ( bdb_monitor_initialize() == LDAP_SUCCESS ) {
+ /* monitoring in back-bdb is on by default */
+ SLAP_DBFLAGS( be ) |= SLAP_DBFLAG_MONITORING;
+ }
+
+ bdb->bi_monitor.bdm_scope = -1;
return 0;
}
* call from within bdb_db_open()
*/
int
-bdb_monitor_open( BackendDB *be )
+bdb_monitor_db_open( BackendDB *be )
{
-#ifdef SLAPD_MONITOR
struct bdb_info *bdb = (struct bdb_info *) be->be_private;
Attribute *a, *next;
monitor_callback_t *cb = NULL;
struct berval suffix, *filter, *base;
char *ptr;
int rc = 0;
+ BackendInfo *mi;
+ monitor_extra_t *mbe;
if ( !SLAP_DBMONITORING( be ) ) {
return 0;
}
+ mi = backend_info( "monitor" );
+ if ( !mi || !mi->bi_extra ) {
+ SLAP_DBFLAGS( be ) ^= SLAP_DBFLAG_MONITORING;
+ return 0;
+ }
+ mbe = mi->bi_extra;
+
/* don't bother if monitor is not configured */
- if ( !monitor_back_is_configured() ) {
+ if ( !mbe->is_configured() ) {
static int warning = 0;
if ( warning++ == 0 ) {
return 0;
}
- bdb->bi_monitor.bdm_scope = LDAP_SCOPE_SUBORDINATE;
+ if ( bdb->bi_monitor.bdm_scope == -1 ) {
+ bdb->bi_monitor.bdm_scope = LDAP_SCOPE_ONELEVEL;
+ }
base = &bdb->bi_monitor.bdm_nbase;
BER_BVSTR( base, "cn=databases,cn=monitor" );
filter = &bdb->bi_monitor.bdm_filter;
} else {
ldap_bv2escaped_filter_value( &be->be_nsuffix[ 0 ], &suffix );
}
-
- filter->bv_len = STRLENOF( "(&(monitoredInfo=" )
- + strlen( be->bd_info->bi_type )
- + STRLENOF( ")(namingContexts:distinguishedNameMatch:=" )
- + suffix.bv_len + STRLENOF( "))" );
+
+ /* just look for the naming context */
+ filter->bv_len = STRLENOF( "(namingContexts:distinguishedNameMatch:=" )
+ + suffix.bv_len + STRLENOF( ")" );
ptr = filter->bv_val = ch_malloc( filter->bv_len + 1 );
- ptr = lutil_strcopy( ptr, "(&(monitoredInfo=" );
- ptr = lutil_strcopy( ptr, be->bd_info->bi_type );
- ptr = lutil_strcopy( ptr, ")(namingContexts:distinguishedNameMatch:=" );
+ ptr = lutil_strcopy( ptr, "(namingContexts:distinguishedNameMatch:=" );
ptr = lutil_strncopy( ptr, suffix.bv_val, suffix.bv_len );
- ptr = lutil_strcopy( ptr, "))" );
+ ptr = lutil_strcopy( ptr, ")" );
ptr[ 0 ] = '\0';
assert( filter->bv_len == ptr - filter->bv_val );
cb = ch_calloc( sizeof( monitor_callback_t ), 1 );
cb->mc_update = bdb_monitor_update;
+#if 0 /* uncomment if required */
cb->mc_modify = bdb_monitor_modify;
+#endif
cb->mc_free = bdb_monitor_free;
cb->mc_private = (void *)bdb;
- rc = monitor_back_register_entry_attrs( NULL, a, cb,
- base, LDAP_SCOPE_SUBORDINATE, filter );
+ rc = mbe->register_entry_attrs( NULL, a, cb,
+ base, bdb->bi_monitor.bdm_scope, filter );
cleanup:;
if ( rc != 0 ) {
}
return rc;
-#else /* !SLAPD_MONITOR */
- return 0;
-#endif /* SLAPD_MONITOR */
}
/*
* call from within bdb_db_close()
*/
int
-bdb_monitor_close( BackendDB *be )
+bdb_monitor_db_close( BackendDB *be )
{
-#ifdef SLAPD_MONITOR
struct bdb_info *bdb = (struct bdb_info *) be->be_private;
if ( !BER_BVISNULL( &bdb->bi_monitor.bdm_filter ) ) {
- monitor_back_unregister_entry_callback( NULL,
- (monitor_callback_t *)bdb->bi_monitor.bdm_cb,
- &bdb->bi_monitor.bdm_nbase,
- bdb->bi_monitor.bdm_scope,
- &bdb->bi_monitor.bdm_filter );
+ BackendInfo *mi = backend_info( "monitor" );
+ monitor_extra_t *mbe;
+
+ if ( mi && &mi->bi_extra ) {
+ mbe = mi->bi_extra;
+ mbe->unregister_entry_callback( NULL,
+ (monitor_callback_t *)bdb->bi_monitor.bdm_cb,
+ &bdb->bi_monitor.bdm_nbase,
+ bdb->bi_monitor.bdm_scope,
+ &bdb->bi_monitor.bdm_filter );
+ }
if ( !BER_BVISNULL( &bdb->bi_monitor.bdm_filter ) ) {
ch_free( bdb->bi_monitor.bdm_filter.bv_val );
memset( &bdb->bi_monitor, 0, sizeof( bdb->bi_monitor ) );
}
-#endif /* SLAPD_MONITOR */
return 0;
}
* call from within bdb_db_destroy()
*/
int
-bdb_monitor_destroy( BackendDB *be )
+bdb_monitor_db_destroy( BackendDB *be )
{
return 0;
}