1 /* init.c - initialize monitor backend */
3 * Copyright 1998-2003 The OpenLDAP Foundation, All Rights Reserved.
4 * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
7 * Copyright 2001, Pierangelo Masarati, All rights reserved. <ando@sys-net.it>
9 * This work has beed deveolped for the OpenLDAP Foundation
10 * in the hope that it may be useful to the Open Source community,
11 * but WITHOUT ANY WARRANTY.
13 * Permission is granted to anyone to use this software for any purpose
14 * on any computer system, and to alter it and redistribute it, subject
15 * to the following restrictions:
17 * 1. The author and SysNet s.n.c. are not responsible for the consequences
18 * of use of this software, no matter how awful, even if they arise from
21 * 2. The origin of this software must not be misrepresented, either by
22 * explicit claim or by omission. Since few users ever read sources,
23 * credits should appear in the documentation.
25 * 3. Altered versions must be plainly marked as such, and must not be
26 * misrepresented as being the original software. Since few users
27 * ever read sources, credits should appear in the documentation.
28 * SysNet s.n.c. cannot be responsible for the consequences of the
31 * 4. This notice may not be removed or altered.
37 #include <ac/string.h>
41 #include "back-monitor.h"
44 * used by many functions to add description to entries
46 AttributeDescription *monitor_ad_desc = NULL;
47 slap_mr_normalize_func *monitor_ad_normalize = NULL;
48 BackendDB *be_monitor = NULL;
53 struct monitorsubsys monitor_subsys[] = {
55 SLAPD_MONITOR_LISTENER, SLAPD_MONITOR_LISTENER_NAME,
56 BER_BVNULL, BER_BVNULL, BER_BVNULL,
57 MONITOR_F_PERSISTENT_CH,
58 monitor_subsys_listener_init,
63 SLAPD_MONITOR_DATABASE, SLAPD_MONITOR_DATABASE_NAME,
64 BER_BVNULL, BER_BVNULL, BER_BVNULL,
65 MONITOR_F_PERSISTENT_CH,
66 monitor_subsys_database_init,
71 SLAPD_MONITOR_BACKEND, SLAPD_MONITOR_BACKEND_NAME,
72 BER_BVNULL, BER_BVNULL, BER_BVNULL,
73 MONITOR_F_PERSISTENT_CH,
74 monitor_subsys_backend_init,
79 SLAPD_MONITOR_THREAD, SLAPD_MONITOR_THREAD_NAME,
80 BER_BVNULL, BER_BVNULL, BER_BVNULL,
82 monitor_subsys_thread_init,
83 monitor_subsys_thread_update,
87 SLAPD_MONITOR_SASL, SLAPD_MONITOR_SASL_NAME,
88 BER_BVNULL, BER_BVNULL, BER_BVNULL,
95 SLAPD_MONITOR_TLS, SLAPD_MONITOR_TLS_NAME,
96 BER_BVNULL, BER_BVNULL, BER_BVNULL,
103 SLAPD_MONITOR_CONN, SLAPD_MONITOR_CONN_NAME,
104 BER_BVNULL, BER_BVNULL, BER_BVNULL,
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,
112 BER_BVNULL, BER_BVNULL, BER_BVNULL,
115 monitor_subsys_readw_update,
119 SLAPD_MONITOR_WRITEW, SLAPD_MONITOR_WRITEW_NAME,
120 BER_BVNULL, BER_BVNULL, BER_BVNULL,
123 monitor_subsys_writew_update,
127 SLAPD_MONITOR_LOG, SLAPD_MONITOR_LOG_NAME,
128 BER_BVNULL, BER_BVNULL, BER_BVNULL,
130 monitor_subsys_log_init,
133 monitor_subsys_log_modify
135 SLAPD_MONITOR_OPS, SLAPD_MONITOR_OPS_NAME,
136 BER_BVNULL, BER_BVNULL, BER_BVNULL,
137 MONITOR_F_PERSISTENT_CH,
138 monitor_subsys_ops_init,
139 monitor_subsys_ops_update,
143 SLAPD_MONITOR_SENT, SLAPD_MONITOR_SENT_NAME,
144 BER_BVNULL, BER_BVNULL, BER_BVNULL,
145 MONITOR_F_PERSISTENT_CH,
146 monitor_subsys_sent_init,
147 monitor_subsys_sent_update,
151 SLAPD_MONITOR_TIME, SLAPD_MONITOR_TIME_NAME,
152 BER_BVNULL, BER_BVNULL, BER_BVNULL,
153 MONITOR_F_PERSISTENT_CH,
154 monitor_subsys_time_init,
155 monitor_subsys_time_update,
161 #ifdef SLAPD_MONITOR_DYNAMIC
164 back_monitor_LTX_init_module( int argc, char *argv[] )
168 memset( &bi, '\0', sizeof(bi) );
169 bi.bi_type = "monitor";
170 bi.bi_init = monitor_back_initialize;
175 #endif /* SLAPD_MONITOR_DYNAMIC */
178 monitor_back_initialize(
182 static char *controls[] = {
183 LDAP_CONTROL_MANAGEDSAIT,
184 LDAP_CONTROL_VALUESRETURNFILTER,
188 bi->bi_controls = controls;
192 bi->bi_config = monitor_back_config;
196 bi->bi_db_init = monitor_back_db_init;
197 bi->bi_db_config = monitor_back_db_config;
198 bi->bi_db_open = monitor_back_db_open;
200 bi->bi_db_destroy = monitor_back_db_destroy;
202 bi->bi_op_bind = monitor_back_bind;
203 bi->bi_op_unbind = 0;
204 bi->bi_op_search = monitor_back_search;
205 bi->bi_op_compare = monitor_back_compare;
206 bi->bi_op_modify = monitor_back_modify;
207 bi->bi_op_modrdn = 0;
209 bi->bi_op_delete = 0;
210 bi->bi_op_abandon = 0;
214 bi->bi_entry_release_rw = 0;
215 bi->bi_chk_referrals = 0;
216 bi->bi_operational = monitor_back_operational;
219 * hooks for slap tools
221 bi->bi_tool_entry_open = 0;
222 bi->bi_tool_entry_close = 0;
223 bi->bi_tool_entry_first = 0;
224 bi->bi_tool_entry_next = 0;
225 bi->bi_tool_entry_get = 0;
226 bi->bi_tool_entry_put = 0;
227 bi->bi_tool_entry_reindex = 0;
228 bi->bi_tool_sync = 0;
230 bi->bi_connection_init = 0;
231 bi->bi_connection_destroy = 0;
237 monitor_back_db_init(
241 struct monitorinfo *mi;
243 struct monitorentrypriv *mp;
245 char buf[1024], *end_of_line;
246 struct berval dn, ndn;
251 * database monitor can be defined once only
255 LDAP_LOG( OPERATION, CRIT,
256 "only one monitor backend is allowed\n" , 0, 0, 0);
258 Debug( LDAP_DEBUG_ANY,
259 "only one monitor backend is allowed\n%s%s%s",
266 /* indicate system schema supported */
267 be->be_flags |= SLAP_BFLAG_MONITOR;
269 dn.bv_val = SLAPD_MONITOR_DN;
270 dn.bv_len = sizeof( SLAPD_MONITOR_DN ) - 1;
272 rc = dnNormalize2( NULL, &dn, &ndn );
273 if( rc != LDAP_SUCCESS ) {
275 LDAP_LOG( OPERATION, CRIT,
276 "monitor DN \"" SLAPD_MONITOR_DN "\" backend is allowed\n" , 0, 0, 0 );
278 Debug( LDAP_DEBUG_ANY,
279 "monitor DN \"" SLAPD_MONITOR_DN "\" backend is allowed\n",
285 ber_dupbv( &bv, &dn );
286 ber_bvarray_add( &be->be_suffix, &bv );
287 ber_bvarray_add( &be->be_nsuffix, &ndn );
289 mi = ( struct monitorinfo * )ch_calloc( sizeof( struct monitorinfo ), 1 );
290 ldap_pvt_thread_mutex_init( &mi->mi_cache_mutex );
292 if ( slap_str2ad( "description", &monitor_ad_desc, &text ) ) {
294 LDAP_LOG( OPERATION, CRIT,
295 "monitor_back_db_init: %s\n", text, 0, 0 );
297 Debug( LDAP_DEBUG_ANY,
298 "monitor_subsys_backend_init: %s\n%s%s",
304 if ( monitor_ad_desc->ad_type->sat_equality ) {
305 monitor_ad_normalize = monitor_ad_desc->ad_type->sat_equality->smr_normalize;
309 * Create all the subsystem specific entries
312 for ( i = 0; monitor_subsys[ i ].mss_name != NULL; i++ ) {
313 int len = strlen( monitor_subsys[ i ].mss_name );
317 dn.bv_len = len + sizeof( "cn=" ) - 1;
318 dn.bv_val = ch_calloc( sizeof( char ), dn.bv_len + 1 );
319 strcpy( dn.bv_val, "cn=" );
320 strcat( dn.bv_val, monitor_subsys[ i ].mss_name );
321 rc = dnPretty2( NULL, &dn, &monitor_subsys[ i ].mss_rdn );
323 if ( rc != LDAP_SUCCESS ) {
325 LDAP_LOG( OPERATION, CRIT,
326 "monitor RDN \"%s\" is invalid\n",
329 Debug( LDAP_DEBUG_ANY,
330 "monitor RDN \"%s\" is invalid\n",
336 dn.bv_len += sizeof( SLAPD_MONITOR_DN ); /* 1 for the , */
337 dn.bv_val = ch_malloc( dn.bv_len + 1 );
338 strcpy( dn.bv_val , monitor_subsys[ i ].mss_rdn.bv_val );
339 strcat( dn.bv_val, "," SLAPD_MONITOR_DN );
340 rc = dnPrettyNormal( NULL, &dn, &monitor_subsys[ i ].mss_dn,
341 &monitor_subsys[ i ].mss_ndn );
343 if ( rc != LDAP_SUCCESS ) {
345 LDAP_LOG( OPERATION, CRIT,
346 "monitor DN \"%s\" is invalid\n",
349 Debug( LDAP_DEBUG_ANY,
350 "monitor DN \"%s\" is invalid\n",
356 snprintf( buf, sizeof( buf ),
358 SLAPD_MONITOR_OBJECTCLASSES
360 monitor_subsys[ i ].mss_dn.bv_val,
361 monitor_subsys[ i ].mss_name );
363 e = str2entry( buf );
367 LDAP_LOG( OPERATION, CRIT,
368 "unable to create '%s' entry\n",
369 monitor_subsys[ i ].mss_dn.bv_val, 0, 0 );
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, CRIT,
388 "unable to add entry '%s' to cache\n",
389 monitor_subsys[ i ].mss_dn.bv_val, 0, 0 );
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: monitor\n"
408 "objectClass: extensibleObject\n"
409 "structuralObjectClass: monitor\n"
412 e = str2entry( buf );
415 LDAP_LOG( OPERATION, CRIT,
416 "unable to create '%s' entry\n",
417 SLAPD_MONITOR_DN, 0, 0 );
419 Debug( LDAP_DEBUG_ANY,
420 "unable to create '%s' entry\n%s%s",
421 SLAPD_MONITOR_DN, "", "" );
425 bv.bv_val = (char *) Versionstr;
426 end_of_line = strchr( Versionstr, '\n' );
428 bv.bv_len = end_of_line - Versionstr;
430 bv.bv_len = strlen( Versionstr );
432 if ( attr_merge_one( e, monitor_ad_desc, &bv, NULL ) ) {
434 LDAP_LOG( OPERATION, CRIT,
435 "unable to add description to '%s' entry\n",
436 SLAPD_MONITOR_DN, 0, 0 );
438 Debug( LDAP_DEBUG_ANY,
439 "unable to add description to '%s' entry\n%s%s",
440 SLAPD_MONITOR_DN, "", "" );
445 mp = ( struct monitorentrypriv * )ch_calloc( sizeof( struct monitorentrypriv ), 1 );
446 e->e_private = ( void * )mp;
449 mp->mp_children = e_tmp;
452 if ( monitor_cache_add( mi, e ) ) {
454 LDAP_LOG( OPERATION, CRIT,
455 "unable to add entry '%s' to cache\n",
456 SLAPD_MONITOR_DN, 0, 0 );
458 Debug( LDAP_DEBUG_ANY,
459 "unable to add entry '%s' to cache\n%s%s",
460 SLAPD_MONITOR_DN, "", "" );
471 monitor_back_db_open(
475 struct monitorsubsys *ms;
480 * opens the monitor backend
482 for ( ms = monitor_subsys; ms->mss_name != NULL; ms++ ) {
483 if ( ms->mss_init && ( *ms->mss_init )( be ) ) {
501 * eventually, will hold backend specific configuration parameters
507 monitor_back_db_config(
516 * eventually, will hold database specific configuration parameters
519 LDAP_LOG( CONFIG, INFO,
520 "line %d of file '%s' will be ignored\n", lineno, fname, 0 );
522 Debug( LDAP_DEBUG_CONFIG,
523 "line %d of file '%s' will be ignored\n%s", lineno, fname, "" );
529 monitor_back_db_destroy(
534 * FIXME: destroys all the data