]> git.ipfire.org Git - thirdparty/squid.git/blob - src/snmp_agent.cc
cacheCurrentResFileDescrCnt was reporting "Number_FD" rather than
[thirdparty/squid.git] / src / snmp_agent.cc
1
2 /*
3 * $Id: snmp_agent.cc,v 1.79 2001/01/24 22:38:25 wessels Exp $
4 *
5 * DEBUG: section 49 SNMP Interface
6 * AUTHOR: Kostas Anagnostakis
7 *
8 * SQUID Web Proxy Cache http://www.squid-cache.org/
9 * ----------------------------------------------------------
10 *
11 * Squid is the result of efforts by numerous individuals from
12 * the Internet community; see the CONTRIBUTORS file for full
13 * details. Many organizations have provided support for Squid's
14 * development; see the SPONSORS file for full details. Squid is
15 * Copyrighted (C) 2001 by the Regents of the University of
16 * California; see the COPYRIGHT file for full details. Squid
17 * incorporates software developed and/or copyrighted by other
18 * sources; see the CREDITS file for full details.
19 *
20 * This program is free software; you can redistribute it and/or modify
21 * it under the terms of the GNU General Public License as published by
22 * the Free Software Foundation; either version 2 of the License, or
23 * (at your option) any later version.
24 *
25 * This program is distributed in the hope that it will be useful,
26 * but WITHOUT ANY WARRANTY; without even the implied warranty of
27 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
28 * GNU General Public License for more details.
29 *
30 * You should have received a copy of the GNU General Public License
31 * along with this program; if not, write to the Free Software
32 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
33 *
34 */
35
36
37 #include "squid.h"
38 #include "cache_snmp.h"
39
40 extern StatCounters *snmpStatGet(int);
41
42 /************************************************************************
43
44 SQUID MIB Implementation
45
46 ************************************************************************/
47
48 variable_list *
49 snmp_sysFn(variable_list * Var, snint * ErrP)
50 {
51 variable_list *Answer = NULL;
52 debug(49, 5) ("snmp_sysFn: Processing request:\n", Var->name[LEN_SQ_SYS]);
53 snmpDebugOid(5, Var->name, Var->name_length);
54 *ErrP = SNMP_ERR_NOERROR;
55 switch (Var->name[LEN_SQ_SYS]) {
56 case SYSVMSIZ:
57 Answer = snmp_var_new_integer(Var->name, Var->name_length,
58 store_mem_size >> 10,
59 ASN_INTEGER);
60 break;
61 case SYSSTOR:
62 Answer = snmp_var_new_integer(Var->name, Var->name_length,
63 store_swap_size,
64 ASN_INTEGER);
65 break;
66 case SYS_UPTIME:
67 Answer = snmp_var_new_integer(Var->name, Var->name_length,
68 tvSubDsec(squid_start, current_time) * 100,
69 SMI_TIMETICKS);
70 break;
71 default:
72 *ErrP = SNMP_ERR_NOSUCHNAME;
73 break;
74 }
75 return Answer;
76 }
77
78 variable_list *
79 snmp_confFn(variable_list * Var, snint * ErrP)
80 {
81 variable_list *Answer = NULL;
82 char *cp = NULL;
83 debug(49, 5) ("snmp_confFn: Processing request with magic %d!\n", Var->name[8]);
84 *ErrP = SNMP_ERR_NOERROR;
85 switch (Var->name[LEN_SQ_CONF]) {
86 case CONF_ADMIN:
87 Answer = snmp_var_new(Var->name, Var->name_length);
88 Answer->type = ASN_OCTET_STR;
89 Answer->val_len = strlen(Config.adminEmail);
90 Answer->val.string = (u_char *) xstrdup(Config.adminEmail);
91 break;
92 case CONF_VERSION:
93 Answer = snmp_var_new(Var->name, Var->name_length);
94 Answer->type = ASN_OCTET_STR;
95 Answer->val_len = strlen(appname);
96 Answer->val.string = (u_char *) xstrdup(appname);
97 break;
98 case CONF_VERSION_ID:
99 Answer = snmp_var_new(Var->name, Var->name_length);
100 Answer->type = ASN_OCTET_STR;
101 Answer->val_len = strlen(SQUID_VERSION);
102 Answer->val.string = (u_char *) xstrdup(SQUID_VERSION);
103 break;
104 case CONF_STORAGE:
105 switch (Var->name[LEN_SQ_CONF + 1]) {
106 case CONF_ST_MMAXSZ:
107 Answer = snmp_var_new_integer(Var->name, Var->name_length,
108 (snint) Config.memMaxSize >> 20,
109 ASN_INTEGER);
110 break;
111 case CONF_ST_SWMAXSZ:
112 Answer = snmp_var_new_integer(Var->name, Var->name_length,
113 (snint) Config.Swap.maxSize >> 10,
114 ASN_INTEGER);
115 break;
116 case CONF_ST_SWHIWM:
117 Answer = snmp_var_new_integer(Var->name, Var->name_length,
118 (snint) Config.Swap.highWaterMark,
119 ASN_INTEGER);
120 break;
121 case CONF_ST_SWLOWM:
122 Answer = snmp_var_new_integer(Var->name, Var->name_length,
123 (snint) Config.Swap.lowWaterMark,
124 ASN_INTEGER);
125 break;
126 default:
127 *ErrP = SNMP_ERR_NOSUCHNAME;
128 break;
129 }
130 break;
131 case CONF_LOG_FAC:
132 Answer = snmp_var_new(Var->name, Var->name_length);
133 if (!(cp = Config.debugOptions))
134 cp = "None";
135 Answer->type = ASN_OCTET_STR;
136 Answer->val_len = strlen(cp);
137 Answer->val.string = (u_char *) xstrdup(cp);
138 break;
139 default:
140 *ErrP = SNMP_ERR_NOSUCHNAME;
141 break;
142 }
143 return Answer;
144 }
145
146 variable_list *
147 snmp_meshPtblFn(variable_list * Var, snint * ErrP)
148 {
149 variable_list *Answer = NULL;
150 struct in_addr *laddr;
151 char *cp = NULL;
152 peer *p = NULL;
153 int cnt = 0;
154 debug(49, 5) ("snmp_meshPtblFn: peer %d requested!\n", Var->name[LEN_SQ_MESH + 3]);
155 *ErrP = SNMP_ERR_NOERROR;
156 laddr = oid2addr(&Var->name[LEN_SQ_MESH + 3]);
157 for (p = Config.peers; p != NULL; p = p->next, cnt++)
158 if (p->in_addr.sin_addr.s_addr == laddr->s_addr)
159 break;
160 if (p == NULL) {
161 *ErrP = SNMP_ERR_NOSUCHNAME;
162 return NULL;
163 }
164 switch (Var->name[LEN_SQ_MESH + 2]) {
165 case MESH_PTBL_NAME:
166 cp = p->host;
167 Answer = snmp_var_new(Var->name, Var->name_length);
168 Answer->type = ASN_OCTET_STR;
169 Answer->val_len = strlen(cp);
170 Answer->val.string = (u_char *) xstrdup(cp);
171 break;
172 case MESH_PTBL_IP:
173 Answer = snmp_var_new_integer(Var->name, Var->name_length,
174 (snint) p->in_addr.sin_addr.s_addr,
175 SMI_IPADDRESS);
176 break;
177 case MESH_PTBL_HTTP:
178 Answer = snmp_var_new_integer(Var->name, Var->name_length,
179 (snint) p->http_port,
180 ASN_INTEGER);
181 break;
182 case MESH_PTBL_ICP:
183 Answer = snmp_var_new_integer(Var->name, Var->name_length,
184 (snint) p->icp.port,
185 ASN_INTEGER);
186 break;
187 case MESH_PTBL_TYPE:
188 Answer = snmp_var_new_integer(Var->name, Var->name_length,
189 (snint) p->type,
190 ASN_INTEGER);
191 break;
192 case MESH_PTBL_STATE:
193 Answer = snmp_var_new_integer(Var->name, Var->name_length,
194 (snint) neighborUp(p),
195 ASN_INTEGER);
196 break;
197 case MESH_PTBL_SENT:
198 Answer = snmp_var_new_integer(Var->name, Var->name_length,
199 p->stats.pings_sent,
200 ASN_INTEGER);
201 break;
202 case MESH_PTBL_PACKED:
203 Answer = snmp_var_new_integer(Var->name, Var->name_length,
204 p->stats.pings_acked,
205 ASN_INTEGER);
206 break;
207 case MESH_PTBL_FETCHES:
208 Answer = snmp_var_new_integer(Var->name, Var->name_length,
209 p->stats.fetches,
210 SMI_COUNTER32);
211 break;
212 case MESH_PTBL_RTT:
213 Answer = snmp_var_new_integer(Var->name, Var->name_length,
214 p->stats.rtt,
215 ASN_INTEGER);
216 break;
217 case MESH_PTBL_IGN:
218 Answer = snmp_var_new_integer(Var->name, Var->name_length,
219 p->stats.ignored_replies,
220 SMI_COUNTER32);
221 break;
222 case MESH_PTBL_KEEPAL_S:
223 Answer = snmp_var_new_integer(Var->name, Var->name_length,
224 p->stats.n_keepalives_sent,
225 SMI_COUNTER32);
226 break;
227 case MESH_PTBL_KEEPAL_R:
228 Answer = snmp_var_new_integer(Var->name, Var->name_length,
229 p->stats.n_keepalives_recv,
230 SMI_COUNTER32);
231 break;
232 default:
233 *ErrP = SNMP_ERR_NOSUCHNAME;
234 break;
235 }
236 return Answer;
237 }
238
239 variable_list *
240 snmp_prfSysFn(variable_list * Var, snint * ErrP)
241 {
242 variable_list *Answer = NULL;
243 static struct rusage rusage;
244 debug(49, 5) ("snmp_prfSysFn: Processing request with magic %d!\n", Var->name[LEN_SQ_PRF + 1]);
245 *ErrP = SNMP_ERR_NOERROR;
246 switch (Var->name[LEN_SQ_PRF + 1]) {
247 case PERF_SYS_PF:
248 squid_getrusage(&rusage);
249 Answer = snmp_var_new_integer(Var->name, Var->name_length,
250 rusage_pagefaults(&rusage),
251 SMI_COUNTER32);
252 break;
253 case PERF_SYS_NUMR:
254 Answer = snmp_var_new_integer(Var->name, Var->name_length,
255 IOStats.Http.reads,
256 SMI_COUNTER32);
257 break;
258 case PERF_SYS_MEMUSAGE:
259 Answer = snmp_var_new_integer(Var->name, Var->name_length,
260 (snint) memTotalAllocated() >> 10,
261 ASN_INTEGER);
262 break;
263 case PERF_SYS_CPUTIME:
264 squid_getrusage(&rusage);
265 Answer = snmp_var_new_integer(Var->name, Var->name_length,
266 (snint) rusage_cputime(&rusage),
267 ASN_INTEGER);
268 break;
269 case PERF_SYS_CPUUSAGE:
270 squid_getrusage(&rusage);
271 Answer = snmp_var_new_integer(Var->name, Var->name_length,
272 (snint) dpercent(rusage_cputime(&rusage), tvSubDsec(squid_start, current_time)),
273 ASN_INTEGER);
274 break;
275 case PERF_SYS_MAXRESSZ:
276 squid_getrusage(&rusage);
277 Answer = snmp_var_new_integer(Var->name, Var->name_length,
278 (snint) rusage_maxrss(&rusage),
279 ASN_INTEGER);
280 break;
281 case PERF_SYS_CURLRUEXP:
282 /* No global LRU info anymore */
283 Answer = snmp_var_new_integer(Var->name, Var->name_length,
284 0,
285 SMI_TIMETICKS);
286 break;
287 case PERF_SYS_CURUNLREQ:
288 Answer = snmp_var_new_integer(Var->name, Var->name_length,
289 (snint) statCounter.unlink.requests,
290 SMI_COUNTER32);
291 break;
292 case PERF_SYS_CURUNUSED_FD:
293 Answer = snmp_var_new_integer(Var->name, Var->name_length,
294 (snint) Squid_MaxFD - Number_FD,
295 SMI_GAUGE32);
296 break;
297 case PERF_SYS_CURRESERVED_FD:
298 Answer = snmp_var_new_integer(Var->name, Var->name_length,
299 (snint) RESERVED_FD,
300 SMI_GAUGE32);
301 break;
302 case PERF_SYS_NUMOBJCNT:
303 Answer = snmp_var_new_integer(Var->name, Var->name_length,
304 (snint) memInUse(MEM_STOREENTRY),
305 SMI_COUNTER32);
306 break;
307 default:
308 *ErrP = SNMP_ERR_NOSUCHNAME;
309 break;
310 }
311 return Answer;
312 }
313
314 variable_list *
315 snmp_prfProtoFn(variable_list * Var, snint * ErrP)
316 {
317 variable_list *Answer = NULL;
318 static StatCounters *f = NULL;
319 static StatCounters *l = NULL;
320 double x;
321 int minutes;
322 debug(49, 5) ("snmp_prfProtoFn: Processing request with magic %d!\n", Var->name[LEN_SQ_PRF]);
323 *ErrP = SNMP_ERR_NOERROR;
324 switch (Var->name[LEN_SQ_PRF + 1]) {
325 case PERF_PROTOSTAT_AGGR: /* cacheProtoAggregateStats */
326 switch (Var->name[LEN_SQ_PRF + 2]) {
327 case PERF_PROTOSTAT_AGGR_HTTP_REQ:
328 Answer = snmp_var_new_integer(Var->name, Var->name_length,
329 (snint) statCounter.client_http.requests,
330 SMI_COUNTER32);
331 break;
332 case PERF_PROTOSTAT_AGGR_HTTP_HITS:
333 Answer = snmp_var_new_integer(Var->name, Var->name_length,
334 (snint) statCounter.client_http.hits,
335 SMI_COUNTER32);
336 break;
337 case PERF_PROTOSTAT_AGGR_HTTP_ERRORS:
338 Answer = snmp_var_new_integer(Var->name, Var->name_length,
339 (snint) statCounter.client_http.errors,
340 SMI_COUNTER32);
341 break;
342 case PERF_PROTOSTAT_AGGR_HTTP_KBYTES_IN:
343 Answer = snmp_var_new_integer(Var->name, Var->name_length,
344 (snint) statCounter.client_http.kbytes_in.kb,
345 SMI_COUNTER32);
346 break;
347 case PERF_PROTOSTAT_AGGR_HTTP_KBYTES_OUT:
348 Answer = snmp_var_new_integer(Var->name, Var->name_length,
349 (snint) statCounter.client_http.kbytes_out.kb,
350 SMI_COUNTER32);
351 break;
352 case PERF_PROTOSTAT_AGGR_ICP_S:
353 Answer = snmp_var_new_integer(Var->name, Var->name_length,
354 (snint) statCounter.icp.pkts_sent,
355 SMI_COUNTER32);
356 break;
357 case PERF_PROTOSTAT_AGGR_ICP_R:
358 Answer = snmp_var_new_integer(Var->name, Var->name_length,
359 (snint) statCounter.icp.pkts_recv,
360 SMI_COUNTER32);
361 break;
362 case PERF_PROTOSTAT_AGGR_ICP_SKB:
363 Answer = snmp_var_new_integer(Var->name, Var->name_length,
364 (snint) statCounter.icp.kbytes_sent.kb,
365 SMI_COUNTER32);
366 break;
367 case PERF_PROTOSTAT_AGGR_ICP_RKB:
368 Answer = snmp_var_new_integer(Var->name, Var->name_length,
369 (snint) statCounter.icp.kbytes_recv.kb,
370 SMI_COUNTER32);
371 break;
372 case PERF_PROTOSTAT_AGGR_REQ:
373 Answer = snmp_var_new_integer(Var->name, Var->name_length,
374 (snint) statCounter.server.all.requests,
375 SMI_INTEGER);
376 break;
377 case PERF_PROTOSTAT_AGGR_ERRORS:
378 Answer = snmp_var_new_integer(Var->name, Var->name_length,
379 (snint) statCounter.server.all.errors,
380 SMI_INTEGER);
381 break;
382 case PERF_PROTOSTAT_AGGR_KBYTES_IN:
383 Answer = snmp_var_new_integer(Var->name, Var->name_length,
384 (snint) statCounter.server.all.kbytes_in.kb,
385 SMI_COUNTER32);
386 break;
387 case PERF_PROTOSTAT_AGGR_KBYTES_OUT:
388 Answer = snmp_var_new_integer(Var->name, Var->name_length,
389 (snint) statCounter.server.all.kbytes_out.kb,
390 SMI_COUNTER32);
391 break;
392 case PERF_PROTOSTAT_AGGR_CURSWAP:
393 Answer = snmp_var_new_integer(Var->name, Var->name_length,
394 (snint) store_swap_size,
395 SMI_COUNTER32);
396 break;
397 case PERF_PROTOSTAT_AGGR_CLIENTS:
398 Answer = snmp_var_new_integer(Var->name, Var->name_length,
399 (snint) statCounter.client_http.clients,
400 SMI_COUNTER32);
401 break;
402 default:
403 *ErrP = SNMP_ERR_NOSUCHNAME;
404 break;
405 }
406 return Answer;
407 case PERF_PROTOSTAT_MEDIAN:
408 if (Var->name_length == LEN_SQ_PRF + 5)
409 minutes = Var->name[LEN_SQ_PRF + 4];
410 else
411 break;
412 if ((minutes < 1) || (minutes > 60))
413 break;
414 f = snmpStatGet(0);
415 l = snmpStatGet(minutes);
416 debug(49, 8) ("median: min= %d, %d l= %x , f = %x\n", minutes,
417 Var->name[LEN_SQ_PRF + 3], l, f);
418 debug(49, 8) ("median: l= %x , f = %x\n", l, f);
419 switch (Var->name[LEN_SQ_PRF + 3]) {
420 case PERF_MEDIAN_TIME:
421 x = minutes;
422 break;
423 case PERF_MEDIAN_HTTP_ALL:
424 x = statHistDeltaMedian(&l->client_http.all_svc_time,
425 &f->client_http.all_svc_time);
426 break;
427 case PERF_MEDIAN_HTTP_MISS:
428 x = statHistDeltaMedian(&l->client_http.miss_svc_time,
429 &f->client_http.miss_svc_time);
430 break;
431 case PERF_MEDIAN_HTTP_NM:
432 x = statHistDeltaMedian(&l->client_http.nm_svc_time,
433 &f->client_http.nm_svc_time);
434 break;
435 case PERF_MEDIAN_HTTP_HIT:
436 x = statHistDeltaMedian(&l->client_http.hit_svc_time,
437 &f->client_http.hit_svc_time);
438 break;
439 case PERF_MEDIAN_ICP_QUERY:
440 x = statHistDeltaMedian(&l->icp.query_svc_time, &f->icp.query_svc_time);
441 break;
442 case PERF_MEDIAN_ICP_REPLY:
443 x = statHistDeltaMedian(&l->icp.reply_svc_time, &f->icp.reply_svc_time);
444 break;
445 case PERF_MEDIAN_DNS:
446 x = statHistDeltaMedian(&l->dns.svc_time, &f->dns.svc_time);
447 break;
448 case PERF_MEDIAN_RHR:
449 x = statRequestHitRatio(minutes);
450 break;
451 case PERF_MEDIAN_BHR:
452 x = statByteHitRatio(minutes);
453 break;
454 default:
455 *ErrP = SNMP_ERR_NOSUCHNAME;
456 return NULL;
457 }
458 return snmp_var_new_integer(Var->name, Var->name_length,
459 (snint) x,
460 SMI_INTEGER);
461 }
462 *ErrP = SNMP_ERR_NOSUCHNAME;
463 return NULL;
464 }