X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fback-monitor%2Finit.c;h=04ce6664ca9641039018e1b33ffd1aebb0c263c8;hb=e178624b422dff28a8ffea846376e8049c7e4e04;hp=5b46dca3026eaba9081698b3e2c7b28f2fe80890;hpb=95f1740aa6bad5df15552a05c7a1d78ba62d0995;p=openldap diff --git a/servers/slapd/back-monitor/init.c b/servers/slapd/back-monitor/init.c index 5b46dca302..04ce6664ca 100644 --- a/servers/slapd/back-monitor/init.c +++ b/servers/slapd/back-monitor/init.c @@ -1,12 +1,9 @@ /* init.c - initialize monitor backend */ /* - * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved. + * Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved. * COPYING RESTRICTIONS APPLY, see COPYRIGHT file */ /* - * Copyright 2001 The OpenLDAP Foundation, All Rights Reserved. - * COPYING RESTRICTIONS APPLY, see COPYRIGHT file - * * Copyright 2001, Pierangelo Masarati, All rights reserved. * * This work has beed deveolped for the OpenLDAP Foundation @@ -37,19 +34,17 @@ #include "portable.h" #include +#include #include "slap.h" +#include "lber_pvt.h" #include "back-monitor.h" -/* - * database monitor can be defined once only - */ -static int monitor_defined = 0; - /* * used by many functions to add description to entries */ AttributeDescription *monitor_ad_desc = NULL; +BackendDB *be_monitor = NULL; /* * subsystem data @@ -57,15 +52,15 @@ AttributeDescription *monitor_ad_desc = NULL; struct monitorsubsys monitor_subsys[] = { { SLAPD_MONITOR_LISTENER, SLAPD_MONITOR_LISTENER_NAME, - NULL, NULL, NULL, - MONITOR_F_NONE, - NULL, /* init */ + BER_BVNULL, BER_BVNULL, BER_BVNULL, + MONITOR_F_PERSISTENT_CH, + monitor_subsys_listener_init, NULL, /* update */ NULL, /* create */ NULL /* modify */ }, { SLAPD_MONITOR_DATABASE, SLAPD_MONITOR_DATABASE_NAME, - NULL, NULL, NULL, + BER_BVNULL, BER_BVNULL, BER_BVNULL, MONITOR_F_PERSISTENT_CH, monitor_subsys_database_init, NULL, /* update */ @@ -73,7 +68,7 @@ struct monitorsubsys monitor_subsys[] = { NULL /* modify */ }, { SLAPD_MONITOR_BACKEND, SLAPD_MONITOR_BACKEND_NAME, - NULL, NULL, NULL, + BER_BVNULL, BER_BVNULL, BER_BVNULL, MONITOR_F_PERSISTENT_CH, monitor_subsys_backend_init, NULL, /* update */ @@ -81,7 +76,7 @@ struct monitorsubsys monitor_subsys[] = { NULL /* modify */ }, { SLAPD_MONITOR_THREAD, SLAPD_MONITOR_THREAD_NAME, - NULL, NULL, NULL, + BER_BVNULL, BER_BVNULL, BER_BVNULL, MONITOR_F_NONE, monitor_subsys_thread_init, monitor_subsys_thread_update, @@ -89,7 +84,7 @@ struct monitorsubsys monitor_subsys[] = { NULL /* modify */ }, { SLAPD_MONITOR_SASL, SLAPD_MONITOR_SASL_NAME, - NULL, NULL, NULL, + BER_BVNULL, BER_BVNULL, BER_BVNULL, MONITOR_F_NONE, NULL, /* init */ NULL, /* update */ @@ -97,7 +92,7 @@ struct monitorsubsys monitor_subsys[] = { NULL /* modify */ }, { SLAPD_MONITOR_TLS, SLAPD_MONITOR_TLS_NAME, - NULL, NULL, NULL, + BER_BVNULL, BER_BVNULL, BER_BVNULL, MONITOR_F_NONE, NULL, /* init */ NULL, /* update */ @@ -105,7 +100,7 @@ struct monitorsubsys monitor_subsys[] = { NULL /* modify */ }, { SLAPD_MONITOR_CONN, SLAPD_MONITOR_CONN_NAME, - NULL, NULL, NULL, + BER_BVNULL, BER_BVNULL, BER_BVNULL, MONITOR_F_VOLATILE_CH, monitor_subsys_conn_init, monitor_subsys_conn_update, @@ -113,7 +108,7 @@ struct monitorsubsys monitor_subsys[] = { NULL /* modify */ }, { SLAPD_MONITOR_READW, SLAPD_MONITOR_READW_NAME, - NULL, NULL, NULL, + BER_BVNULL, BER_BVNULL, BER_BVNULL, MONITOR_F_NONE, NULL, /* init */ monitor_subsys_readw_update, @@ -121,7 +116,7 @@ struct monitorsubsys monitor_subsys[] = { NULL /* modify */ }, { SLAPD_MONITOR_WRITEW, SLAPD_MONITOR_WRITEW_NAME, - NULL, NULL, NULL, + BER_BVNULL, BER_BVNULL, BER_BVNULL, MONITOR_F_NONE, NULL, /* init */ monitor_subsys_writew_update, @@ -129,15 +124,55 @@ struct monitorsubsys monitor_subsys[] = { NULL /* modify */ }, { SLAPD_MONITOR_LOG, SLAPD_MONITOR_LOG_NAME, - NULL, NULL, NULL, + BER_BVNULL, BER_BVNULL, BER_BVNULL, MONITOR_F_NONE, monitor_subsys_log_init, NULL, /* update */ NULL, /* create */ monitor_subsys_log_modify + }, { + SLAPD_MONITOR_OPS, SLAPD_MONITOR_OPS_NAME, + BER_BVNULL, BER_BVNULL, BER_BVNULL, + MONITOR_F_PERSISTENT_CH, + monitor_subsys_ops_init, + monitor_subsys_ops_update, + NULL, /* create */ + NULL, /* modify */ + }, { + SLAPD_MONITOR_SENT, SLAPD_MONITOR_SENT_NAME, + BER_BVNULL, BER_BVNULL, BER_BVNULL, + MONITOR_F_PERSISTENT_CH, + monitor_subsys_sent_init, + monitor_subsys_sent_update, + NULL, /* create */ + NULL, /* modify */ + }, { + SLAPD_MONITOR_TIME, SLAPD_MONITOR_TIME_NAME, + BER_BVNULL, BER_BVNULL, BER_BVNULL, + MONITOR_F_PERSISTENT_CH, + monitor_subsys_time_init, + monitor_subsys_time_update, + NULL, /* create */ + NULL, /* modify */ }, { -1, NULL } }; +#ifdef SLAPD_MONITOR_DYNAMIC + +int +back_monitor_LTX_init_module( int argc, char *argv[] ) +{ + BackendInfo bi; + + memset( &bi, '\0', sizeof(bi) ); + bi.bi_type = "monitor"; + bi.bi_init = monitor_back_initialize; + backend_add( &bi ); + return 0; +} + +#endif /* SLAPD_MONITOR_DYNAMIC */ + int monitor_back_initialize( BackendInfo *bi @@ -145,51 +180,53 @@ monitor_back_initialize( { static char *controls[] = { LDAP_CONTROL_MANAGEDSAIT, + LDAP_CONTROL_VALUESRETURNFILTER, NULL }; bi->bi_controls = controls; - bi->bi_init = NULL; - bi->bi_open = monitor_back_open; + bi->bi_init = 0; + bi->bi_open = 0; bi->bi_config = monitor_back_config; - bi->bi_close = NULL; - bi->bi_destroy = NULL; + bi->bi_close = 0; + bi->bi_destroy = 0; bi->bi_db_init = monitor_back_db_init; bi->bi_db_config = monitor_back_db_config; - bi->bi_db_open = NULL; - bi->bi_db_close = NULL; + bi->bi_db_open = monitor_back_db_open; + bi->bi_db_close = 0; bi->bi_db_destroy = monitor_back_db_destroy; bi->bi_op_bind = monitor_back_bind; - bi->bi_op_unbind = NULL; + bi->bi_op_unbind = 0; bi->bi_op_search = monitor_back_search; bi->bi_op_compare = monitor_back_compare; bi->bi_op_modify = monitor_back_modify; - bi->bi_op_modrdn = NULL; - bi->bi_op_add = NULL; - bi->bi_op_delete = NULL; - bi->bi_op_abandon = monitor_back_abandon; + bi->bi_op_modrdn = 0; + bi->bi_op_add = 0; + bi->bi_op_delete = 0; + bi->bi_op_abandon = 0; - bi->bi_extended = NULL; + bi->bi_extended = 0; - bi->bi_entry_release_rw = NULL; - bi->bi_acl_group = NULL; - bi->bi_acl_attribute = NULL; - bi->bi_chk_referrals = NULL; + bi->bi_entry_release_rw = 0; + bi->bi_acl_group = 0; + bi->bi_acl_attribute = 0; + bi->bi_chk_referrals = 0; + bi->bi_operational = monitor_back_operational; /* * hooks for slap tools */ - bi->bi_tool_entry_open = NULL; - bi->bi_tool_entry_close = NULL; - bi->bi_tool_entry_first = NULL; - bi->bi_tool_entry_next = NULL; - bi->bi_tool_entry_get = NULL; - bi->bi_tool_entry_put = NULL; - bi->bi_tool_entry_reindex = NULL; - bi->bi_tool_sync = NULL; + bi->bi_tool_entry_open = 0; + bi->bi_tool_entry_close = 0; + bi->bi_tool_entry_first = 0; + bi->bi_tool_entry_next = 0; + bi->bi_tool_entry_get = 0; + bi->bi_tool_entry_put = 0; + bi->bi_tool_entry_reindex = 0; + bi->bi_tool_sync = 0; bi->bi_connection_init = 0; bi->bi_connection_destroy = 0; @@ -205,14 +242,19 @@ monitor_back_db_init( struct monitorinfo *mi; Entry *e, *e_tmp; struct monitorentrypriv *mp; - int i; - char buf[1024], *ndn; + int i, rc; + char buf[1024], *end_of_line; + struct berval dn, ndn; const char *text; + struct berval bv[2]; - if ( monitor_defined ) { + /* + * database monitor can be defined once only + */ + if ( be_monitor ) { #ifdef NEW_LOGGING - LDAP_LOG(( "operation", LDAP_LEVEL_CRIT, - "only one monitor backend is allowed\n" )); + LDAP_LOG( OPERATION, CRIT, + "only one monitor backend is allowed\n" , 0, 0, 0); #else Debug( LDAP_DEBUG_ANY, "only one monitor backend is allowed\n%s%s%s", @@ -220,21 +262,38 @@ monitor_back_db_init( #endif return( -1 ); } - monitor_defined++; + be_monitor = be; - ndn = ch_strdup( SLAPD_MONITOR_DN ); - charray_add( &be->be_suffix, ndn ); - dn_normalize( ndn ); - ber_bvecadd( &be->be_nsuffix, ber_bvstr( ndn ) ); - ch_free( ndn ); + /* indicate system schema supported */ + be->be_flags |= SLAP_BFLAG_MONITOR; + + dn.bv_val = SLAPD_MONITOR_DN; + dn.bv_len = sizeof( SLAPD_MONITOR_DN ) - 1; + + rc = dnNormalize2( NULL, &dn, &ndn ); + if( rc != LDAP_SUCCESS ) { +#ifdef NEW_LOGGING + LDAP_LOG( OPERATION, CRIT, + "monitor DN \"" SLAPD_MONITOR_DN "\" backend is allowed\n" , 0, 0, 0 ); +#else + Debug( LDAP_DEBUG_ANY, + "monitor DN \"" SLAPD_MONITOR_DN "\" backend is allowed\n", + 0, 0, 0 ); +#endif + return -1; + } + + ber_dupbv( &bv[0], &dn ); + ber_bvarray_add( &be->be_suffix, &bv[0] ); + ber_bvarray_add( &be->be_nsuffix, &ndn ); mi = ( struct monitorinfo * )ch_calloc( sizeof( struct monitorinfo ), 1 ); ldap_pvt_thread_mutex_init( &mi->mi_cache_mutex ); if ( slap_str2ad( "description", &monitor_ad_desc, &text ) ) { #ifdef NEW_LOGGING - LDAP_LOG(( "operation", LDAP_LEVEL_CRIT, - "monitor_back_db_init: %s\n", text )); + LDAP_LOG( OPERATION, CRIT, + "monitor_back_db_init: %s\n", text, 0, 0 ); #else Debug( LDAP_DEBUG_ANY, "monitor_subsys_backend_init: %s\n%s%s", @@ -242,51 +301,73 @@ monitor_back_db_init( #endif return( -1 ); } - + + /* + * Create all the subsystem specific entries + */ e_tmp = NULL; for ( i = 0; monitor_subsys[ i ].mss_name != NULL; i++ ) { - int len = strlen( monitor_subsys[ i ].mss_name ); - monitor_subsys[ i ].mss_rdn = ch_calloc( sizeof( char ), - 4 + len ); - strcpy( monitor_subsys[ i ].mss_rdn, "cn=" ); - strcat( monitor_subsys[ i ].mss_rdn, - monitor_subsys[ i ].mss_name ); - - monitor_subsys[ i ].mss_dn = ch_calloc( sizeof( char ), - 4 + len + sizeof( SLAPD_MONITOR_DN ) ); - strcpy( monitor_subsys[ i ].mss_dn, - monitor_subsys[ i ].mss_rdn ); - strcat( monitor_subsys[ i ].mss_dn, "," ); - strcat( monitor_subsys[ i ].mss_dn, SLAPD_MONITOR_DN ); + int len = strlen( monitor_subsys[ i ].mss_name ); + struct berval dn; + int rc; + + dn.bv_len = len + sizeof( "cn=" ) - 1; + dn.bv_val = ch_calloc( sizeof( char ), dn.bv_len + 1 ); + strcpy( dn.bv_val, "cn=" ); + strcat( dn.bv_val, monitor_subsys[ i ].mss_name ); + rc = dnPretty2( NULL, &dn, &monitor_subsys[ i ].mss_rdn ); + free( dn.bv_val ); + if ( rc != LDAP_SUCCESS ) { +#ifdef NEW_LOGGING + LDAP_LOG( OPERATION, CRIT, + "monitor RDN \"%s\" is invalid\n", + dn.bv_val, 0, 0 ); +#else + Debug( LDAP_DEBUG_ANY, + "monitor RDN \"%s\" is invalid\n", + dn.bv_val, 0, 0 ); +#endif + return( -1 ); + } - monitor_subsys[ i ].mss_ndn - = ch_strdup( monitor_subsys[ i ].mss_dn ); - dn_normalize( monitor_subsys[ i ].mss_ndn ); + dn.bv_len += sizeof( SLAPD_MONITOR_DN ); /* 1 for the , */ + dn.bv_val = ch_malloc( dn.bv_len + 1 ); + strcpy( dn.bv_val , monitor_subsys[ i ].mss_rdn.bv_val ); + strcat( dn.bv_val, "," SLAPD_MONITOR_DN ); + rc = dnPrettyNormal( NULL, &dn, &monitor_subsys[ i ].mss_dn, + &monitor_subsys[ i ].mss_ndn ); + free( dn.bv_val ); + if ( rc != LDAP_SUCCESS ) { +#ifdef NEW_LOGGING + LDAP_LOG( OPERATION, CRIT, + "monitor DN \"%s\" is invalid\n", + dn.bv_val, 0, 0 ); +#else + Debug( LDAP_DEBUG_ANY, + "monitor DN \"%s\" is invalid\n", + dn.bv_val, 0, 0 ); +#endif + return( -1 ); + } snprintf( buf, sizeof( buf ), "dn: %s\n" - "objectClass: top\n" - "objectClass: LDAPsubEntry\n" -#ifdef SLAPD_MONITORSUBENTRY - "objectClass: monitorSubEntry\n" -#else /* !SLAPD_MONITORSUBENTRY */ - "objectClass: extensibleObject\n" -#endif /* !SLAPD_MONITORSUBENTRY */ + SLAPD_MONITOR_OBJECTCLASSES "cn: %s\n", - monitor_subsys[ i ].mss_dn, + monitor_subsys[ i ].mss_dn.bv_val, monitor_subsys[ i ].mss_name ); e = str2entry( buf ); if ( e == NULL) { #ifdef NEW_LOGGING - LDAP_LOG(( "operation", LDAP_LEVEL_CRIT, + LDAP_LOG( OPERATION, CRIT, "unable to create '%s' entry\n", - monitor_subsys[ i ].mss_dn )); + monitor_subsys[ i ].mss_dn.bv_val, 0, 0 ); #else Debug( LDAP_DEBUG_ANY, - "unable to create '%s' entry\n%s%s", - monitor_subsys[ i ].mss_dn, "", "" ); + "unable to create '%s' entry\n", + monitor_subsys[ i ].mss_dn.bv_val, 0, 0 ); #endif return( -1 ); } @@ -300,13 +381,13 @@ monitor_back_db_init( if ( monitor_cache_add( mi, e ) ) { #ifdef NEW_LOGGING - LDAP_LOG(( "operation", LDAP_LEVEL_CRIT, + LDAP_LOG( OPERATION, CRIT, "unable to add entry '%s' to cache\n", - monitor_subsys[ i ].mss_dn )); + monitor_subsys[ i ].mss_dn.bv_val, 0, 0 ); #else Debug( LDAP_DEBUG_ANY, - "unable to add entry '%s' to cache\n%s%s", - monitor_subsys[ i ].mss_dn, "", "" ); + "unable to add entry '%s' to cache\n", + monitor_subsys[ i ].mss_dn.bv_val, 0, 0 ); #endif return -1; } @@ -316,28 +397,21 @@ monitor_back_db_init( /* * creates the "cn=Monitor" entry - * and all the subsystem specific entries */ snprintf( buf, sizeof( buf ), - "dn: %s\n" + "dn: " SLAPD_MONITOR_DN "\n" "objectClass: top\n" - "objectClass: LDAPsubEntry\n" -#ifdef SLAPD_MONITORSUBENTRY - "objectClass: monitorSubEntry\n" -#else /* !SLAPD_MONITORSUBENTRY */ + "objectClass: monitor\n" "objectClass: extensibleObject\n" -#endif /* !SLAPD_MONITORSUBENTRY */ - "cn: Monitor\n" - "description: %s", - SLAPD_MONITOR_DN, - /* (char *) Versionstr */ "slapd 2.0" - ); + "structuralObjectClass: monitor\n" + "cn: Monitor" ); + e = str2entry( buf ); if ( e == NULL) { #ifdef NEW_LOGGING - LDAP_LOG(( "operation", LDAP_LEVEL_CRIT, + LDAP_LOG( OPERATION, CRIT, "unable to create '%s' entry\n", - SLAPD_MONITOR_DN )); + SLAPD_MONITOR_DN, 0, 0 ); #else Debug( LDAP_DEBUG_ANY, "unable to create '%s' entry\n%s%s", @@ -345,6 +419,26 @@ monitor_back_db_init( #endif return( -1 ); } + bv[1].bv_val = NULL; + bv[0].bv_val = (char *) Versionstr; + end_of_line = strchr( Versionstr, '\n' ); + if ( end_of_line ) { + bv[0].bv_len = end_of_line - Versionstr; + } else { + bv[0].bv_len = strlen( Versionstr ); + } + if ( attr_merge( e, monitor_ad_desc, bv ) ) { +#ifdef NEW_LOGGING + LDAP_LOG( OPERATION, CRIT, + "unable to add description to '%s' entry\n", + SLAPD_MONITOR_DN, 0, 0 ); +#else + Debug( LDAP_DEBUG_ANY, + "unable to add description to '%s' entry\n%s%s", + SLAPD_MONITOR_DN, "", "" ); +#endif + return( -1 ); + } mp = ( struct monitorentrypriv * )ch_calloc( sizeof( struct monitorentrypriv ), 1 ); e->e_private = ( void * )mp; @@ -355,9 +449,9 @@ monitor_back_db_init( if ( monitor_cache_add( mi, e ) ) { #ifdef NEW_LOGGING - LDAP_LOG(( "operation", LDAP_LEVEL_CRIT, + LDAP_LOG( OPERATION, CRIT, "unable to add entry '%s' to cache\n", - SLAPD_MONITOR_DN )); + SLAPD_MONITOR_DN, 0, 0 ); #else Debug( LDAP_DEBUG_ANY, "unable to add entry '%s' to cache\n%s%s", @@ -372,32 +466,17 @@ monitor_back_db_init( } int -monitor_back_open( - BackendInfo *bi +monitor_back_db_open( + BackendDB *be ) { - BackendDB *be; struct monitorsubsys *ms; - char *ndn; + + assert( be ); /* - * adds the monitor backend + * opens the monitor backend */ - ndn = ch_strdup( SLAPD_MONITOR_DN ); - dn_normalize( ndn ); - be = select_backend( ndn , 0 ); - ch_free( ndn ); - if ( be == NULL ) { -#ifdef NEW_LOGGING - LDAP_LOG(( "operation", LDAP_LEVEL_CRIT, - "unable to get monitor backend\n" )); -#else - Debug( LDAP_DEBUG_ANY, - "unable to get monitor backend\n%s%s%s", "", "", "" ); -#endif - return( -1 ); - } - for ( ms = monitor_subsys; ms->mss_name != NULL; ms++ ) { if ( ms->mss_init && ( *ms->mss_init )( be ) ) { return( -1 ); @@ -431,9 +510,12 @@ monitor_back_db_config( char **argv ) { + /* + * eventually, will hold database specific configuration parameters + */ #ifdef NEW_LOGGING - LDAP_LOG(( "config", LDAP_DEBUG_NOTICE, - "line %d of file '%s' will be ignored\n", lineno, fname )); + LDAP_LOG( CONFIG, INFO, + "line %d of file '%s' will be ignored\n", lineno, fname, 0 ); #else Debug( LDAP_DEBUG_CONFIG, "line %d of file '%s' will be ignored\n%s", lineno, fname, "" );