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 BackendDB *be_monitor = NULL;
51 struct monitorsubsys monitor_subsys[] = {
53 SLAPD_MONITOR_LISTENER, SLAPD_MONITOR_LISTENER_NAME,
54 BER_BVNULL, BER_BVNULL, BER_BVNULL,
55 MONITOR_F_PERSISTENT_CH,
56 monitor_subsys_listener_init,
61 SLAPD_MONITOR_DATABASE, SLAPD_MONITOR_DATABASE_NAME,
62 BER_BVNULL, BER_BVNULL, BER_BVNULL,
63 MONITOR_F_PERSISTENT_CH,
64 monitor_subsys_database_init,
69 SLAPD_MONITOR_BACKEND, SLAPD_MONITOR_BACKEND_NAME,
70 BER_BVNULL, BER_BVNULL, BER_BVNULL,
71 MONITOR_F_PERSISTENT_CH,
72 monitor_subsys_backend_init,
77 SLAPD_MONITOR_THREAD, SLAPD_MONITOR_THREAD_NAME,
78 BER_BVNULL, BER_BVNULL, BER_BVNULL,
80 monitor_subsys_thread_init,
81 monitor_subsys_thread_update,
85 SLAPD_MONITOR_SASL, SLAPD_MONITOR_SASL_NAME,
86 BER_BVNULL, BER_BVNULL, BER_BVNULL,
93 SLAPD_MONITOR_TLS, SLAPD_MONITOR_TLS_NAME,
94 BER_BVNULL, BER_BVNULL, BER_BVNULL,
101 SLAPD_MONITOR_CONN, SLAPD_MONITOR_CONN_NAME,
102 BER_BVNULL, BER_BVNULL, BER_BVNULL,
103 MONITOR_F_VOLATILE_CH,
104 monitor_subsys_conn_init,
105 monitor_subsys_conn_update,
106 monitor_subsys_conn_create,
109 SLAPD_MONITOR_READW, SLAPD_MONITOR_READW_NAME,
110 BER_BVNULL, BER_BVNULL, BER_BVNULL,
113 monitor_subsys_readw_update,
117 SLAPD_MONITOR_WRITEW, SLAPD_MONITOR_WRITEW_NAME,
118 BER_BVNULL, BER_BVNULL, BER_BVNULL,
121 monitor_subsys_writew_update,
125 SLAPD_MONITOR_LOG, SLAPD_MONITOR_LOG_NAME,
126 BER_BVNULL, BER_BVNULL, BER_BVNULL,
128 monitor_subsys_log_init,
131 monitor_subsys_log_modify
133 SLAPD_MONITOR_OPS, SLAPD_MONITOR_OPS_NAME,
134 BER_BVNULL, BER_BVNULL, BER_BVNULL,
135 MONITOR_F_PERSISTENT_CH,
136 monitor_subsys_ops_init,
137 monitor_subsys_ops_update,
141 SLAPD_MONITOR_SENT, SLAPD_MONITOR_SENT_NAME,
142 BER_BVNULL, BER_BVNULL, BER_BVNULL,
143 MONITOR_F_PERSISTENT_CH,
144 monitor_subsys_sent_init,
145 monitor_subsys_sent_update,
149 SLAPD_MONITOR_TIME, SLAPD_MONITOR_TIME_NAME,
150 BER_BVNULL, BER_BVNULL, BER_BVNULL,
151 MONITOR_F_PERSISTENT_CH,
152 monitor_subsys_time_init,
153 monitor_subsys_time_update,
159 #ifdef SLAPD_MONITOR_DYNAMIC
162 back_monitor_LTX_init_module( int argc, char *argv[] )
166 memset( &bi, '\0', sizeof(bi) );
167 bi.bi_type = "monitor";
168 bi.bi_init = monitor_back_initialize;
173 #endif /* SLAPD_MONITOR_DYNAMIC */
176 monitor_back_initialize(
180 static char *controls[] = {
181 LDAP_CONTROL_MANAGEDSAIT,
182 LDAP_CONTROL_VALUESRETURNFILTER,
186 bi->bi_controls = controls;
190 bi->bi_config = monitor_back_config;
194 bi->bi_db_init = monitor_back_db_init;
195 bi->bi_db_config = monitor_back_db_config;
196 bi->bi_db_open = monitor_back_db_open;
198 bi->bi_db_destroy = monitor_back_db_destroy;
200 bi->bi_op_bind = monitor_back_bind;
201 bi->bi_op_unbind = 0;
202 bi->bi_op_search = monitor_back_search;
203 bi->bi_op_compare = monitor_back_compare;
204 bi->bi_op_modify = monitor_back_modify;
205 bi->bi_op_modrdn = 0;
207 bi->bi_op_delete = 0;
208 bi->bi_op_abandon = 0;
212 bi->bi_entry_release_rw = 0;
213 bi->bi_chk_referrals = 0;
214 bi->bi_operational = monitor_back_operational;
217 * hooks for slap tools
219 bi->bi_tool_entry_open = 0;
220 bi->bi_tool_entry_close = 0;
221 bi->bi_tool_entry_first = 0;
222 bi->bi_tool_entry_next = 0;
223 bi->bi_tool_entry_get = 0;
224 bi->bi_tool_entry_put = 0;
225 bi->bi_tool_entry_reindex = 0;
226 bi->bi_tool_sync = 0;
228 bi->bi_connection_init = 0;
229 bi->bi_connection_destroy = 0;
235 monitor_back_db_init(
239 struct monitorinfo *mi;
241 struct monitorentrypriv *mp;
243 char buf[1024], *end_of_line;
244 struct berval dn, ndn;
253 { "monitorServer", "( 1.3.6.1.4.1.4203.666.3.7 "
254 "NAME 'monitorServer' "
255 "DESC 'Server monitoring root entry' "
256 "SUP monitor STRUCTURAL )",
257 offsetof(struct monitorinfo, monitor_oc_monitorServer) },
258 { "monitorContainer", "( 1.3.6.1.4.1.4203.666.3.8 "
259 "NAME 'monitorContainer' "
260 "DESC 'monitor container class' "
261 "SUP monitor STRUCTURAL )",
262 offsetof(struct monitorinfo, monitor_oc_monitorContainer) },
263 { "monitorCounter", "( 1.3.6.1.4.1.4203.666.3.8 "
264 "NAME 'monitorCounter' "
265 "DESC 'monitor counter class' "
266 "SUP monitor STRUCTURAL )",
267 offsetof(struct monitorinfo, monitor_oc_monitorCounter) },
268 { "monitorOperation", "( 1.3.6.1.4.1.4203.666.3.9 "
269 "NAME 'monitorOperation' "
270 "DESC 'monitor operation class' "
271 "SUP monitor STRUCTURAL )",
272 offsetof(struct monitorinfo, monitor_oc_monitorOperation) },
273 { "monitorConnection", "( 1.3.6.1.4.1.4203.666.3.10 "
274 "NAME 'monitorConnection' "
275 "DESC 'monitor connection class' "
276 "SUP monitor STRUCTURAL )",
277 offsetof(struct monitorinfo, monitor_oc_monitorConnection) },
278 { "managedObject", "( 1.3.6.1.4.1.4203.666.3.11 "
279 "NAME 'managedObject' "
280 "DESC 'monitor managed entity class' "
281 "SUP monitor STRUCTURAL )",
282 offsetof(struct monitorinfo, monitor_oc_managedObject) },
283 { "monitoredObject", "( 1.3.6.1.4.1.4203.666.3.12 "
284 "NAME 'monitoredObject' "
285 "DESC 'monitor monitored entity class' "
286 "SUP monitor STRUCTURAL )",
287 offsetof(struct monitorinfo, monitor_oc_monitoredObject) },
288 #endif /* MONITOR_DEVEL */
292 { "monitoredInfo", "( 1.3.6.1.4.1.4203.666.1.14 "
293 "NAME 'monitoredInfo' "
294 "DESC 'monitored info' "
296 "EQUALITY caseIgnoreMatch "
297 "SUBSTR caseIgnoreSubstringsMatch "
298 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32768} "
299 "NO-USER-MODIFICATION "
300 "USAGE directoryOperation )",
301 offsetof(struct monitorinfo, monitor_ad_monitoredInfo) },
302 { "managedInfo", "( 1.3.6.1.4.1.4203.666.1.15 "
303 "NAME 'managedInfo' "
304 "DESC 'monitor managed info' "
306 offsetof(struct monitorinfo, monitor_ad_managedInfo) },
307 { "monitorCounter", "( 1.3.6.1.4.1.4203.666.1.16 "
308 "NAME 'monitorCounter' "
309 "DESC 'monitor counter' "
310 "EQUALITY integerMatch "
311 "ORDERING integerOrderingMatch "
312 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 "
313 "NO-USER-MODIFICATION "
314 "USAGE directoryOperation )",
315 offsetof(struct monitorinfo, monitor_ad_monitorCounter) },
316 { "monitorOpCompleted", "( 1.3.6.1.4.1.4203.666.1.17 "
317 "NAME 'monitorOpCompleted' "
318 "DESC 'monitor completed operations' "
319 "SUP monitorCounter "
320 "NO-USER-MODIFICATION "
321 "USAGE directoryOperation )",
322 offsetof(struct monitorinfo, monitor_ad_monitorOpCompleted) },
323 { "monitorOpInitiated", "( 1.3.6.1.4.1.4203.666.1.18 "
324 "NAME 'monitorOpInitiated' "
325 "DESC 'monitor initiated operations' "
326 "SUP monitorCounter "
327 "NO-USER-MODIFICATION "
328 "USAGE directoryOperation )",
329 offsetof(struct monitorinfo, monitor_ad_monitorOpInitiated) },
330 { "monitorConnectionNumber", "( 1.3.6.1.4.1.4203.666.1.19 "
331 "NAME 'monitorConnectionNumber' "
332 "DESC 'monitor connection number' "
333 "SUP monitorCounter "
334 "NO-USER-MODIFICATION "
335 "USAGE directoryOperation )",
336 offsetof(struct monitorinfo, monitor_ad_monitorConnectionNumber) },
337 { "monitorConnectionAuthzDN", "( 1.3.6.1.4.1.4203.666.1.20 "
338 "NAME 'monitorConnectionAuthzDN' "
339 "DESC 'monitor connection authorization DN' "
340 /* "SUP distinguishedName " */
341 "EQUALITY distinguishedNameMatch "
342 "SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 "
343 "NO-USER-MODIFICATION "
344 "USAGE directoryOperation )",
345 offsetof(struct monitorinfo, monitor_ad_monitorConnectionAuthzDN) },
346 { "monitorConnectionLocalAddress", "( 1.3.6.1.4.1.4203.666.1.21 "
347 "NAME 'monitorConnectionLocalAddress' "
348 "DESC 'monitor connection local address' "
350 "NO-USER-MODIFICATION "
351 "USAGE directoryOperation )",
352 offsetof(struct monitorinfo,
353 monitor_ad_monitorConnectionLocalAddress) },
354 { "monitorConnectionPeerAddress", "( 1.3.6.1.4.1.4203.666.1.22 "
355 "NAME 'monitorConnectionPeerAddress' "
356 "DESC 'monitor connection peer address' "
358 "NO-USER-MODIFICATION "
359 "USAGE directoryOperation )",
360 offsetof(struct monitorinfo,
361 monitor_ad_monitorConnectionPeerAddress) },
362 #endif /* MONITOR_DEVEL */
367 * database monitor can be defined once only
371 LDAP_LOG( OPERATION, CRIT,
372 "only one monitor backend is allowed\n", 0, 0, 0);
374 Debug( LDAP_DEBUG_ANY,
375 "only one monitor backend is allowed\n", 0, 0, 0 );
381 /* indicate system schema supported */
382 be->be_flags |= SLAP_BFLAG_MONITOR;
384 dn.bv_val = SLAPD_MONITOR_DN;
385 dn.bv_len = sizeof( SLAPD_MONITOR_DN ) - 1;
387 rc = dnNormalize2( NULL, &dn, &ndn, NULL );
388 if( rc != LDAP_SUCCESS ) {
390 LDAP_LOG( OPERATION, CRIT,
391 "unable to normalize monitor DN \"" SLAPD_MONITOR_DN
394 Debug( LDAP_DEBUG_ANY,
395 "unable to normalize monitor DN \"" SLAPD_MONITOR_DN
401 ber_dupbv( &bv, &dn );
402 ber_bvarray_add( &be->be_suffix, &bv );
403 ber_bvarray_add( &be->be_nsuffix, &ndn );
405 mi = ( struct monitorinfo * )ch_calloc( sizeof( struct monitorinfo ), 1 );
408 LDAP_LOG( OPERATION, CRIT,
409 "unable to initialize monitor backend\n", 0, 0, 0 );
411 Debug( LDAP_DEBUG_ANY,
412 "unable to initialize monitor backend\n", 0, 0, 0 );
417 ldap_pvt_thread_mutex_init( &mi->mi_cache_mutex );
419 for ( i = 0; moc[i].name; i++ ) {
425 oc = ldap_str2objectclass(moc[i].schema, &code, &err,
426 LDAP_SCHEMA_ALLOW_ALL );
429 LDAP_LOG( OPERATION, CRIT,
430 "unable to parse monitor objectclass '%s': "
431 "%s before %s\n" , moc[i].name,
432 ldap_scherr2str(code), err );
434 Debug( LDAP_DEBUG_ANY,
435 "unable to parse monitor objectclass '%s': "
436 "%s before %s\n" , moc[i].name,
437 ldap_scherr2str(code), err );
442 if ( oc->oc_oid == NULL ) {
444 LDAP_LOG( OPERATION, CRIT,
445 "objectclass '%s' has no OID\n" ,
448 Debug( LDAP_DEBUG_ANY,
449 "objectclass '%s' has no OID\n" ,
455 code = oc_add(oc,1,&err);
458 LDAP_LOG( OPERATION, CRIT,
459 "objectclass '%s': %s before %s\n" ,
460 moc[i].name, scherr2str(code), err );
462 Debug( LDAP_DEBUG_ANY,
463 "objectclass '%s': %s before %s\n" ,
464 moc[i].name, scherr2str(code), err );
471 Oc = oc_find( moc[i].name );
476 ((ObjectClass **)&(((char *)mi)[moc[i].offset]))[0] = Oc;
479 for ( i = 0; mat[i].name; i++ ) {
480 LDAPAttributeType *at;
483 AttributeDescription **ad;
485 at = ldap_str2attributetype( mat[i].schema, &code,
486 &err, LDAP_SCHEMA_ALLOW_ALL );
489 LDAP_LOG( OPERATION, CRIT, "monitor_back_db_init: "
490 "in AttributeType '%s' %s before %s\n",
491 mat[i].name, ldap_scherr2str(code), err );
493 Debug( LDAP_DEBUG_ANY, "monitor_back_db_init: "
494 "in AttributeType '%s' %s before %s\n",
495 mat[i].name, ldap_scherr2str(code), err );
500 if ( at->at_oid == NULL ) {
502 LDAP_LOG( OPERATION, CRIT, "monitor_back_db_init: "
503 "null OID for attributeType '%s'\n",
506 Debug( LDAP_DEBUG_ANY, "monitor_back_db_init: "
507 "null OID for attributeType '%s'\n",
513 code = at_add(at,&err);
516 LDAP_LOG( OPERATION, CRIT, "monitor_back_db_init: "
517 "%s in attributeType '%s'\n",
518 scherr2str(code), mat[i].name, 0 );
520 Debug( LDAP_DEBUG_ANY, "monitor_back_db_init: "
521 "%s in attributeType '%s'\n",
522 scherr2str(code), mat[i].name, 0 );
528 ad = ((AttributeDescription **)&(((char *)mi)[mat[i].offset]));
530 if ( slap_str2ad( mat[i].name, ad, &text ) ) {
532 LDAP_LOG( OPERATION, CRIT,
533 "monitor_back_db_init: %s\n", text, 0, 0 );
535 Debug( LDAP_DEBUG_ANY,
536 "monitor_back_db_init: %s\n", text, 0, 0 );
542 if ( slap_str2ad( "description", &mi->monitor_ad_description, &text ) ) {
544 LDAP_LOG( OPERATION, CRIT,
545 "monitor_back_db_init: %s\n", text, 0, 0 );
547 Debug( LDAP_DEBUG_ANY,
548 "monitor_back_db_init: %s\n", text, 0, 0 );
554 * Create all the subsystem specific entries
557 for ( i = 0; monitor_subsys[ i ].mss_name != NULL; i++ ) {
558 int len = strlen( monitor_subsys[ i ].mss_name );
562 dn.bv_len = len + sizeof( "cn=" ) - 1;
563 dn.bv_val = ch_calloc( sizeof( char ), dn.bv_len + 1 );
564 strcpy( dn.bv_val, "cn=" );
565 strcat( dn.bv_val, monitor_subsys[ i ].mss_name );
566 rc = dnPretty2( NULL, &dn, &monitor_subsys[ i ].mss_rdn, NULL );
568 if ( rc != LDAP_SUCCESS ) {
570 LDAP_LOG( OPERATION, CRIT,
571 "monitor RDN \"%s\" is invalid\n",
574 Debug( LDAP_DEBUG_ANY,
575 "monitor RDN \"%s\" is invalid\n",
581 dn.bv_len += sizeof( SLAPD_MONITOR_DN ); /* 1 for the , */
582 dn.bv_val = ch_malloc( dn.bv_len + 1 );
583 strcpy( dn.bv_val , monitor_subsys[ i ].mss_rdn.bv_val );
584 strcat( dn.bv_val, "," SLAPD_MONITOR_DN );
585 rc = dnPrettyNormal( NULL, &dn, &monitor_subsys[ i ].mss_dn,
586 &monitor_subsys[ i ].mss_ndn, NULL );
588 if ( rc != LDAP_SUCCESS ) {
590 LDAP_LOG( OPERATION, CRIT,
591 "monitor DN \"%s\" is invalid\n",
594 Debug( LDAP_DEBUG_ANY,
595 "monitor DN \"%s\" is invalid\n",
601 snprintf( buf, sizeof( buf ),
603 SLAPD_MONITOR_OBJECTCLASSES
605 monitor_subsys[ i ].mss_dn.bv_val,
606 monitor_subsys[ i ].mss_name );
608 e = str2entry( buf );
612 LDAP_LOG( OPERATION, CRIT,
613 "unable to create '%s' entry\n",
614 monitor_subsys[ i ].mss_dn.bv_val, 0, 0 );
616 Debug( LDAP_DEBUG_ANY,
617 "unable to create '%s' entry\n",
618 monitor_subsys[ i ].mss_dn.bv_val, 0, 0 );
623 mp = ( struct monitorentrypriv * )ch_calloc( sizeof( struct monitorentrypriv ), 1 );
624 e->e_private = ( void * )mp;
625 mp->mp_info = &monitor_subsys[ i ];
626 mp->mp_children = NULL;
628 mp->mp_flags = monitor_subsys[ i ].mss_flags;
630 if ( monitor_cache_add( mi, e ) ) {
632 LDAP_LOG( OPERATION, CRIT,
633 "unable to add entry '%s' to cache\n",
634 monitor_subsys[ i ].mss_dn.bv_val, 0, 0 );
636 Debug( LDAP_DEBUG_ANY,
637 "unable to add entry '%s' to cache\n",
638 monitor_subsys[ i ].mss_dn.bv_val, 0, 0 );
647 * creates the "cn=Monitor" entry
649 snprintf( buf, sizeof( buf ),
650 "dn: " SLAPD_MONITOR_DN "\n"
652 "objectClass: monitor\n"
653 "objectClass: extensibleObject\n"
654 "structuralObjectClass: monitor\n"
657 e = str2entry( buf );
660 LDAP_LOG( OPERATION, CRIT,
661 "unable to create '%s' entry\n",
662 SLAPD_MONITOR_DN, 0, 0 );
664 Debug( LDAP_DEBUG_ANY,
665 "unable to create '%s' entry\n%s%s",
666 SLAPD_MONITOR_DN, "", "" );
670 bv.bv_val = (char *) Versionstr;
671 end_of_line = strchr( Versionstr, '\n' );
673 bv.bv_len = end_of_line - Versionstr;
675 bv.bv_len = strlen( Versionstr );
677 if ( attr_merge_normalize_one( e, mi->monitor_ad_description,
680 LDAP_LOG( OPERATION, CRIT,
681 "unable to add description to '%s' entry\n",
682 SLAPD_MONITOR_DN, 0, 0 );
684 Debug( LDAP_DEBUG_ANY,
685 "unable to add description to '%s' entry\n%s%s",
686 SLAPD_MONITOR_DN, "", "" );
691 mp = ( struct monitorentrypriv * )ch_calloc( sizeof( struct monitorentrypriv ), 1 );
692 e->e_private = ( void * )mp;
695 mp->mp_children = e_tmp;
698 if ( monitor_cache_add( mi, e ) ) {
700 LDAP_LOG( OPERATION, CRIT,
701 "unable to add entry '%s' to cache\n",
702 SLAPD_MONITOR_DN, 0, 0 );
704 Debug( LDAP_DEBUG_ANY,
705 "unable to add entry '%s' to cache\n%s%s",
706 SLAPD_MONITOR_DN, "", "" );
717 monitor_back_db_open(
721 struct monitorsubsys *ms;
726 * opens the monitor backend
728 for ( ms = monitor_subsys; ms->mss_name != NULL; ms++ ) {
729 if ( ms->mss_init && ( *ms->mss_init )( be ) ) {
747 * eventually, will hold backend specific configuration parameters
753 monitor_back_db_config(
762 * eventually, will hold database specific configuration parameters
765 LDAP_LOG( CONFIG, INFO,
766 "line %d of file '%s' will be ignored\n", lineno, fname, 0 );
768 Debug( LDAP_DEBUG_CONFIG,
769 "line %d of file '%s' will be ignored\n%s", lineno, fname, "" );
775 monitor_back_db_destroy(
780 * FIXME: destroys all the data