1 /* back-monitor.h - ldap monitor back-end header file */ 2 /* $OpenLDAP: pkg/ldap/servers/slapd/back-monitor/back-monitor.h,v 1.52.2.5 2008/02/11 23:26:47 kurt Exp $ */ 3 /* This work is part of OpenLDAP Software <http://www.openldap.org/>. 4 * 5 * Copyright 2001-2008 The OpenLDAP Foundation. 6 * Portions Copyright 2001-2003 Pierangelo Masarati. 7 * All rights reserved. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted only as authorized by the OpenLDAP 11 * Public License. 12 * 13 * A copy of this license is available in file LICENSE in the 14 * top-level directory of the distribution or, alternatively, at 15 * <http://www.OpenLDAP.org/license.html>. 16 */ 17 /* ACKNOWLEDGEMENTS: 18 * This work was initially developed by Pierangelo Masarati for inclusion 19 * in OpenLDAP Software. 20 */ 21 22 #ifndef _BACK_MONITOR_H_ 23 #define _BACK_MONITOR_H_ 24 25 #include <ldap_pvt.h> 26 #include <ldap_pvt_thread.h> 27 #include <avl.h> 28 #include <slap.h> 29 30 LDAP_BEGIN_DECL 31 32 /* define if si_ad_labeledURI is removed from slap_schema */ 33 #undef MONITOR_DEFINE_LABELEDURI 34 35 typedef struct monitor_callback_t { 36 int (*mc_update)( Operation *op, SlapReply *rs, Entry *e, void *priv ); 37 /* update callback 38 for user-defined entries */ 39 int (*mc_modify)( Operation *op, SlapReply *rs, Entry *e, void *priv ); 40 /* modify callback 41 for user-defined entries */ 42 int (*mc_free)( Entry *e, void **priv ); 43 /* delete callback 44 for user-defined entries */ 45 void (*mc_dispose)( void **priv ); 46 /* dispose callback 47 to dispose of the callback 48 private data itself */ 49 void *mc_private; /* opaque pointer to 50 private data */ 51 struct monitor_callback_t *mc_next; 52 } monitor_callback_t; 53 54 55 typedef struct monitor_entry_t { 56 ldap_pvt_thread_mutex_t mp_mutex; /* entry mutex */ 57 Entry *mp_next; /* pointer to next sibling */ 58 Entry *mp_children; /* pointer to first child */ 59 struct monitor_subsys_t *mp_info; /* subsystem info */ 60 #define mp_type mp_info->mss_type 61 unsigned long mp_flags; /* flags */ 62 63 #define MONITOR_F_NONE 0x0000U 64 #define MONITOR_F_SUB 0x0001U /* subentry of subsystem */ 65 #define MONITOR_F_PERSISTENT 0x0010U /* persistent entry */ 66 #define MONITOR_F_PERSISTENT_CH 0x0020U /* subsystem generates 67 persistent entries */ 68 #define MONITOR_F_VOLATILE 0x0040U /* volatile entry */ 69 #define MONITOR_F_VOLATILE_CH 0x0080U /* subsystem generates 70 volatile entries */ 71 #define MONITOR_F_EXTERNAL 0x0100U /* externally added - don't free */ 72 /* NOTE: flags with 0xF0000000U mask are reserved for subsystem internals */ 73 74 struct monitor_callback_t *mp_cb; /* callback sequence */ 75 } monitor_entry_t; 76 77 struct entry_limbo_t; /* in init.c */ 78 79 typedef struct monitor_info_t { 80 81 /* 82 * Internal data 83 */ 84 Avlnode *mi_cache; 85 ldap_pvt_thread_mutex_t mi_cache_mutex; 86 87 /* 88 * Config parameters 89 */ 90 struct berval mi_startTime; /* don't free it! */ 91 struct berval mi_creatorsName; /* don't free it! */ 92 struct berval mi_ncreatorsName; /* don't free it! */ 93 94 /* 95 * Specific schema entities 96 */ 97 ObjectClass *mi_oc_monitor; 98 ObjectClass *mi_oc_monitorServer; 99 ObjectClass *mi_oc_monitorContainer; 100 ObjectClass *mi_oc_monitorCounterObject; 101 ObjectClass *mi_oc_monitorOperation; 102 ObjectClass *mi_oc_monitorConnection; 103 ObjectClass *mi_oc_managedObject; 104 ObjectClass *mi_oc_monitoredObject; 105 106 AttributeDescription *mi_ad_monitoredInfo; 107 AttributeDescription *mi_ad_managedInfo; 108 AttributeDescription *mi_ad_monitorCounter; 109 AttributeDescription *mi_ad_monitorOpCompleted; 110 AttributeDescription *mi_ad_monitorOpInitiated; 111 AttributeDescription *mi_ad_monitorConnectionNumber; 112 AttributeDescription *mi_ad_monitorConnectionAuthzDN; 113 AttributeDescription *mi_ad_monitorConnectionLocalAddress; 114 AttributeDescription *mi_ad_monitorConnectionPeerAddress; 115 AttributeDescription *mi_ad_monitorTimestamp; 116 AttributeDescription *mi_ad_monitorOverlay; 117 AttributeDescription *mi_ad_monitorConnectionProtocol; 118 AttributeDescription *mi_ad_monitorConnectionOpsReceived; 119 AttributeDescription *mi_ad_monitorConnectionOpsExecuting; 120 AttributeDescription *mi_ad_monitorConnectionOpsPending; 121 AttributeDescription *mi_ad_monitorConnectionOpsCompleted; 122 AttributeDescription *mi_ad_monitorConnectionGet; 123 AttributeDescription *mi_ad_monitorConnectionRead; 124 AttributeDescription *mi_ad_monitorConnectionWrite; 125 AttributeDescription *mi_ad_monitorConnectionMask; 126 AttributeDescription *mi_ad_monitorConnectionListener; 127 AttributeDescription *mi_ad_monitorConnectionPeerDomain; 128 AttributeDescription *mi_ad_monitorConnectionStartTime; 129 AttributeDescription *mi_ad_monitorConnectionActivityTime; 130 AttributeDescription *mi_ad_monitorIsShadow; 131 AttributeDescription *mi_ad_monitorUpdateRef; 132 AttributeDescription *mi_ad_monitorRuntimeConfig; 133 134 /* 135 * Generic description attribute 136 */ 137 AttributeDescription *mi_ad_readOnly; 138 AttributeDescription *mi_ad_restrictedOperation; 139 140 struct entry_limbo_t *mi_entry_limbo; 141 } monitor_info_t; 142 143 /* 144 * DNs 145 */ 146 147 enum { 148 SLAPD_MONITOR_BACKEND = 0, 149 SLAPD_MONITOR_CONN, 150 SLAPD_MONITOR_DATABASE, 151 SLAPD_MONITOR_LISTENER, 152 SLAPD_MONITOR_LOG, 153 SLAPD_MONITOR_OPS, 154 SLAPD_MONITOR_OVERLAY, 155 SLAPD_MONITOR_SASL, 156 SLAPD_MONITOR_SENT, 157 SLAPD_MONITOR_THREAD, 158 SLAPD_MONITOR_TIME, 159 SLAPD_MONITOR_TLS, 160 SLAPD_MONITOR_RWW, 161 162 SLAPD_MONITOR_LAST 163 }; 164 165 #define SLAPD_MONITOR_AT "cn" 166 167 #define SLAPD_MONITOR_BACKEND_NAME "Backends" 168 #define SLAPD_MONITOR_BACKEND_RDN \ 169 SLAPD_MONITOR_AT "=" SLAPD_MONITOR_BACKEND_NAME 170 #define SLAPD_MONITOR_BACKEND_DN \ 171 SLAPD_MONITOR_BACKEND_RDN "," SLAPD_MONITOR_DN 172 173 #define SLAPD_MONITOR_CONN_NAME "Connections" 174 #define SLAPD_MONITOR_CONN_RDN \ 175 SLAPD_MONITOR_AT "=" SLAPD_MONITOR_CONN_NAME 176 #define SLAPD_MONITOR_CONN_DN \ 177 SLAPD_MONITOR_CONN_RDN "," SLAPD_MONITOR_DN 178 179 #define SLAPD_MONITOR_DATABASE_NAME "Databases" 180 #define SLAPD_MONITOR_DATABASE_RDN \ 181 SLAPD_MONITOR_AT "=" SLAPD_MONITOR_DATABASE_NAME 182 #define SLAPD_MONITOR_DATABASE_DN \ 183 SLAPD_MONITOR_DATABASE_RDN "," SLAPD_MONITOR_DN 184 185 #define SLAPD_MONITOR_LISTENER_NAME "Listeners" 186 #define SLAPD_MONITOR_LISTENER_RDN \ 187 SLAPD_MONITOR_AT "=" SLAPD_MONITOR_LISTENER_NAME 188 #define SLAPD_MONITOR_LISTENER_DN \ 189 SLAPD_MONITOR_LISTENER_RDN "," SLAPD_MONITOR_DN 190 191 #define SLAPD_MONITOR_LOG_NAME "Log" 192 #define SLAPD_MONITOR_LOG_RDN \ 193 SLAPD_MONITOR_AT "=" SLAPD_MONITOR_LOG_NAME 194 #define SLAPD_MONITOR_LOG_DN \ 195 SLAPD_MONITOR_LOG_RDN "," SLAPD_MONITOR_DN 196 197 #define SLAPD_MONITOR_OPS_NAME "Operations" 198 #define SLAPD_MONITOR_OPS_RDN \ 199 SLAPD_MONITOR_AT "=" SLAPD_MONITOR_OPS_NAME 200 #define SLAPD_MONITOR_OPS_DN \ 201 SLAPD_MONITOR_OPS_RDN "," SLAPD_MONITOR_DN 202 203 #define SLAPD_MONITOR_OVERLAY_NAME "Overlays" 204 #define SLAPD_MONITOR_OVERLAY_RDN \ 205 SLAPD_MONITOR_AT "=" SLAPD_MONITOR_OVERLAY_NAME 206 #define SLAPD_MONITOR_OVERLAY_DN \ 207 SLAPD_MONITOR_OVERLAY_RDN "," SLAPD_MONITOR_DN 208 209 #define SLAPD_MONITOR_SASL_NAME "SASL" 210 #define SLAPD_MONITOR_SASL_RDN \ 211 SLAPD_MONITOR_AT "=" SLAPD_MONITOR_SASL_NAME 212 #define SLAPD_MONITOR_SASL_DN \ 213 SLAPD_MONITOR_SASL_RDN "," SLAPD_MONITOR_DN 214 215 #define SLAPD_MONITOR_SENT_NAME "Statistics" 216 #define SLAPD_MONITOR_SENT_RDN \ 217 SLAPD_MONITOR_AT "=" SLAPD_MONITOR_SENT_NAME 218 #define SLAPD_MONITOR_SENT_DN \ 219 SLAPD_MONITOR_SENT_RDN "," SLAPD_MONITOR_DN 220 221 #define SLAPD_MONITOR_THREAD_NAME "Threads" 222 #define SLAPD_MONITOR_THREAD_RDN \ 223 SLAPD_MONITOR_AT "=" SLAPD_MONITOR_THREAD_NAME 224 #define SLAPD_MONITOR_THREAD_DN \ 225 SLAPD_MONITOR_THREAD_RDN "," SLAPD_MONITOR_DN 226 227 #define SLAPD_MONITOR_TIME_NAME "Time" 228 #define SLAPD_MONITOR_TIME_RDN \ 229 SLAPD_MONITOR_AT "=" SLAPD_MONITOR_TIME_NAME 230 #define SLAPD_MONITOR_TIME_DN \ 231 SLAPD_MONITOR_TIME_RDN "," SLAPD_MONITOR_DN 232 233 #define SLAPD_MONITOR_TLS_NAME "TLS" 234 #define SLAPD_MONITOR_TLS_RDN \ 235 SLAPD_MONITOR_AT "=" SLAPD_MONITOR_TLS_NAME 236 #define SLAPD_MONITOR_TLS_DN \ 237 SLAPD_MONITOR_TLS_RDN "," SLAPD_MONITOR_DN 238 239 #define SLAPD_MONITOR_RWW_NAME "Waiters" 240 #define SLAPD_MONITOR_RWW_RDN \ 241 SLAPD_MONITOR_AT "=" SLAPD_MONITOR_RWW_NAME 242 #define SLAPD_MONITOR_RWW_DN \ 243 SLAPD_MONITOR_RWW_RDN "," SLAPD_MONITOR_DN 244 245 typedef struct monitor_subsys_t { 246 char *mss_name; 247 struct berval mss_rdn; 248 struct berval mss_dn; 249 struct berval mss_ndn; 250 struct berval mss_desc[ 3 ]; 251 int mss_flags; 252 #define MONITOR_F_OPENED 0x10000000U 253 254 #define MONITOR_HAS_VOLATILE_CH( mp ) \ 255 ( ( mp )->mp_flags & MONITOR_F_VOLATILE_CH ) 256 #define MONITOR_HAS_CHILDREN( mp ) \ 257 ( ( mp )->mp_children || MONITOR_HAS_VOLATILE_CH( mp ) ) 258 259 /* initialize entry and subentries */ 260 int ( *mss_open )( BackendDB *, struct monitor_subsys_t *ms ); 261 /* destroy structure */ 262 int ( *mss_destroy )( BackendDB *, struct monitor_subsys_t *ms ); 263 /* update existing dynamic entry and subentries */ 264 int ( *mss_update )( Operation *, SlapReply *, Entry * ); 265 /* create new dynamic subentries */ 266 int ( *mss_create )( Operation *, SlapReply *, 267 struct berval *ndn, Entry *, Entry ** ); 268 /* modify entry and subentries */ 269 int ( *mss_modify )( Operation *, SlapReply *, Entry * ); 270 } monitor_subsys_t; 271 272 extern BackendDB *be_monitor; 273 274 /* increase this bufsize if entries in string form get too big */ 275 #define BACKMONITOR_BUFSIZE 8192 276 277 typedef int (monitor_cbfunc)( struct berval *ndn, monitor_callback_t *cb, 278 struct berval *base, int scope, struct berval *filter ); 279 280 typedef int (monitor_cbafunc)( struct berval *ndn, Attribute *a, 281 monitor_callback_t *cb, 282 struct berval *base, int scope, struct berval *filter ); 283 284 typedef struct monitor_extra_t { 285 int (*is_configured)(void); 286 monitor_subsys_t * (*get_subsys)( const char *name ); 287 monitor_subsys_t * (*get_subsys_by_dn)( struct berval *ndn, int sub ); 288 289 int (*register_subsys)( monitor_subsys_t *ms ); 290 int (*register_backend)( BackendInfo *bi ); 291 int (*register_database)( BackendDB *be, struct berval *ndn ); 292 int (*register_overlay_info)( slap_overinst *on ); 293 int (*register_overlay)( BackendDB *be ); 294 int (*register_entry)( Entry *e, monitor_callback_t *cb, 295 monitor_subsys_t *ms, unsigned long flags ); 296 int (*register_entry_parent)( Entry *e, monitor_callback_t *cb, 297 monitor_subsys_t *ms, unsigned long flags, 298 struct berval *base, int scope, struct berval *filter ); 299 monitor_cbafunc *register_entry_attrs; 300 monitor_cbfunc *register_entry_callback; 301 302 int (*unregister_entry)( struct berval *ndn ); 303 monitor_cbfunc *unregister_entry_parent; 304 monitor_cbafunc *unregister_entry_attrs; 305 monitor_cbfunc *unregister_entry_callback; 306 } monitor_extra_t; 307 308 LDAP_END_DECL 309 310 #include "proto-back-monitor.h" 311 312 #endif /* _back_monitor_h_ */ 313 314