X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fback-monitor%2Ftime.c;h=6475fe78011965e348a2e67bea967456ad1d473a;hb=a75e57d15ae5024dfb76fefc46b113951969e8f3;hp=d9e4bc1b1c5941c61a69cae0e9fbc973f1b37bf5;hpb=072280600ad3957d790e190c4f4fa053e5bda31d;p=openldap diff --git a/servers/slapd/back-monitor/time.c b/servers/slapd/back-monitor/time.c index d9e4bc1b1c..6475fe7801 100644 --- a/servers/slapd/back-monitor/time.c +++ b/servers/slapd/back-monitor/time.c @@ -1,34 +1,22 @@ /* time.c - deal with time subsystem */ -/* - * Copyright 1998-2003 The OpenLDAP Foundation, All Rights Reserved. - * COPYING RESTRICTIONS APPLY, see COPYRIGHT file +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright 2001-2013 The OpenLDAP Foundation. + * Portions Copyright 2001-2003 Pierangelo Masarati. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . */ -/* - * Copyright 2001, Pierangelo Masarati, All rights reserved. - * - * This work has beed deveolped for the OpenLDAP Foundation - * in the hope that it may be useful to the Open Source community, - * but WITHOUT ANY WARRANTY. - * - * Permission is granted to anyone to use this software for any purpose - * on any computer system, and to alter it and redistribute it, subject - * to the following restrictions: - * - * 1. The author and SysNet s.n.c. are not responsible for the consequences - * of use of this software, no matter how awful, even if they arise from - * flaws in it. - * - * 2. The origin of this software must not be misrepresented, either by - * explicit claim or by omission. Since few users ever read sources, - * credits should appear in the documentation. - * - * 3. Altered versions must be plainly marked as such, and must not be - * misrepresented as being the original software. Since few users - * ever read sources, credits should appear in the documentation. - * SysNet s.n.c. cannot be responsible for the consequences of the - * alterations. - * - * 4. This notice may not be removed or altered. +/* ACKNOWLEDGEMENTS: + * This work was initially developed by Pierangelo Masarati for inclusion + * in OpenLDAP Software. */ #include "portable.h" @@ -43,183 +31,171 @@ #include "proto-slap.h" #include "back-monitor.h" +static int +monitor_subsys_time_update( + Operation *op, + SlapReply *rs, + Entry *e ); + int monitor_subsys_time_init( - BackendDB *be -) + BackendDB *be, + monitor_subsys_t *ms ) { - struct monitorinfo *mi; + monitor_info_t *mi; - Entry *e, *e_tmp, *e_time; - struct monitorentrypriv *mp; - char buf[ BACKMONITOR_BUFSIZE ]; + Entry *e, **ep, *e_time; + monitor_entry_t *mp; + struct berval bv, value; assert( be != NULL ); - mi = ( struct monitorinfo * )be->be_private; + ms->mss_update = monitor_subsys_time_update; + + mi = ( monitor_info_t * )be->be_private; if ( monitor_cache_get( mi, - &monitor_subsys[SLAPD_MONITOR_TIME].mss_ndn, &e_time ) ) { -#ifdef NEW_LOGGING - LDAP_LOG( OPERATION, CRIT, - "monitor_subsys_time_init: " - "unable to get entry '%s'\n", - monitor_subsys[SLAPD_MONITOR_TIME].mss_ndn.bv_val, 0, 0 ); -#else + &ms->mss_ndn, &e_time ) ) { Debug( LDAP_DEBUG_ANY, "monitor_subsys_time_init: " - "unable to get entry '%s'\n%s%s", - monitor_subsys[SLAPD_MONITOR_TIME].mss_ndn.bv_val, - "", "" ); -#endif + "unable to get entry \"%s\"\n", + ms->mss_ndn.bv_val, 0, 0 ); return( -1 ); } - e_tmp = NULL; - - snprintf( buf, sizeof( buf ), - "dn: cn=Start,%s\n" - "objectClass: %s\n" - "structuralObjectClass: %s\n" - "cn: Start\n" - "%s: %s\n" - "createTimestamp: %s\n" - "modifyTimestamp: %s\n", - monitor_subsys[SLAPD_MONITOR_TIME].mss_dn.bv_val, - mi->mi_oc_monitoredObject->soc_cname.bv_val, - mi->mi_oc_monitoredObject->soc_cname.bv_val, - mi->mi_ad_monitorTimestamp->ad_cname.bv_val, - mi->mi_startTime.bv_val, - mi->mi_startTime.bv_val, - mi->mi_startTime.bv_val ); - - e = str2entry( buf ); + mp = ( monitor_entry_t * )e_time->e_private; + mp->mp_children = NULL; + ep = &mp->mp_children; + + BER_BVSTR( &bv, "cn=Start" ); + e = monitor_entry_stub( &ms->mss_dn, &ms->mss_ndn, &bv, + mi->mi_oc_monitoredObject, NULL, NULL ); if ( e == NULL ) { -#ifdef NEW_LOGGING - LDAP_LOG( OPERATION, CRIT, - "monitor_subsys_time_init: " - "unable to create entry 'cn=Start,%s'\n", - monitor_subsys[SLAPD_MONITOR_TIME].mss_ndn.bv_val, 0, 0 ); -#else Debug( LDAP_DEBUG_ANY, "monitor_subsys_time_init: " - "unable to create entry 'cn=Start,%s'\n%s%s", - monitor_subsys[SLAPD_MONITOR_TIME].mss_ndn.bv_val, - "", "" ); -#endif + "unable to create entry \"%s,%s\"\n", + bv.bv_val, ms->mss_ndn.bv_val, 0 ); return( -1 ); } + attr_merge_normalize_one( e, mi->mi_ad_monitorTimestamp, + &mi->mi_startTime, NULL ); - mp = ( struct monitorentrypriv * )ch_calloc( sizeof( struct monitorentrypriv ), 1 ); + mp = monitor_entrypriv_create(); + if ( mp == NULL ) { + return -1; + } e->e_private = ( void * )mp; - mp->mp_next = e_tmp; - mp->mp_children = NULL; - mp->mp_info = &monitor_subsys[SLAPD_MONITOR_TIME]; - mp->mp_flags = monitor_subsys[SLAPD_MONITOR_TIME].mss_flags \ + mp->mp_info = ms; + mp->mp_flags = ms->mss_flags \ | MONITOR_F_SUB | MONITOR_F_PERSISTENT; if ( monitor_cache_add( mi, e ) ) { -#ifdef NEW_LOGGING - LDAP_LOG( OPERATION, CRIT, - "monitor_subsys_time_init: " - "unable to add entry 'cn=Start,%s'\n", - monitor_subsys[SLAPD_MONITOR_TIME].mss_ndn.bv_val, 0, 0 ); -#else Debug( LDAP_DEBUG_ANY, "monitor_subsys_time_init: " - "unable to add entry 'cn=Start,%s'\n%s%s", - monitor_subsys[SLAPD_MONITOR_TIME].mss_ndn.bv_val, - "", "" ); -#endif + "unable to add entry \"%s,%s\"\n", + bv.bv_val, ms->mss_ndn.bv_val, 0 ); return( -1 ); } - e_tmp = e; + *ep = e; + ep = &mp->mp_next; /* * Current */ - snprintf( buf, sizeof( buf ), - "dn: cn=Current,%s\n" - "objectClass: %s\n" - "structuralObjectClass: %s\n" - "cn: Current\n" - "%s: %s\n" - "createTimestamp: %s\n" - "modifyTimestamp: %s\n", - monitor_subsys[SLAPD_MONITOR_TIME].mss_dn.bv_val, - mi->mi_oc_monitoredObject->soc_cname.bv_val, - mi->mi_oc_monitoredObject->soc_cname.bv_val, - mi->mi_ad_monitorTimestamp->ad_cname.bv_val, - mi->mi_startTime.bv_val, - mi->mi_startTime.bv_val, - mi->mi_startTime.bv_val ); - - e = str2entry( buf ); + BER_BVSTR( &bv, "cn=Current" ); + e = monitor_entry_stub( &ms->mss_dn, &ms->mss_ndn, &bv, + mi->mi_oc_monitoredObject, NULL, NULL ); if ( e == NULL ) { -#ifdef NEW_LOGGING - LDAP_LOG( OPERATION, CRIT, - "monitor_subsys_time_init: " - "unable to create entry 'cn=Current,%s'\n", - monitor_subsys[SLAPD_MONITOR_TIME].mss_ndn.bv_val, 0, 0 ); -#else Debug( LDAP_DEBUG_ANY, "monitor_subsys_time_init: " - "unable to create entry 'cn=Current,%s'\n%s%s", - monitor_subsys[SLAPD_MONITOR_TIME].mss_ndn.bv_val, - "", "" ); -#endif + "unable to create entry \"%s,%s\"\n", + bv.bv_val, ms->mss_ndn.bv_val, 0 ); return( -1 ); } + attr_merge_normalize_one( e, mi->mi_ad_monitorTimestamp, + &mi->mi_startTime, NULL ); - mp = ( struct monitorentrypriv * )ch_calloc( sizeof( struct monitorentrypriv ), 1 ); + mp = monitor_entrypriv_create(); + if ( mp == NULL ) { + return -1; + } e->e_private = ( void * )mp; - mp->mp_next = e_tmp; - mp->mp_children = NULL; - mp->mp_info = &monitor_subsys[SLAPD_MONITOR_TIME]; - mp->mp_flags = monitor_subsys[SLAPD_MONITOR_TIME].mss_flags \ + mp->mp_info = ms; + mp->mp_flags = ms->mss_flags \ | MONITOR_F_SUB | MONITOR_F_PERSISTENT; if ( monitor_cache_add( mi, e ) ) { -#ifdef NEW_LOGGING - LDAP_LOG( OPERATION, CRIT, - "monitor_subsys_time_init: " - "unable to add entry 'cn=Current,%s'\n", - monitor_subsys[SLAPD_MONITOR_TIME].mss_ndn.bv_val, 0, 0 ); -#else Debug( LDAP_DEBUG_ANY, "monitor_subsys_time_init: " - "unable to add entry 'cn=Current,%s'\n%s%s", - monitor_subsys[SLAPD_MONITOR_TIME].mss_ndn.bv_val, - "", "" ); -#endif + "unable to add entry \"%s,%s\"\n", + bv.bv_val, ms->mss_ndn.bv_val, 0 ); return( -1 ); } - e_tmp = e; + *ep = e; + ep = &mp->mp_next; + + /* + * Uptime + */ + BER_BVSTR( &bv, "cn=Uptime" ); + e = monitor_entry_stub( &ms->mss_dn, &ms->mss_ndn, &bv, + mi->mi_oc_monitoredObject, NULL, NULL ); + if ( e == NULL ) { + Debug( LDAP_DEBUG_ANY, + "monitor_subsys_time_init: " + "unable to create entry \"%s,%s\"\n", + bv.bv_val, ms->mss_ndn.bv_val, 0 ); + return( -1 ); + } + BER_BVSTR( &value, "0" ); + attr_merge_normalize_one( e, mi->mi_ad_monitoredInfo, + &value, NULL ); - mp = ( struct monitorentrypriv * )e_time->e_private; - mp->mp_children = e_tmp; + mp = monitor_entrypriv_create(); + if ( mp == NULL ) { + return -1; + } + e->e_private = ( void * )mp; + mp->mp_info = ms; + mp->mp_flags = ms->mss_flags \ + | MONITOR_F_SUB | MONITOR_F_PERSISTENT; + + if ( monitor_cache_add( mi, e ) ) { + Debug( LDAP_DEBUG_ANY, + "monitor_subsys_time_init: " + "unable to add entry \"%s,%s\"\n", + bv.bv_val, ms->mss_ndn.bv_val, 0 ); + return( -1 ); + } + + *ep = e; + ep = &mp->mp_next; monitor_cache_release( mi, e_time ); return( 0 ); } -int +static int monitor_subsys_time_update( Operation *op, - Entry *e -) + SlapReply *rs, + Entry *e ) { - struct monitorinfo *mi = (struct monitorinfo *)op->o_bd->be_private; + monitor_info_t *mi = ( monitor_info_t * )op->o_bd->be_private; + static struct berval bv_current = BER_BVC( "cn=current" ), + bv_uptime = BER_BVC( "cn=uptime" ); + struct berval rdn; + + assert( mi != NULL ); + assert( e != NULL ); - assert( mi ); - assert( e ); + dnRdn( &e->e_nname, &rdn ); - if ( strncmp( e->e_nname.bv_val, "cn=current", - sizeof("cn=current") - 1 ) == 0 ) { - struct tm *tm; + if ( dn_match( &rdn, &bv_current ) ) { + struct tm tm; char tmbuf[ LDAP_LUTIL_GENTIME_BUFSIZE ]; Attribute *a; ber_len_t len; @@ -227,27 +203,45 @@ monitor_subsys_time_update( currtime = slap_get_time(); - ldap_pvt_thread_mutex_lock( &gmtime_mutex ); -#ifdef HACK_LOCAL_TIME - tm = localtime( &currtime ); - lutil_localtime( tmbuf, sizeof( tmbuf ), tm, -timezone ); -#else /* !HACK_LOCAL_TIME */ - tm = gmtime( &currtime ); - lutil_gentime( tmbuf, sizeof( tmbuf ), tm ); -#endif /* !HACK_LOCAL_TIME */ - ldap_pvt_thread_mutex_unlock( &gmtime_mutex ); + ldap_pvt_gmtime( &currtime, &tm ); + lutil_gentime( tmbuf, sizeof( tmbuf ), &tm ); len = strlen( tmbuf ); a = attr_find( e->e_attrs, mi->mi_ad_monitorTimestamp ); if ( a == NULL ) { - return( -1 ); + return rs->sr_err = LDAP_OTHER; } - assert( len == a->a_vals[0].bv_len ); - AC_MEMCPY( a->a_vals[0].bv_val, tmbuf, len ); + assert( len == a->a_vals[ 0 ].bv_len ); + AC_MEMCPY( a->a_vals[ 0 ].bv_val, tmbuf, len ); + + /* FIXME: touch modifyTimestamp? */ + + } else if ( dn_match( &rdn, &bv_uptime ) ) { + Attribute *a; + double diff; + char buf[ BACKMONITOR_BUFSIZE ]; + struct berval bv; + + a = attr_find( e->e_attrs, mi->mi_ad_monitoredInfo ); + if ( a == NULL ) { + return rs->sr_err = LDAP_OTHER; + } + + diff = difftime( slap_get_time(), starttime ); + bv.bv_len = snprintf( buf, sizeof( buf ), "%lu", + (unsigned long) diff ); + bv.bv_val = buf; + + ber_bvreplace( &a->a_vals[ 0 ], &bv ); + if ( a->a_nvals != a->a_vals ) { + ber_bvreplace( &a->a_nvals[ 0 ], &bv ); + } + + /* FIXME: touch modifyTimestamp? */ } - return( 0 ); + return SLAP_CB_CONTINUE; }