]> git.sur5r.net Git - openldap/blob - servers/slapd/back-monitor/back-monitor.h
refactor ABI for arbitrary attribute/entry/callback registration; propagate pointers...
[openldap] / servers / slapd / back-monitor / back-monitor.h
1 /* back-monitor.h - ldap monitor back-end header file */
2 /* $OpenLDAP$ */
3 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
4  *
5  * Copyright 2001-2005 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                                                 /* update callback
44                                                    for user-defined entries */
45         void                            *mc_private;    /* opaque pointer to
46                                                    private data */
47         struct monitor_callback_t       *mc_next;
48 } monitor_callback_t;
49
50
51 typedef struct monitor_entry_t {
52         ldap_pvt_thread_mutex_t mp_mutex;       /* entry mutex */
53         Entry                   *mp_next;       /* pointer to next sibling */
54         Entry                   *mp_children;   /* pointer to first child */
55         struct monitor_subsys_t *mp_info;       /* subsystem info */
56 #define mp_type         mp_info->mss_type
57         unsigned long           mp_flags;       /* flags */
58
59 #define MONITOR_F_NONE          0x0000U
60 #define MONITOR_F_SUB           0x0001U         /* subentry of subsystem */
61 #define MONITOR_F_PERSISTENT    0x0010U         /* persistent entry */
62 #define MONITOR_F_PERSISTENT_CH 0x0020U         /* subsystem generates 
63                                                    persistent entries */
64 #define MONITOR_F_VOLATILE      0x0040U         /* volatile entry */
65 #define MONITOR_F_VOLATILE_CH   0x0080U         /* subsystem generates 
66                                                    volatile entries */
67 #define MONITOR_F_EXTERNAL      0x0100U         /* externally added - don't free */
68 /* NOTE: flags with 0xF0000000U mask are reserved for subsystem internals */
69
70         struct monitor_callback_t       *mp_cb;         /* callback sequence */
71 } monitor_entry_t;
72
73 typedef struct monitor_info_t {
74
75         /*
76          * Internal data
77          */
78         Avlnode                 *mi_cache;
79         ldap_pvt_thread_mutex_t mi_cache_mutex;
80
81         /*
82          * Config parameters
83          */
84         struct berval           mi_l;
85         struct berval           mi_startTime;           /* don't free it! */
86         struct berval           mi_creatorsName;        /* don't free it! */
87
88         /*
89          * Specific schema entities
90          */
91         ObjectClass             *mi_oc_monitor;
92         ObjectClass             *mi_oc_monitorServer;
93         ObjectClass             *mi_oc_monitorContainer;
94         ObjectClass             *mi_oc_monitorCounterObject;
95         ObjectClass             *mi_oc_monitorOperation;
96         ObjectClass             *mi_oc_monitorConnection;
97         ObjectClass             *mi_oc_managedObject;
98         ObjectClass             *mi_oc_monitoredObject;
99
100         AttributeDescription    *mi_ad_monitoredInfo;
101         AttributeDescription    *mi_ad_managedInfo;
102         AttributeDescription    *mi_ad_monitorCounter;
103         AttributeDescription    *mi_ad_monitorOpCompleted;
104         AttributeDescription    *mi_ad_monitorOpInitiated;
105         AttributeDescription    *mi_ad_monitorConnectionNumber;
106         AttributeDescription    *mi_ad_monitorConnectionAuthzDN;
107         AttributeDescription    *mi_ad_monitorConnectionLocalAddress;
108         AttributeDescription    *mi_ad_monitorConnectionPeerAddress;
109         AttributeDescription    *mi_ad_monitorTimestamp;
110         AttributeDescription    *mi_ad_monitorOverlay;
111         AttributeDescription    *mi_ad_monitorConnectionProtocol;
112         AttributeDescription    *mi_ad_monitorConnectionOpsReceived;
113         AttributeDescription    *mi_ad_monitorConnectionOpsExecuting;
114         AttributeDescription    *mi_ad_monitorConnectionOpsPending;
115         AttributeDescription    *mi_ad_monitorConnectionOpsCompleted;
116         AttributeDescription    *mi_ad_monitorConnectionGet;
117         AttributeDescription    *mi_ad_monitorConnectionRead;
118         AttributeDescription    *mi_ad_monitorConnectionWrite;
119         AttributeDescription    *mi_ad_monitorConnectionMask;
120         AttributeDescription    *mi_ad_monitorConnectionListener;
121         AttributeDescription    *mi_ad_monitorConnectionPeerDomain;
122         AttributeDescription    *mi_ad_monitorConnectionStartTime;
123         AttributeDescription    *mi_ad_monitorConnectionActivityTime;
124
125         /*
126          * Generic description attribute
127          */
128         AttributeDescription    *mi_ad_description;
129         AttributeDescription    *mi_ad_seeAlso;
130         AttributeDescription    *mi_ad_l;
131 #ifdef MONITOR_DEFINE_LABELEDURI
132         /* enable if si_ad_labeledURI is removed from slap_schema */
133         AttributeDescription    *mi_ad_labeledURI;
134 #endif /* MONITOR_DEFINE_LABELEDURI */
135         AttributeDescription    *mi_ad_readOnly;
136         AttributeDescription    *mi_ad_restrictedOperation;
137
138         void                    *mi_entry_limbo;
139 } monitor_info_t;
140
141 /*
142  * DNs
143  */
144
145 enum {
146         SLAPD_MONITOR_BACKEND = 0,
147         SLAPD_MONITOR_CONN,
148         SLAPD_MONITOR_DATABASE,
149         SLAPD_MONITOR_LISTENER,
150         SLAPD_MONITOR_LOG,
151         SLAPD_MONITOR_OPS,
152         SLAPD_MONITOR_OVERLAY,
153         SLAPD_MONITOR_SASL,
154         SLAPD_MONITOR_SENT,
155         SLAPD_MONITOR_THREAD,
156         SLAPD_MONITOR_TIME,
157         SLAPD_MONITOR_TLS,
158         SLAPD_MONITOR_RWW,
159
160         SLAPD_MONITOR_LAST
161 };
162
163 #define SLAPD_MONITOR_AT                "cn"
164
165 #define SLAPD_MONITOR_BACKEND_NAME      "Backends"
166 #define SLAPD_MONITOR_BACKEND_RDN       \
167         SLAPD_MONITOR_AT "=" SLAPD_MONITOR_BACKEND_NAME
168 #define SLAPD_MONITOR_BACKEND_DN        \
169         SLAPD_MONITOR_BACKEND_RDN "," SLAPD_MONITOR_DN
170
171 #define SLAPD_MONITOR_CONN_NAME         "Connections"
172 #define SLAPD_MONITOR_CONN_RDN  \
173         SLAPD_MONITOR_AT "=" SLAPD_MONITOR_CONN_NAME
174 #define SLAPD_MONITOR_CONN_DN   \
175         SLAPD_MONITOR_CONN_RDN "," SLAPD_MONITOR_DN
176
177 #define SLAPD_MONITOR_DATABASE_NAME     "Databases"
178 #define SLAPD_MONITOR_DATABASE_RDN      \
179         SLAPD_MONITOR_AT "=" SLAPD_MONITOR_DATABASE_NAME
180 #define SLAPD_MONITOR_DATABASE_DN       \
181         SLAPD_MONITOR_DATABASE_RDN "," SLAPD_MONITOR_DN
182
183 #define SLAPD_MONITOR_LISTENER_NAME     "Listeners"
184 #define SLAPD_MONITOR_LISTENER_RDN      \
185         SLAPD_MONITOR_AT "=" SLAPD_MONITOR_LISTENER_NAME
186 #define SLAPD_MONITOR_LISTENER_DN       \
187         SLAPD_MONITOR_LISTENER_RDN "," SLAPD_MONITOR_DN
188
189 #define SLAPD_MONITOR_LOG_NAME          "Log"
190 #define SLAPD_MONITOR_LOG_RDN   \
191         SLAPD_MONITOR_AT "=" SLAPD_MONITOR_LOG_NAME
192 #define SLAPD_MONITOR_LOG_DN    \
193         SLAPD_MONITOR_LOG_RDN "," SLAPD_MONITOR_DN
194
195 #define SLAPD_MONITOR_OPS_NAME          "Operations"
196 #define SLAPD_MONITOR_OPS_RDN   \
197         SLAPD_MONITOR_AT "=" SLAPD_MONITOR_OPS_NAME
198 #define SLAPD_MONITOR_OPS_DN    \
199         SLAPD_MONITOR_OPS_RDN "," SLAPD_MONITOR_DN
200
201 #define SLAPD_MONITOR_OVERLAY_NAME      "Overlay"
202 #define SLAPD_MONITOR_OVERLAY_RDN  \
203         SLAPD_MONITOR_AT "=" SLAPD_MONITOR_OVERLAY_NAME
204 #define SLAPD_MONITOR_OVERLAY_DN   \
205         SLAPD_MONITOR_OVERLAY_RDN "," SLAPD_MONITOR_DN
206
207 #define SLAPD_MONITOR_SASL_NAME         "SASL"
208 #define SLAPD_MONITOR_SASL_RDN  \
209         SLAPD_MONITOR_AT "=" SLAPD_MONITOR_SASL_NAME
210 #define SLAPD_MONITOR_SASL_DN   \
211         SLAPD_MONITOR_SASL_RDN "," SLAPD_MONITOR_DN
212
213 #define SLAPD_MONITOR_SENT_NAME         "Statistics"
214 #define SLAPD_MONITOR_SENT_RDN  \
215         SLAPD_MONITOR_AT "=" SLAPD_MONITOR_SENT_NAME
216 #define SLAPD_MONITOR_SENT_DN   \
217         SLAPD_MONITOR_SENT_RDN "," SLAPD_MONITOR_DN
218
219 #define SLAPD_MONITOR_THREAD_NAME       "Threads"
220 #define SLAPD_MONITOR_THREAD_RDN        \
221         SLAPD_MONITOR_AT "=" SLAPD_MONITOR_THREAD_NAME
222 #define SLAPD_MONITOR_THREAD_DN \
223         SLAPD_MONITOR_THREAD_RDN "," SLAPD_MONITOR_DN
224
225 #define SLAPD_MONITOR_TIME_NAME         "Time"
226 #define SLAPD_MONITOR_TIME_RDN  \
227         SLAPD_MONITOR_AT "=" SLAPD_MONITOR_TIME_NAME
228 #define SLAPD_MONITOR_TIME_DN   \
229         SLAPD_MONITOR_TIME_RDN "," SLAPD_MONITOR_DN
230
231 #define SLAPD_MONITOR_TLS_NAME          "TLS"
232 #define SLAPD_MONITOR_TLS_RDN   \
233         SLAPD_MONITOR_AT "=" SLAPD_MONITOR_TLS_NAME
234 #define SLAPD_MONITOR_TLS_DN    \
235         SLAPD_MONITOR_TLS_RDN "," SLAPD_MONITOR_DN
236
237 #define SLAPD_MONITOR_RWW_NAME          "Waiters"
238 #define SLAPD_MONITOR_RWW_RDN   \
239         SLAPD_MONITOR_AT "=" SLAPD_MONITOR_RWW_NAME
240 #define SLAPD_MONITOR_RWW_DN    \
241         SLAPD_MONITOR_RWW_RDN "," SLAPD_MONITOR_DN
242
243 typedef struct monitor_subsys_t {
244         char            *mss_name;
245         struct berval   mss_rdn;
246         struct berval   mss_dn;
247         struct berval   mss_ndn;
248         int             mss_flags;
249 #define MONITOR_F_OPENED        0x10000000U
250
251 #define MONITOR_HAS_VOLATILE_CH( mp ) \
252         ( ( mp )->mp_flags & MONITOR_F_VOLATILE_CH )
253 #define MONITOR_HAS_CHILDREN( mp ) \
254         ( ( mp )->mp_children || MONITOR_HAS_VOLATILE_CH( mp ) )
255
256         /* initialize entry and subentries */
257         int             ( *mss_open )( BackendDB *, struct monitor_subsys_t *ms );
258         /* update existing dynamic entry and subentries */
259         int             ( *mss_update )( Operation *, SlapReply *, Entry * );
260         /* create new dynamic subentries */
261         int             ( *mss_create )( Operation *, SlapReply *,
262                                 struct berval *ndn, Entry *, Entry ** );
263         /* modify entry and subentries */
264         int             ( *mss_modify )( Operation *, SlapReply *, Entry * );
265 } monitor_subsys_t;
266
267 extern BackendDB *be_monitor;
268
269 /* increase this bufsize if entries in string form get too big */
270 #define BACKMONITOR_BUFSIZE     8192
271
272 LDAP_END_DECL
273
274 #include "proto-back-monitor.h"
275
276 #endif /* _back_monitor_h_ */
277