]> git.sur5r.net Git - openldap/blob - servers/slapd/back-monitor/init.c
More struct berval DNs
[openldap] / servers / slapd / back-monitor / init.c
1 /* init.c - initialize monitor backend */
2 /*
3  * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved.
4  * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
5  */
6 /*
7  * Copyright 2001 The OpenLDAP Foundation, All Rights Reserved.
8  * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
9  * 
10  * Copyright 2001, Pierangelo Masarati, All rights reserved. <ando@sys-net.it>
11  * 
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.
15  * 
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:
19  * 
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
22  *    flaws in it.
23  * 
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.
27  * 
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
32  *    alterations.
33  * 
34  * 4. This notice may not be removed or altered.
35  */
36
37 #include "portable.h"
38
39 #include <stdio.h>
40 #include <ac/string.h>
41
42 #include "slap.h"
43 #include "back-monitor.h"
44
45 /*
46  * used by many functions to add description to entries
47  */
48 AttributeDescription *monitor_ad_desc = NULL;
49
50 /*
51  * subsystem data
52  */
53 struct monitorsubsys monitor_subsys[] = {
54         { 
55                 SLAPD_MONITOR_LISTENER, SLAPD_MONITOR_LISTENER_NAME,    
56                 NULL, NULL, NULL,
57                 MONITOR_F_NONE,
58                 NULL,   /* init */
59                 NULL,   /* update */
60                 NULL,   /* create */
61                 NULL    /* modify */
62         }, { 
63                 SLAPD_MONITOR_DATABASE, SLAPD_MONITOR_DATABASE_NAME,    
64                 NULL, NULL, NULL,
65                 MONITOR_F_PERSISTENT_CH,
66                 monitor_subsys_database_init,
67                 NULL,   /* update */
68                 NULL,   /* create */
69                 NULL    /* modify */
70         }, { 
71                 SLAPD_MONITOR_BACKEND, SLAPD_MONITOR_BACKEND_NAME, 
72                 NULL, NULL, NULL,
73                 MONITOR_F_PERSISTENT_CH,
74                 monitor_subsys_backend_init,
75                 NULL,   /* update */
76                 NULL,   /* create */
77                 NULL    /* modify */
78         }, { 
79                 SLAPD_MONITOR_THREAD, SLAPD_MONITOR_THREAD_NAME,        
80                 NULL, NULL, NULL,
81                 MONITOR_F_NONE,
82                 monitor_subsys_thread_init,
83                 monitor_subsys_thread_update,
84                 NULL,   /* create */
85                 NULL    /* modify */
86         }, { 
87                 SLAPD_MONITOR_SASL, SLAPD_MONITOR_SASL_NAME,    
88                 NULL, NULL, NULL,
89                 MONITOR_F_NONE,
90                 NULL,   /* init */
91                 NULL,   /* update */
92                 NULL,   /* create */
93                 NULL    /* modify */
94         }, { 
95                 SLAPD_MONITOR_TLS, SLAPD_MONITOR_TLS_NAME,
96                 NULL, NULL, NULL,
97                 MONITOR_F_NONE,
98                 NULL,   /* init */
99                 NULL,   /* update */
100                 NULL,   /* create */
101                 NULL    /* modify */
102         }, { 
103                 SLAPD_MONITOR_CONN, SLAPD_MONITOR_CONN_NAME,
104                 NULL, NULL, NULL,
105                 MONITOR_F_VOLATILE_CH,
106                 monitor_subsys_conn_init,
107                 monitor_subsys_conn_update,
108                 monitor_subsys_conn_create,
109                 NULL    /* modify */
110         }, { 
111                 SLAPD_MONITOR_READW, SLAPD_MONITOR_READW_NAME,
112                 NULL, NULL, NULL,
113                 MONITOR_F_NONE,
114                 NULL,   /* init */
115                 monitor_subsys_readw_update,
116                 NULL,   /* create */
117                 NULL    /* modify */
118         }, { 
119                 SLAPD_MONITOR_WRITEW, SLAPD_MONITOR_WRITEW_NAME,
120                 NULL, NULL, NULL,
121                 MONITOR_F_NONE,
122                 NULL,   /* init */
123                 monitor_subsys_writew_update,
124                 NULL,   /* create */
125                 NULL    /* modify */
126         }, { 
127                 SLAPD_MONITOR_LOG, SLAPD_MONITOR_LOG_NAME,
128                 NULL, NULL, NULL,
129                 MONITOR_F_NONE,
130                 monitor_subsys_log_init,
131                 NULL,   /* update */
132                 NULL,   /* create */
133                 monitor_subsys_log_modify
134         }, { 
135                 SLAPD_MONITOR_OPS, SLAPD_MONITOR_OPS_NAME,
136                 NULL, NULL, NULL,
137                 MONITOR_F_NONE,
138                 monitor_subsys_ops_init,
139                 monitor_subsys_ops_update,
140                 NULL,   /* create */
141                 NULL,   /* modify */
142         }, { 
143                 SLAPD_MONITOR_SENT, SLAPD_MONITOR_SENT_NAME,
144                 NULL, NULL, NULL,
145                 MONITOR_F_NONE,
146                 monitor_subsys_sent_init,
147                 monitor_subsys_sent_update,
148                 NULL,   /* create */
149                 NULL,   /* modify */
150         }, { -1, NULL }
151 };
152
153 int
154 monitor_back_initialize(
155         BackendInfo     *bi
156 )
157 {
158         static char *controls[] = {
159                 LDAP_CONTROL_MANAGEDSAIT,
160                 NULL
161         };
162
163         bi->bi_controls = controls;
164
165         bi->bi_init = NULL;
166         bi->bi_open = monitor_back_open;
167         bi->bi_config = monitor_back_config;
168         bi->bi_close = NULL;
169         bi->bi_destroy = NULL;
170
171         bi->bi_db_init = monitor_back_db_init;
172         bi->bi_db_config = monitor_back_db_config;
173         bi->bi_db_open = NULL;
174         bi->bi_db_close = NULL;
175         bi->bi_db_destroy = monitor_back_db_destroy;
176
177         bi->bi_op_bind = monitor_back_bind;
178         bi->bi_op_unbind = NULL;
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 = NULL;
183         bi->bi_op_add = NULL;
184         bi->bi_op_delete = NULL;
185         bi->bi_op_abandon = monitor_back_abandon;
186
187         bi->bi_extended = NULL;
188
189         bi->bi_entry_release_rw = NULL;
190         bi->bi_acl_group = NULL;
191         bi->bi_acl_attribute = NULL;
192         bi->bi_chk_referrals = NULL;
193         bi->bi_operational = monitor_back_operational;
194
195         /*
196          * hooks for slap tools
197          */
198         bi->bi_tool_entry_open = NULL;
199         bi->bi_tool_entry_close = NULL;
200         bi->bi_tool_entry_first = NULL;
201         bi->bi_tool_entry_next = NULL;
202         bi->bi_tool_entry_get = NULL;
203         bi->bi_tool_entry_put = NULL;
204         bi->bi_tool_entry_reindex = NULL;
205         bi->bi_tool_sync = NULL;
206
207         bi->bi_connection_init = 0;
208         bi->bi_connection_destroy = 0;
209
210         return 0;
211 }
212
213 int
214 monitor_back_db_init(
215         BackendDB       *be
216 )
217 {
218         struct monitorinfo      *mi;
219         Entry                   *e, *e_tmp;
220         struct monitorentrypriv *mp;
221         int                     i, rc;
222         char                    buf[1024], *end_of_line;
223         struct berval   dn, *ndn;
224         const char              *text;
225         struct berval           val, *bv[2] = { &val, NULL };
226
227         /*
228          * database monitor can be defined once only
229          */
230         static int              monitor_defined = 0;
231
232         if ( monitor_defined ) {
233 #ifdef NEW_LOGGING
234                 LDAP_LOG(( "operation", LDAP_LEVEL_CRIT,
235                         "only one monitor backend is allowed\n" ));
236 #else
237                 Debug( LDAP_DEBUG_ANY,
238                         "only one monitor backend is allowed\n%s%s%s",
239                         "", "", "" );
240 #endif
241                 return( -1 );
242         }
243         monitor_defined++;
244
245         ndn = NULL;
246         dn.bv_val = SLAPD_MONITOR_DN;
247         dn.bv_len = sizeof( SLAPD_MONITOR_DN ) - 1;
248
249         rc = dnNormalize( NULL, &dn, &ndn );
250         if( rc != LDAP_SUCCESS ) {
251 #ifdef NEW_LOGGING
252                 LDAP_LOG(( "operation", LDAP_LEVEL_CRIT,
253                         "monitor DN \"" SLAPD_MONITOR_DN "\" backend is allowed\n" ));
254 #else
255                 Debug( LDAP_DEBUG_ANY,
256                         "monitor DN \"" SLAPD_MONITOR_DN "\" backend is allowed\n",
257                         0, 0, 0 );
258 #endif
259                 return -1;
260         }
261
262         ber_bvecadd( &be->be_nsuffix, ndn );
263
264         mi = ( struct monitorinfo * )ch_calloc( sizeof( struct monitorinfo ), 1 );
265         ldap_pvt_thread_mutex_init( &mi->mi_cache_mutex );
266
267         if ( slap_str2ad( "description", &monitor_ad_desc, &text ) ) {
268 #ifdef NEW_LOGGING
269                 LDAP_LOG(( "operation", LDAP_LEVEL_CRIT,
270                         "monitor_back_db_init: %s\n", text ));
271 #else
272                 Debug( LDAP_DEBUG_ANY,
273                         "monitor_subsys_backend_init: %s\n%s%s", 
274                         text, "", "" );
275 #endif
276                 return( -1 );
277         }
278
279         /*      
280          * Create all the subsystem specific entries
281          */
282         e_tmp = NULL;
283         for ( i = 0; monitor_subsys[ i ].mss_name != NULL; i++ ) {
284                 int len = strlen( monitor_subsys[ i ].mss_name );
285
286                 monitor_subsys[ i ].mss_rdn = ch_calloc( sizeof( char ), 
287                                 4 + len );
288                 strcpy( monitor_subsys[ i ].mss_rdn, "cn=" );
289                 strcat( monitor_subsys[ i ].mss_rdn, 
290                                 monitor_subsys[ i ].mss_name );
291
292                 monitor_subsys[ i ].mss_dn = ch_calloc( sizeof( char ), 
293                                 4 + len + sizeof( SLAPD_MONITOR_DN ) );
294                 strcpy( monitor_subsys[ i ].mss_dn, 
295                                 monitor_subsys[ i ].mss_rdn );
296                 strcat( monitor_subsys[ i ].mss_dn, "," );
297                 strcat( monitor_subsys[ i ].mss_dn, SLAPD_MONITOR_DN );
298
299                 monitor_subsys[ i ].mss_ndn 
300                         = ch_strdup( monitor_subsys[ i ].mss_dn );
301                 dn_normalize( monitor_subsys[ i ].mss_ndn );
302
303                 snprintf( buf, sizeof( buf ),
304                                 "dn: %s\n"
305                                 "objectClass: top\n"
306                                 "objectClass: LDAPsubEntry\n"
307 #ifdef SLAPD_MONITORSUBENTRY
308                                 "objectClass: monitorSubEntry\n"
309 #else /* !SLAPD_MONITORSUBENTRY */
310                                 "objectClass: extensibleObject\n"
311 #endif /* !SLAPD_MONITORSUBENTRY */
312                                 "cn: %s\n",
313                                 monitor_subsys[ i ].mss_dn,
314                                 monitor_subsys[ i ].mss_name );
315                 
316                 e = str2entry( buf );
317                 
318                 if ( e == NULL) {
319 #ifdef NEW_LOGGING
320                         LDAP_LOG(( "operation", LDAP_LEVEL_CRIT,
321                                 "unable to create '%s' entry\n", 
322                                 monitor_subsys[ i ].mss_dn ));
323 #else
324                         Debug( LDAP_DEBUG_ANY,
325                                 "unable to create '%s' entry\n%s%s", 
326                                 monitor_subsys[ i ].mss_dn, "", "" );
327 #endif
328                         return( -1 );
329                 }
330
331                 mp = ( struct monitorentrypriv * )ch_calloc( sizeof( struct monitorentrypriv ), 1 );
332                 e->e_private = ( void * )mp;
333                 mp->mp_info = &monitor_subsys[ i ];
334                 mp->mp_children = NULL;
335                 mp->mp_next = e_tmp;
336                 mp->mp_flags = monitor_subsys[ i ].mss_flags;
337
338                 if ( monitor_cache_add( mi, e ) ) {
339 #ifdef NEW_LOGGING
340                         LDAP_LOG(( "operation", LDAP_LEVEL_CRIT,
341                                 "unable to add entry '%s' to cache\n",
342                                 monitor_subsys[ i ].mss_dn ));
343 #else
344                         Debug( LDAP_DEBUG_ANY,
345                                 "unable to add entry '%s' to cache\n%s%s",
346                                 monitor_subsys[ i ].mss_dn, "", "" );
347 #endif
348                         return -1;
349                 }
350
351                 e_tmp = e;
352         }
353
354         /*
355          * creates the "cn=Monitor" entry 
356          */
357         snprintf( buf, sizeof( buf ), 
358                         "dn: " SLAPD_MONITOR_DN "\n"
359                         "objectClass: top\n"
360                         "objectClass: LDAPsubEntry\n"
361 #ifdef SLAPD_MONITORSUBENTRY
362                         "objectClass: monitorSubEntry\n"
363 #else /* !SLAPD_MONITORSUBENTRY */
364                         "objectClass: extensibleObject\n"
365 #endif /* !SLAPD_MONITORSUBENTRY */
366                         "cn: Monitor" );
367
368         e = str2entry( buf );
369         if ( e == NULL) {
370 #ifdef NEW_LOGGING
371                 LDAP_LOG(( "operation", LDAP_LEVEL_CRIT,
372                         "unable to create '%s' entry\n",
373                         SLAPD_MONITOR_DN ));
374 #else
375                 Debug( LDAP_DEBUG_ANY,
376                         "unable to create '%s' entry\n%s%s",
377                         SLAPD_MONITOR_DN, "", "" );
378 #endif
379                 return( -1 );
380         }
381         val.bv_val = (char *) Versionstr;
382         end_of_line = strchr( Versionstr, '\n' );
383         if ( end_of_line ) {
384                 val.bv_len = end_of_line - Versionstr;
385         } else {
386                 val.bv_len = strlen( Versionstr );
387         }
388         if ( attr_merge( e, monitor_ad_desc, bv ) ) {
389 #ifdef NEW_LOGGING
390                 LDAP_LOG(( "operation", LDAP_LEVEL_CRIT,
391                         "unable to add description to '%s' entry\n",
392                         SLAPD_MONITOR_DN ));
393 #else
394                 Debug( LDAP_DEBUG_ANY,
395                         "unable to add description to '%s' entry\n%s%s",
396                         SLAPD_MONITOR_DN, "", "" );
397 #endif
398                 return( -1 );
399         }
400
401         mp = ( struct monitorentrypriv * )ch_calloc( sizeof( struct monitorentrypriv ), 1 );
402         e->e_private = ( void * )mp;
403
404         mp->mp_info = NULL;
405         mp->mp_children = e_tmp;
406         mp->mp_next = NULL;
407
408         if ( monitor_cache_add( mi, e ) ) {
409 #ifdef NEW_LOGGING
410                 LDAP_LOG(( "operation", LDAP_LEVEL_CRIT,
411                         "unable to add entry '%s' to cache\n",
412                         SLAPD_MONITOR_DN ));
413 #else
414                 Debug( LDAP_DEBUG_ANY,
415                         "unable to add entry '%s' to cache\n%s%s",
416                         SLAPD_MONITOR_DN, "", "" );
417 #endif
418                 return -1;
419         }
420
421         be->be_private = mi;
422         
423         return 0;
424 }
425
426 int
427 monitor_back_open(
428         BackendInfo     *bi
429 )
430 {
431         BackendDB               *be;
432         struct monitorsubsys    *ms;
433         struct berval dn = { sizeof(SLAPD_MONITOR_DN)-1, SLAPD_MONITOR_DN };
434         struct berval *ndn = NULL;
435         int rc;
436
437         /*
438          * adds the monitor backend
439          */
440         rc = dnNormalize( NULL, &dn, &ndn );
441         if( rc != LDAP_SUCCESS ) {
442 #ifdef NEW_LOGGING
443                 LDAP_LOG(( "operation", LDAP_LEVEL_CRIT,
444                         "monitor DN \"" SLAPD_MONITOR_DN "\" is invalid\n" ));
445 #else
446                 Debug( LDAP_DEBUG_ANY,
447                         "monitor DN \"" SLAPD_MONITOR_DN "\" is invalid\n",
448                         0, 0, 0 );
449 #endif
450                 return( -1 );
451         }
452
453         be = select_backend( ndn , 0, 0 );
454         ber_bvfree( ndn );
455
456         if ( be == NULL ) {
457 #ifdef NEW_LOGGING
458                 LDAP_LOG(( "operation", LDAP_LEVEL_CRIT,
459                         "unable to get monitor backend\n" ));
460 #else
461                 Debug( LDAP_DEBUG_ANY,
462                         "unable to get monitor backend\n", 0, 0, 0 );
463 #endif
464                 return( -1 );
465         }
466
467         for ( ms = monitor_subsys; ms->mss_name != NULL; ms++ ) {
468                 if ( ms->mss_init && ( *ms->mss_init )( be ) ) {
469                         return( -1 );
470                 }
471         }
472
473         return( 0 );
474 }
475
476 int
477 monitor_back_config(
478         BackendInfo     *bi,
479         const char      *fname,
480         int             lineno,
481         int             argc,
482         char            **argv
483 )
484 {
485         /*
486          * eventually, will hold backend specific configuration parameters
487          */
488         return 0;
489 }
490
491 int
492 monitor_back_db_config(
493         Backend     *be,
494         const char  *fname,
495         int         lineno,
496         int         argc,
497         char        **argv
498 )
499 {
500 #ifdef NEW_LOGGING
501         LDAP_LOG(( "config", LDAP_DEBUG_NOTICE,
502                 "line %d of file '%s' will be ignored\n", lineno, fname ));
503 #else
504         Debug( LDAP_DEBUG_CONFIG, 
505                 "line %d of file '%s' will be ignored\n%s", lineno, fname, "" );
506 #endif
507         return( 0 );
508 }
509
510 int
511 monitor_back_db_destroy(
512         BackendDB       *be
513 )
514 {
515         /*
516          * FIXME: destroys all the data
517          */
518         return 0;
519 }
520