1 /* init.c - initialize monitor backend */
3 * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved.
4 * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
7 * Copyright 2001 The OpenLDAP Foundation, All Rights Reserved.
8 * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
10 * Copyright 2001, Pierangelo Masarati, All rights reserved. <ando@sys-net.it>
12 * This work has beed deveolped for the OpenLDAP Foundation
13 * in the hope that it may be useful to the Open Source community,
14 * but WITHOUT ANY WARRANTY.
16 * Permission is granted to anyone to use this software for any purpose
17 * on any computer system, and to alter it and redistribute it, subject
18 * to the following restrictions:
20 * 1. The author and SysNet s.n.c. are not responsible for the consequences
21 * of use of this software, no matter how awful, even if they arise from
24 * 2. The origin of this software must not be misrepresented, either by
25 * explicit claim or by omission. Since few users ever read sources,
26 * credits should appear in the documentation.
28 * 3. Altered versions must be plainly marked as such, and must not be
29 * misrepresented as being the original software. Since few users
30 * ever read sources, credits should appear in the documentation.
31 * SysNet s.n.c. cannot be responsible for the consequences of the
34 * 4. This notice may not be removed or altered.
40 #include <ac/string.h>
43 #include "back-monitor.h"
46 * used by many functions to add description to entries
48 AttributeDescription *monitor_ad_desc = NULL;
53 struct monitorsubsys monitor_subsys[] = {
55 SLAPD_MONITOR_LISTENER, SLAPD_MONITOR_LISTENER_NAME,
63 SLAPD_MONITOR_DATABASE, SLAPD_MONITOR_DATABASE_NAME,
65 MONITOR_F_PERSISTENT_CH,
66 monitor_subsys_database_init,
71 SLAPD_MONITOR_BACKEND, SLAPD_MONITOR_BACKEND_NAME,
73 MONITOR_F_PERSISTENT_CH,
74 monitor_subsys_backend_init,
79 SLAPD_MONITOR_THREAD, SLAPD_MONITOR_THREAD_NAME,
82 monitor_subsys_thread_init,
83 monitor_subsys_thread_update,
87 SLAPD_MONITOR_SASL, SLAPD_MONITOR_SASL_NAME,
95 SLAPD_MONITOR_TLS, SLAPD_MONITOR_TLS_NAME,
103 SLAPD_MONITOR_CONN, SLAPD_MONITOR_CONN_NAME,
105 MONITOR_F_VOLATILE_CH,
106 monitor_subsys_conn_init,
107 monitor_subsys_conn_update,
108 monitor_subsys_conn_create,
111 SLAPD_MONITOR_READW, SLAPD_MONITOR_READW_NAME,
115 monitor_subsys_readw_update,
119 SLAPD_MONITOR_WRITEW, SLAPD_MONITOR_WRITEW_NAME,
123 monitor_subsys_writew_update,
127 SLAPD_MONITOR_LOG, SLAPD_MONITOR_LOG_NAME,
130 monitor_subsys_log_init,
133 monitor_subsys_log_modify
135 SLAPD_MONITOR_OPS, SLAPD_MONITOR_OPS_NAME,
138 monitor_subsys_ops_init,
139 monitor_subsys_ops_update,
143 SLAPD_MONITOR_SENT, SLAPD_MONITOR_SENT_NAME,
146 monitor_subsys_sent_init,
147 monitor_subsys_sent_update,
154 monitor_back_initialize(
158 static char *controls[] = {
159 LDAP_CONTROL_MANAGEDSAIT,
163 bi->bi_controls = controls;
166 bi->bi_open = monitor_back_open;
167 bi->bi_config = monitor_back_config;
171 bi->bi_db_init = monitor_back_db_init;
172 bi->bi_db_config = monitor_back_db_config;
175 bi->bi_db_destroy = monitor_back_db_destroy;
177 bi->bi_op_bind = monitor_back_bind;
178 bi->bi_op_unbind = 0;
179 bi->bi_op_search = monitor_back_search;
180 bi->bi_op_compare = monitor_back_compare;
181 bi->bi_op_modify = monitor_back_modify;
182 bi->bi_op_modrdn = 0;
184 bi->bi_op_delete = 0;
185 bi->bi_op_abandon = monitor_back_abandon;
189 bi->bi_entry_release_rw = 0;
190 bi->bi_acl_group = 0;
191 bi->bi_acl_attribute = 0;
192 bi->bi_chk_referrals = 0;
193 bi->bi_operational = monitor_back_operational;
196 * hooks for slap tools
198 bi->bi_tool_entry_open = 0;
199 bi->bi_tool_entry_close = 0;
200 bi->bi_tool_entry_first = 0;
201 bi->bi_tool_entry_next = 0;
202 bi->bi_tool_entry_get = 0;
203 bi->bi_tool_entry_put = 0;
204 bi->bi_tool_entry_reindex = 0;
205 bi->bi_tool_sync = 0;
207 bi->bi_connection_init = 0;
208 bi->bi_connection_destroy = 0;
214 monitor_back_db_init(
218 struct monitorinfo *mi;
220 struct monitorentrypriv *mp;
222 char buf[1024], *end_of_line;
223 struct berval dn, *ndn;
225 struct berval val, *bv[2] = { &val, NULL };
228 * database monitor can be defined once only
230 static int monitor_defined = 0;
232 if ( monitor_defined ) {
234 LDAP_LOG(( "operation", LDAP_LEVEL_CRIT,
235 "only one monitor backend is allowed\n" ));
237 Debug( LDAP_DEBUG_ANY,
238 "only one monitor backend is allowed\n%s%s%s",
246 dn.bv_val = SLAPD_MONITOR_DN;
247 dn.bv_len = sizeof( SLAPD_MONITOR_DN ) - 1;
249 rc = dnNormalize( NULL, &dn, &ndn );
250 if( rc != LDAP_SUCCESS ) {
252 LDAP_LOG(( "operation", LDAP_LEVEL_CRIT,
253 "monitor DN \"" SLAPD_MONITOR_DN "\" backend is allowed\n" ));
255 Debug( LDAP_DEBUG_ANY,
256 "monitor DN \"" SLAPD_MONITOR_DN "\" backend is allowed\n",
262 ber_bvecadd( &be->be_suffix, ber_bvdup( &dn ) );
263 ber_bvecadd( &be->be_nsuffix, ndn );
265 mi = ( struct monitorinfo * )ch_calloc( sizeof( struct monitorinfo ), 1 );
266 ldap_pvt_thread_mutex_init( &mi->mi_cache_mutex );
268 if ( slap_str2ad( "description", &monitor_ad_desc, &text ) ) {
270 LDAP_LOG(( "operation", LDAP_LEVEL_CRIT,
271 "monitor_back_db_init: %s\n", text ));
273 Debug( LDAP_DEBUG_ANY,
274 "monitor_subsys_backend_init: %s\n%s%s",
281 * Create all the subsystem specific entries
284 for ( i = 0; monitor_subsys[ i ].mss_name != NULL; i++ ) {
285 int len = strlen( monitor_subsys[ i ].mss_name );
286 struct berval dn, *pdn;
289 dn.bv_len = len + sizeof( "cn=" ) - 1;
290 dn.bv_val = ch_calloc( sizeof( char ), dn.bv_len + 1 );
291 strcpy( dn.bv_val, "cn=" );
292 strcat( dn.bv_val, monitor_subsys[ i ].mss_name );
294 rc = dnPretty( NULL, &dn, &pdn );
295 if ( rc != LDAP_SUCCESS ) {
297 LDAP_LOG(( "operation", LDAP_LEVEL_CRIT,
298 "monitor RDN \"%s\" is invalid\n",
301 Debug( LDAP_DEBUG_ANY,
302 "monitor RDN \"%s\" is invalid\n",
309 monitor_subsys[ i ].mss_rdn = pdn;
311 dn.bv_len += sizeof( SLAPD_MONITOR_DN ); /* 1 for the , */
312 dn.bv_val = ch_calloc( sizeof( char ), dn.bv_len + 1 );
313 strcpy( dn.bv_val , monitor_subsys[ i ].mss_rdn->bv_val );
314 strcat( dn.bv_val, "," SLAPD_MONITOR_DN );
316 rc = dnPretty( NULL, &dn, &pdn );
317 if ( rc != LDAP_SUCCESS ) {
319 LDAP_LOG(( "operation", LDAP_LEVEL_CRIT,
320 "monitor DN \"%s\" is invalid\n",
323 Debug( LDAP_DEBUG_ANY,
324 "monitor DN \"%s\" is invalid\n",
330 monitor_subsys[ i ].mss_dn = pdn;
333 dnNormalize( NULL, &dn, &pdn );
334 if ( rc != LDAP_SUCCESS ) {
336 LDAP_LOG(( "operation", LDAP_LEVEL_CRIT,
337 "monitor DN \"%s\" is invalid\n",
340 Debug( LDAP_DEBUG_ANY,
341 "monitor DN \"%s\" is invalid\n",
348 monitor_subsys[ i ].mss_ndn = pdn;
350 snprintf( buf, sizeof( buf ),
353 "objectClass: LDAPsubEntry\n"
354 #ifdef SLAPD_MONITORSUBENTRY
355 "objectClass: monitorSubEntry\n"
356 #else /* !SLAPD_MONITORSUBENTRY */
357 "objectClass: extensibleObject\n"
358 #endif /* !SLAPD_MONITORSUBENTRY */
360 monitor_subsys[ i ].mss_dn->bv_val,
361 monitor_subsys[ i ].mss_name );
363 e = str2entry( buf );
367 LDAP_LOG(( "operation", LDAP_LEVEL_CRIT,
368 "unable to create '%s' entry\n",
369 monitor_subsys[ i ].mss_dn->bv_val ));
371 Debug( LDAP_DEBUG_ANY,
372 "unable to create '%s' entry\n",
373 monitor_subsys[ i ].mss_dn->bv_val, 0, 0 );
378 mp = ( struct monitorentrypriv * )ch_calloc( sizeof( struct monitorentrypriv ), 1 );
379 e->e_private = ( void * )mp;
380 mp->mp_info = &monitor_subsys[ i ];
381 mp->mp_children = NULL;
383 mp->mp_flags = monitor_subsys[ i ].mss_flags;
385 if ( monitor_cache_add( mi, e ) ) {
387 LDAP_LOG(( "operation", LDAP_LEVEL_CRIT,
388 "unable to add entry '%s' to cache\n",
389 monitor_subsys[ i ].mss_dn->bv_val ));
391 Debug( LDAP_DEBUG_ANY,
392 "unable to add entry '%s' to cache\n",
393 monitor_subsys[ i ].mss_dn->bv_val, 0, 0 );
402 * creates the "cn=Monitor" entry
404 snprintf( buf, sizeof( buf ),
405 "dn: " SLAPD_MONITOR_DN "\n"
407 "objectClass: LDAPsubEntry\n"
408 #ifdef SLAPD_MONITORSUBENTRY
409 "objectClass: monitorSubEntry\n"
410 #else /* !SLAPD_MONITORSUBENTRY */
411 "objectClass: extensibleObject\n"
412 #endif /* !SLAPD_MONITORSUBENTRY */
415 e = str2entry( buf );
418 LDAP_LOG(( "operation", LDAP_LEVEL_CRIT,
419 "unable to create '%s' entry\n",
422 Debug( LDAP_DEBUG_ANY,
423 "unable to create '%s' entry\n%s%s",
424 SLAPD_MONITOR_DN, "", "" );
428 val.bv_val = (char *) Versionstr;
429 end_of_line = strchr( Versionstr, '\n' );
431 val.bv_len = end_of_line - Versionstr;
433 val.bv_len = strlen( Versionstr );
435 if ( attr_merge( e, monitor_ad_desc, bv ) ) {
437 LDAP_LOG(( "operation", LDAP_LEVEL_CRIT,
438 "unable to add description to '%s' entry\n",
441 Debug( LDAP_DEBUG_ANY,
442 "unable to add description to '%s' entry\n%s%s",
443 SLAPD_MONITOR_DN, "", "" );
448 mp = ( struct monitorentrypriv * )ch_calloc( sizeof( struct monitorentrypriv ), 1 );
449 e->e_private = ( void * )mp;
452 mp->mp_children = e_tmp;
455 if ( monitor_cache_add( mi, e ) ) {
457 LDAP_LOG(( "operation", LDAP_LEVEL_CRIT,
458 "unable to add entry '%s' to cache\n",
461 Debug( LDAP_DEBUG_ANY,
462 "unable to add entry '%s' to cache\n%s%s",
463 SLAPD_MONITOR_DN, "", "" );
479 struct monitorsubsys *ms;
480 struct berval dn = { sizeof(SLAPD_MONITOR_DN)-1, SLAPD_MONITOR_DN };
481 struct berval *ndn = NULL;
485 * adds the monitor backend
487 rc = dnNormalize( NULL, &dn, &ndn );
488 if( rc != LDAP_SUCCESS ) {
490 LDAP_LOG(( "operation", LDAP_LEVEL_CRIT,
491 "monitor DN \"" SLAPD_MONITOR_DN "\" is invalid\n" ));
493 Debug( LDAP_DEBUG_ANY,
494 "monitor DN \"" SLAPD_MONITOR_DN "\" is invalid\n",
500 be = select_backend( ndn , 0, 0 );
505 LDAP_LOG(( "operation", LDAP_LEVEL_CRIT,
506 "unable to get monitor backend\n" ));
508 Debug( LDAP_DEBUG_ANY,
509 "unable to get monitor backend\n", 0, 0, 0 );
514 for ( ms = monitor_subsys; ms->mss_name != NULL; ms++ ) {
515 if ( ms->mss_init && ( *ms->mss_init )( be ) ) {
533 * eventually, will hold backend specific configuration parameters
539 monitor_back_db_config(
548 LDAP_LOG(( "config", LDAP_DEBUG_NOTICE,
549 "line %d of file '%s' will be ignored\n", lineno, fname ));
551 Debug( LDAP_DEBUG_CONFIG,
552 "line %d of file '%s' will be ignored\n%s", lineno, fname, "" );
558 monitor_back_db_destroy(
563 * FIXME: destroys all the data