/* $OpenLDAP$ */
/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
*
- * Copyright 2000-2006 The OpenLDAP Foundation.
+ * Copyright 2000-2007 The OpenLDAP Foundation.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
#include "../back-monitor/back-monitor.h"
+#include "config.h"
+
static ObjectClass *oc_olmBDBDatabase;
static AttributeDescription *ad_olmBDBEntryCache,
"DESC 'Number of items in Entry Cache' "
"SUP monitorCounter "
"NO-USER-MODIFICATION "
- "USAGE directoryOperation )",
+ "USAGE dSAOperation )",
&ad_olmBDBEntryCache },
{ "( olmBDBAttributes:2 "
"DESC 'Number of items in EntryInfo Cache' "
"SUP monitorCounter "
"NO-USER-MODIFICATION "
- "USAGE directoryOperation )",
+ "USAGE dSAOperation )",
&ad_olmBDBEntryInfo },
{ "( olmBDBAttributes:3 "
"DESC 'Number of items in IDL Cache' "
"SUP monitorCounter "
"NO-USER-MODIFICATION "
- "USAGE directoryOperation )",
+ "USAGE dSAOperation )",
&ad_olmBDBIDLCache },
{ "( olmBDBAttributes:4 "
"where the database environment resides' "
"SUP monitoredInfo "
"NO-USER-MODIFICATION "
- "USAGE directoryOperation )",
+ "USAGE dSAOperation )",
&ad_olmDbDirectory },
{ NULL }
return SLAP_CB_CONTINUE;
}
+#if 0 /* uncomment if required */
static int
bdb_monitor_modify(
Operation *op,
{
return SLAP_CB_CONTINUE;
}
+#endif
static int
bdb_monitor_free(
Entry *e,
- void *priv )
+ void **priv )
{
struct berval values[ 2 ];
Modification mod = { 0 };
int i, rc;
+ /* NOTE: if slap_shutdown != 0, priv might have already been freed */
+ *priv = NULL;
+
/* Remove objectClass */
mod.sm_op = LDAP_MOD_DELETE;
mod.sm_desc = slap_schema.si_ad_objectClass;
return SLAP_CB_CONTINUE;
}
+#define bdb_monitor_initialize BDB_SYMBOL(monitor_initialize)
+
/*
* call from within bdb_initialize()
*/
-int
+static int
bdb_monitor_initialize( void )
{
int i, code;
- BackendInfo *bi;
+ ConfigArgs c;
+ char *argv[ 3 ];
static int bdb_monitor_initialized = 0;
- bi = backend_info("monitor");
- if ( !bi )
+ if ( backend_info( "monitor" ) == NULL ) {
return -1;
-
- /* register schema here */
+ }
if ( bdb_monitor_initialized++ ) {
return 0;
}
+ /* register schema here */
+
+ argv[ 0 ] = "back-bdb/back-hdb monitor";
+ c.argv = argv;
+ c.argc = 3;
+ c.fname = argv[0];
+
for ( i = 0; s_oid[ i ].name; i++ ) {
- char *argv[ 3 ];
-
- argv[ 0 ] = "back-bdb/back-hdb monitor";
+ c.lineno = i;
argv[ 1 ] = s_oid[ i ].name;
argv[ 2 ] = s_oid[ i ].oid;
- if ( parse_oidm( argv[ 0 ], i, 3, argv, 0, NULL ) != 0 ) {
+ if ( parse_oidm( &c, 0, NULL ) != 0 ) {
Debug( LDAP_DEBUG_ANY,
"bdb_monitor_initialize: unable to add "
"objectIdentifier \"%s=%s\"\n",
* call from within bdb_db_init()
*/
int
-bdb_monitor_init( BackendDB *be )
+bdb_monitor_db_init( BackendDB *be )
{
+ 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 )
{
struct bdb_info *bdb = (struct bdb_info *) be->be_private;
Attribute *a, *next;
struct berval suffix, *filter, *base;
char *ptr;
int rc = 0;
- monitor_extra_t *mbe;
+ BackendInfo *mi;
+ monitor_extra_t *mbe;
if ( !SLAP_DBMONITORING( be ) ) {
return 0;
}
- {
- BackendInfo *mi = backend_info( "monitor" );
- if ( !mi || !mi->bi_extra ) {
- SLAP_DBFLAGS( be ) ^= SLAP_DBFLAG_MONITORING;
- return 0;
- }
- mbe = mi->bi_extra;
+ 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 ( !mbe->is_configured() ) {
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( "))" );
- 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_strncopy( ptr, suffix.bv_val, suffix.bv_len );
- ptr = lutil_strcopy( ptr, "))" );
+
+ if ( BER_BVISEMPTY( &suffix ) ) {
+ /* frontend also has empty suffix, sigh! */
+ filter->bv_len = STRLENOF( "(&(namingContexts:distinguishedNameMatch:=" )
+ + suffix.bv_len + STRLENOF( ")(!(cn=frontend)))" );
+ ptr = filter->bv_val = ch_malloc( filter->bv_len + 1 );
+ ptr = lutil_strcopy( ptr, "(&(namingContexts:distinguishedNameMatch:=" );
+ ptr = lutil_strncopy( ptr, suffix.bv_val, suffix.bv_len );
+ ptr = lutil_strcopy( ptr, ")(!(cn=frontend)))" );
+
+ } else {
+ /* 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, "(namingContexts:distinguishedNameMatch:=" );
+ ptr = lutil_strncopy( ptr, suffix.bv_val, suffix.bv_len );
+ 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 = mbe->register_entry_attrs( NULL, a, cb,
- base, LDAP_SCOPE_SUBORDINATE, filter );
+ base, bdb->bi_monitor.bdm_scope, filter );
cleanup:;
if ( rc != 0 ) {
* call from within bdb_db_close()
*/
int
-bdb_monitor_close( BackendDB *be )
+bdb_monitor_db_close( BackendDB *be )
{
struct bdb_info *bdb = (struct bdb_info *) be->be_private;
if ( !BER_BVISNULL( &bdb->bi_monitor.bdm_filter ) ) {
- BackendInfo *mi = backend_info( "monitor" );
- monitor_extra_t *mbe;
-
- if ( !mi || !mi->bi_extra )
- return 0;
- 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 );
+ 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 );
* call from within bdb_db_destroy()
*/
int
-bdb_monitor_destroy( BackendDB *be )
+bdb_monitor_db_destroy( BackendDB *be )
{
return 0;
}