]> git.sur5r.net Git - openldap/blob - servers/slapd/monitor.c
Further trim_refs_url fixes from Hallvard. Need additional testing.
[openldap] / servers / slapd / monitor.c
1 /*
2  * Copyright 1998-1999 The OpenLDAP Foundation, All Rights Reserved.
3  * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
4  */
5 /*
6  * Copyright (c) 1995 Regents of the University of Michigan.
7  * All rights reserved.
8  *
9  * Redistribution and use in source and binary forms are permitted
10  * provided that this notice is preserved and that due credit is given
11  * to the University of Michigan at Ann Arbor. The name of the University
12  * may not be used to endorse or promote products derived from this
13  * software without specific prior written permission. This software
14  * is provided ``as is'' without express or implied warranty.
15  */
16
17 #include "portable.h"
18
19 #include <stdio.h>
20
21 #include <ac/socket.h>
22 #include <ac/string.h>
23 #include <ac/time.h>
24
25 #include "slap.h"
26
27 #if defined( SLAPD_MONITOR_DN )
28
29 void
30 monitor_info(
31         Connection *conn,
32         Operation *op,
33         char ** attrs,
34         int attrsonly )
35 {
36         Entry           *e;
37         char            buf[BUFSIZ];
38         struct berval   val;
39         struct berval   *vals[2];
40         int    nconns, nwritewaiters, nreadwaiters;
41         struct tm       *ltm;
42         char            *p;
43     char       buf2[22];
44     char       buf3[22];
45         Connection *c;
46         int                     connindex;
47     time_t              currenttime;
48
49         vals[0] = &val;
50         vals[1] = NULL;
51
52         e = (Entry *) ch_calloc( 1, sizeof(Entry) );
53         /* initialize reader/writer lock */
54         e->e_attrs = NULL;
55         e->e_dn = ch_strdup( SLAPD_MONITOR_DN );
56         e->e_ndn = ch_strdup(SLAPD_MONITOR_DN);
57         (void) dn_normalize_case( e->e_ndn );
58         e->e_private = NULL;
59
60         {
61                 char *rdn = ch_strdup( SLAPD_MONITOR_DN );
62                 val.bv_val = strchr( rdn, '=' );
63
64                 if( val.bv_val != NULL ) {
65                         *val.bv_val = '\0';
66                         val.bv_len = strlen( ++val.bv_val );
67
68                         attr_merge( e, rdn, vals );
69                 }
70
71                 free( rdn );
72         }
73
74         val.bv_val = (char *) Versionstr;
75         if (( p = strchr( Versionstr, '\n' )) == NULL ) {
76                 val.bv_len = strlen( Versionstr );
77         } else {
78                 val.bv_len = p - Versionstr;
79         }
80         attr_merge( e, "version", vals );
81
82         ldap_pvt_thread_mutex_lock( &active_threads_mutex );
83         sprintf( buf, "%d", active_threads );
84         ldap_pvt_thread_mutex_unlock( &active_threads_mutex );
85         val.bv_val = buf;
86         val.bv_len = strlen( buf );
87         attr_merge( e, "threads", vals );
88
89         nconns = 0;
90         nwritewaiters = 0;
91         nreadwaiters = 0;
92
93         /* loop through the connections */
94         for ( c = connection_first( &connindex );
95                 c != NULL;
96                 c = connection_next( c, &connindex ))
97         {
98                 nconns++;
99                 if ( c->c_writewaiter ) {
100                         nwritewaiters++;
101                 }
102                 if ( c->c_currentber != NULL ) {
103                         nreadwaiters++;
104                 }
105
106                 ldap_pvt_thread_mutex_lock( &gmtime_mutex );
107 #ifndef LDAP_LOCALTIME
108                 ltm = gmtime( &c->c_starttime );
109                 strftime( buf2, sizeof(buf2), "%Y%m%d%H%M%SZ", ltm );
110
111                 ltm = gmtime( &c->c_activitytime );
112                 strftime( buf3, sizeof(buf2), "%Y%m%d%H%M%SZ", ltm );
113 #else
114                 ltm = localtime( &c->.c_starttime );
115                 strftime( buf2, sizeof(buf2), "%y%m%d%H%M%SZ", ltm );
116
117                 ltm = localtime( &c->c_activitytime );
118                 strftime( buf3, sizeof(buf2), "%y%m%d%H%M%SZ", ltm );
119 #endif
120
121                 ldap_pvt_thread_mutex_unlock( &gmtime_mutex );
122
123                 sprintf( buf,
124                         "%ld : %ld "
125                         ": %ld/%ld/%ld/%ld "
126                         ": %ld/%ld/%ld "
127                         ": %s%s%s%s%s%s "
128                         ": %s : %s : %s "
129                         ": %s : %s : %s : %s ",
130
131                         c->c_connid,
132                         (long) c->c_protocol,
133
134                         c->c_n_ops_received, c->c_n_ops_executing,
135                         c->c_n_ops_pending, c->c_n_ops_completed,
136
137                         /* add low-level counters here */
138                         c->c_n_get, c->c_n_read, c->c_n_write,
139
140                     c->c_currentber ? "r" : "",
141                     c->c_writewaiter ? "w" : "",
142                     c->c_ops != NULL ? "x" : "",
143                     c->c_pending_ops != NULL ? "p" : "",
144                         connection_state2str( c->c_conn_state ),
145                         c->c_bind_in_progress ? "S" : "",
146
147                     c->c_cdn ? c->c_cdn : "<anonymous>",
148
149                         c->c_listener_url,
150                     c->c_peer_domain,
151                     c->c_peer_name,
152                     c->c_sock_name,
153
154                     buf2,
155                         buf3
156                 );
157
158                 val.bv_val = buf;
159                 val.bv_len = strlen( buf );
160                 attr_merge( e, "connection", vals );
161         }
162         connection_done(c);
163
164         sprintf( buf, "%d", nconns );
165         val.bv_val = buf;
166         val.bv_len = strlen( buf );
167         attr_merge( e, "currentConnections", vals );
168
169         sprintf( buf, "%ld", connections_nextid() );
170         val.bv_val = buf;
171         val.bv_len = strlen( buf );
172         attr_merge( e, "totalConnections", vals );
173
174         sprintf( buf, "%ld", (long) dtblsize );
175         val.bv_val = buf;
176         val.bv_len = strlen( buf );
177         attr_merge( e, "dTableSize", vals );
178
179         sprintf( buf, "%d", nwritewaiters );
180         val.bv_val = buf;
181         val.bv_len = strlen( buf );
182         attr_merge( e, "writeWaiters", vals );
183
184         sprintf( buf, "%d", nreadwaiters );
185         val.bv_val = buf;
186         val.bv_len = strlen( buf );
187         attr_merge( e, "readWaiters", vals );
188
189         ldap_pvt_thread_mutex_lock(&num_ops_mutex);
190         sprintf( buf, "%ld", num_ops_initiated );
191         ldap_pvt_thread_mutex_unlock(&num_ops_mutex);
192         val.bv_val = buf;
193         val.bv_len = strlen( buf );
194         attr_merge( e, "opsInitiated", vals );
195
196         ldap_pvt_thread_mutex_lock(&num_ops_mutex);
197         sprintf( buf, "%ld", num_ops_completed );
198         ldap_pvt_thread_mutex_unlock(&num_ops_mutex);
199         val.bv_val = buf;
200         val.bv_len = strlen( buf );
201         attr_merge( e, "opsCompleted", vals );
202
203         ldap_pvt_thread_mutex_lock(&num_sent_mutex);
204         sprintf( buf, "%ld", num_entries_sent );
205         ldap_pvt_thread_mutex_unlock(&num_sent_mutex);
206         val.bv_val = buf;
207         val.bv_len = strlen( buf );
208         attr_merge( e, "entriesSent", vals );
209
210         ldap_pvt_thread_mutex_lock(&num_sent_mutex);
211         sprintf( buf, "%ld", num_refs_sent );
212         ldap_pvt_thread_mutex_unlock(&num_sent_mutex);
213         val.bv_val = buf;
214         val.bv_len = strlen( buf );
215         attr_merge( e, "referencesSent", vals );
216
217         ldap_pvt_thread_mutex_lock(&num_sent_mutex);
218         sprintf( buf, "%ld", num_pdu_sent );
219         ldap_pvt_thread_mutex_unlock(&num_sent_mutex);
220         val.bv_val = buf;
221         val.bv_len = strlen( buf );
222         attr_merge( e, "pduSent", vals );
223
224         ldap_pvt_thread_mutex_lock(&num_sent_mutex);
225         sprintf( buf, "%ld", num_bytes_sent );
226         ldap_pvt_thread_mutex_unlock(&num_sent_mutex);
227         val.bv_val = buf;
228         val.bv_len = strlen( buf );
229         attr_merge( e, "bytesSent", vals );
230
231         currenttime = slap_get_time();
232
233         ldap_pvt_thread_mutex_lock( &gmtime_mutex );
234 #ifndef LDAP_LOCALTIME
235         ltm = gmtime( &currenttime );
236         strftime( buf, sizeof(buf), "%Y%m%d%H%M%SZ", ltm );
237 #else
238         ltm = localtime( &currenttime );
239         strftime( buf, sizeof(buf), "%y%m%d%H%M%SZ", ltm );
240 #endif
241         val.bv_val = buf;
242         val.bv_len = strlen( buf );
243         attr_merge( e, "currenttime", vals );
244
245 #ifndef LDAP_LOCALTIME
246         ltm = gmtime( &starttime );
247         strftime( buf, sizeof(buf), "%Y%m%d%H%M%SZ", ltm );
248 #else
249         ltm = localtime( &starttime );
250         strftime( buf, sizeof(buf), "%y%m%d%H%M%SZ", ltm );
251 #endif
252         ldap_pvt_thread_mutex_unlock( &gmtime_mutex );
253
254         val.bv_val = buf;
255         val.bv_len = strlen( buf );
256         attr_merge( e, "starttime", vals );
257
258         sprintf( buf, "%d", nbackends );
259         val.bv_val = buf;
260         val.bv_len = strlen( buf );
261         attr_merge( e, "nbackends", vals );
262
263 #ifdef HAVE_THREAD_CONCURRENCY
264         sprintf( buf, "%d", ldap_pvt_thread_get_concurrency() );
265         val.bv_val = buf;
266         val.bv_len = strlen( buf );
267         attr_merge( e, "concurrency", vals );
268 #endif
269
270         val.bv_val = "top";
271         val.bv_len = sizeof("top")-1;
272         attr_merge( e, "objectClass", vals );
273
274         val.bv_val = "LDAPsubentry";
275         val.bv_len = sizeof("LDAPsubentry")-1;
276         attr_merge( e, "objectClass", vals );
277
278         val.bv_val = "extensibleObject";
279         val.bv_len = sizeof("extensibleObject")-1;
280         attr_merge( e, "objectClass", vals );
281
282         send_search_entry( &backends[0], conn, op, e,
283                 attrs, attrsonly, NULL );
284         send_search_result( conn, op, LDAP_SUCCESS,
285                 NULL, NULL, NULL, NULL, 1 );
286
287         entry_free( e );
288 }
289
290 #endif /* slapd_monitor_dn */