3
* $Id: snmp_agent.cc,v 1.93 2006/09/22 02:48:51 hno Exp $
5
* DEBUG: section 49 SNMP Interface
6
* AUTHOR: Kostas Anagnostakis
8
* SQUID Web Proxy Cache http://www.squid-cache.org/
9
* ----------------------------------------------------------
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.
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.
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.
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.
38
#include "cache_snmp.h"
42
/************************************************************************
44
SQUID MIB Implementation
46
************************************************************************/
49
snmp_sysFn(variable_list * Var, snint * ErrP)
51
variable_list *Answer = NULL;
52
debug(49, 5) ("snmp_sysFn: Processing request:\n");
53
snmpDebugOid(5, Var->name, Var->name_length);
54
*ErrP = SNMP_ERR_NOERROR;
56
switch (Var->name[LEN_SQ_SYS]) {
59
Answer = snmp_var_new_integer(Var->name, Var->name_length,
60
mem_node::store_mem_size >> 10,
65
Answer = snmp_var_new_integer(Var->name, Var->name_length,
71
Answer = snmp_var_new_integer(Var->name, Var->name_length,
72
(int)(tvSubDsec(squid_start, current_time) * 100),
77
*ErrP = SNMP_ERR_NOSUCHNAME;
85
snmp_confFn(variable_list * Var, snint * ErrP)
87
variable_list *Answer = NULL;
88
const char *cp = NULL;
89
debug(49, 5) ("snmp_confFn: Processing request with magic %d!\n", Var->name[8]);
90
*ErrP = SNMP_ERR_NOERROR;
92
switch (Var->name[LEN_SQ_CONF]) {
95
Answer = snmp_var_new(Var->name, Var->name_length);
96
Answer->type = ASN_OCTET_STR;
97
Answer->val_len = strlen(Config.adminEmail);
98
Answer->val.string = (u_char *) xstrdup(Config.adminEmail);
102
Answer = snmp_var_new(Var->name, Var->name_length);
103
Answer->type = ASN_OCTET_STR;
104
Answer->val_len = strlen(appname);
105
Answer->val.string = (u_char *) xstrdup(appname);
108
case CONF_VERSION_ID:
109
Answer = snmp_var_new(Var->name, Var->name_length);
110
Answer->type = ASN_OCTET_STR;
111
Answer->val_len = strlen(VERSION);
112
Answer->val.string = (u_char *) xstrdup(VERSION);
117
switch (Var->name[LEN_SQ_CONF + 1]) {
120
Answer = snmp_var_new_integer(Var->name, Var->name_length,
121
(snint) Config.memMaxSize >> 20,
125
case CONF_ST_SWMAXSZ:
126
Answer = snmp_var_new_integer(Var->name, Var->name_length,
127
(snint) Store::Root().maxSize() >> 10,
132
Answer = snmp_var_new_integer(Var->name, Var->name_length,
133
(snint) Config.Swap.highWaterMark,
138
Answer = snmp_var_new_integer(Var->name, Var->name_length,
139
(snint) Config.Swap.lowWaterMark,
144
*ErrP = SNMP_ERR_NOSUCHNAME;
151
Answer = snmp_var_new(Var->name, Var->name_length);
153
if (!(cp = Config.debugOptions))
156
Answer->type = ASN_OCTET_STR;
158
Answer->val_len = strlen(cp);
160
Answer->val.string = (u_char *) xstrdup(cp);
165
Answer = snmp_var_new(Var->name, Var->name_length);
167
cp = uniqueHostname();
169
Answer->type = ASN_OCTET_STR;
171
Answer->val_len = strlen(cp);
173
Answer->val.string = (u_char *) xstrdup(cp);
178
*ErrP = SNMP_ERR_NOSUCHNAME;
187
snmp_meshPtblFn(variable_list * Var, snint * ErrP)
189
variable_list *Answer = NULL;
191
struct IN_ADDR *laddr;
195
debug(49, 5) ("snmp_meshPtblFn: peer %d requested!\n", Var->name[LEN_SQ_MESH + 3]);
196
*ErrP = SNMP_ERR_NOERROR;
197
laddr = oid2addr(&Var->name[LEN_SQ_MESH + 3]);
199
for (p = Config.peers; p != NULL; p = p->next, cnt++)
200
if (p->in_addr.sin_addr.s_addr == laddr->s_addr)
204
*ErrP = SNMP_ERR_NOSUCHNAME;
208
switch (Var->name[LEN_SQ_MESH + 2]) {
212
Answer = snmp_var_new(Var->name, Var->name_length);
213
Answer->type = ASN_OCTET_STR;
214
Answer->val_len = strlen(cp);
215
Answer->val.string = (u_char *) xstrdup(cp);
219
Answer = snmp_var_new_integer(Var->name, Var->name_length,
220
(snint) p->in_addr.sin_addr.s_addr,
225
Answer = snmp_var_new_integer(Var->name, Var->name_length,
226
(snint) p->http_port,
231
Answer = snmp_var_new_integer(Var->name, Var->name_length,
237
Answer = snmp_var_new_integer(Var->name, Var->name_length,
242
case MESH_PTBL_STATE:
243
Answer = snmp_var_new_integer(Var->name, Var->name_length,
244
(snint) neighborUp(p),
249
Answer = snmp_var_new_integer(Var->name, Var->name_length,
254
case MESH_PTBL_PACKED:
255
Answer = snmp_var_new_integer(Var->name, Var->name_length,
256
p->stats.pings_acked,
260
case MESH_PTBL_FETCHES:
261
Answer = snmp_var_new_integer(Var->name, Var->name_length,
267
Answer = snmp_var_new_integer(Var->name, Var->name_length,
273
Answer = snmp_var_new_integer(Var->name, Var->name_length,
274
p->stats.ignored_replies,
278
case MESH_PTBL_KEEPAL_S:
279
Answer = snmp_var_new_integer(Var->name, Var->name_length,
280
p->stats.n_keepalives_sent,
284
case MESH_PTBL_KEEPAL_R:
285
Answer = snmp_var_new_integer(Var->name, Var->name_length,
286
p->stats.n_keepalives_recv,
291
*ErrP = SNMP_ERR_NOSUCHNAME;
299
snmp_prfSysFn(variable_list * Var, snint * ErrP)
301
variable_list *Answer = NULL;
303
static struct rusage rusage;
304
debug(49, 5) ("snmp_prfSysFn: Processing request with magic %d!\n", Var->name[LEN_SQ_PRF + 1]);
305
*ErrP = SNMP_ERR_NOERROR;
307
switch (Var->name[LEN_SQ_PRF + 1]) {
310
squid_getrusage(&rusage);
311
Answer = snmp_var_new_integer(Var->name, Var->name_length,
312
rusage_pagefaults(&rusage),
317
Answer = snmp_var_new_integer(Var->name, Var->name_length,
322
case PERF_SYS_MEMUSAGE:
323
Answer = snmp_var_new_integer(Var->name, Var->name_length,
324
(snint) statMemoryAccounted() >> 10,
328
case PERF_SYS_CPUTIME:
329
squid_getrusage(&rusage);
330
Answer = snmp_var_new_integer(Var->name, Var->name_length,
331
(snint) rusage_cputime(&rusage),
335
case PERF_SYS_CPUUSAGE:
336
squid_getrusage(&rusage);
337
Answer = snmp_var_new_integer(Var->name, Var->name_length,
338
(snint) dpercent(rusage_cputime(&rusage), tvSubDsec(squid_start, current_time)),
342
case PERF_SYS_MAXRESSZ:
343
squid_getrusage(&rusage);
344
Answer = snmp_var_new_integer(Var->name, Var->name_length,
345
(snint) rusage_maxrss(&rusage),
349
case PERF_SYS_CURLRUEXP:
350
/* No global LRU info anymore */
351
Answer = snmp_var_new_integer(Var->name, Var->name_length,
356
case PERF_SYS_CURUNLREQ:
357
Answer = snmp_var_new_integer(Var->name, Var->name_length,
358
(snint) statCounter.unlink.requests,
362
case PERF_SYS_CURUNUSED_FD:
363
Answer = snmp_var_new_integer(Var->name, Var->name_length,
364
(snint) Squid_MaxFD - Number_FD,
368
case PERF_SYS_CURRESERVED_FD:
369
Answer = snmp_var_new_integer(Var->name, Var->name_length,
374
case PERF_SYS_CURUSED_FD:
375
Answer = snmp_var_new_integer(Var->name, Var->name_length,
380
case PERF_SYS_CURMAX_FD:
381
Answer = snmp_var_new_integer(Var->name, Var->name_length,
386
case PERF_SYS_NUMOBJCNT:
387
Answer = snmp_var_new_integer(Var->name, Var->name_length,
388
(snint) StoreEntry::inUseCount(),
393
*ErrP = SNMP_ERR_NOSUCHNAME;
401
snmp_prfProtoFn(variable_list * Var, snint * ErrP)
403
variable_list *Answer = NULL;
404
static StatCounters *f = NULL;
405
static StatCounters *l = NULL;
408
debug(49, 5) ("snmp_prfProtoFn: Processing request with magic %d!\n", Var->name[LEN_SQ_PRF]);
409
*ErrP = SNMP_ERR_NOERROR;
411
switch (Var->name[LEN_SQ_PRF + 1]) {
413
case PERF_PROTOSTAT_AGGR: /* cacheProtoAggregateStats */
415
switch (Var->name[LEN_SQ_PRF + 2]) {
417
case PERF_PROTOSTAT_AGGR_HTTP_REQ:
418
Answer = snmp_var_new_integer(Var->name, Var->name_length,
419
(snint) statCounter.client_http.requests,
423
case PERF_PROTOSTAT_AGGR_HTTP_HITS:
424
Answer = snmp_var_new_integer(Var->name, Var->name_length,
425
(snint) statCounter.client_http.hits,
429
case PERF_PROTOSTAT_AGGR_HTTP_ERRORS:
430
Answer = snmp_var_new_integer(Var->name, Var->name_length,
431
(snint) statCounter.client_http.errors,
435
case PERF_PROTOSTAT_AGGR_HTTP_KBYTES_IN:
436
Answer = snmp_var_new_integer(Var->name, Var->name_length,
437
(snint) statCounter.client_http.kbytes_in.kb,
441
case PERF_PROTOSTAT_AGGR_HTTP_KBYTES_OUT:
442
Answer = snmp_var_new_integer(Var->name, Var->name_length,
443
(snint) statCounter.client_http.kbytes_out.kb,
447
case PERF_PROTOSTAT_AGGR_ICP_S:
448
Answer = snmp_var_new_integer(Var->name, Var->name_length,
449
(snint) statCounter.icp.pkts_sent,
453
case PERF_PROTOSTAT_AGGR_ICP_R:
454
Answer = snmp_var_new_integer(Var->name, Var->name_length,
455
(snint) statCounter.icp.pkts_recv,
459
case PERF_PROTOSTAT_AGGR_ICP_SKB:
460
Answer = snmp_var_new_integer(Var->name, Var->name_length,
461
(snint) statCounter.icp.kbytes_sent.kb,
465
case PERF_PROTOSTAT_AGGR_ICP_RKB:
466
Answer = snmp_var_new_integer(Var->name, Var->name_length,
467
(snint) statCounter.icp.kbytes_recv.kb,
471
case PERF_PROTOSTAT_AGGR_REQ:
472
Answer = snmp_var_new_integer(Var->name, Var->name_length,
473
(snint) statCounter.server.all.requests,
477
case PERF_PROTOSTAT_AGGR_ERRORS:
478
Answer = snmp_var_new_integer(Var->name, Var->name_length,
479
(snint) statCounter.server.all.errors,
483
case PERF_PROTOSTAT_AGGR_KBYTES_IN:
484
Answer = snmp_var_new_integer(Var->name, Var->name_length,
485
(snint) statCounter.server.all.kbytes_in.kb,
489
case PERF_PROTOSTAT_AGGR_KBYTES_OUT:
490
Answer = snmp_var_new_integer(Var->name, Var->name_length,
491
(snint) statCounter.server.all.kbytes_out.kb,
495
case PERF_PROTOSTAT_AGGR_CURSWAP:
496
Answer = snmp_var_new_integer(Var->name, Var->name_length,
497
(snint) store_swap_size,
501
case PERF_PROTOSTAT_AGGR_CLIENTS:
502
Answer = snmp_var_new_integer(Var->name, Var->name_length,
503
(snint) statCounter.client_http.clients,
508
*ErrP = SNMP_ERR_NOSUCHNAME;
514
case PERF_PROTOSTAT_MEDIAN:
516
if (Var->name_length == LEN_SQ_PRF + 5)
517
minutes = Var->name[LEN_SQ_PRF + 4];
521
if ((minutes < 1) || (minutes > 60))
526
l = snmpStatGet(minutes);
528
debug(49, 8) ("median: min= %d, %d l= %p , f = %p\n", minutes,
529
Var->name[LEN_SQ_PRF + 3], l, f);
531
debug(49, 8) ("median: l= %p , f = %p\n", l, f);
533
switch (Var->name[LEN_SQ_PRF + 3]) {
535
case PERF_MEDIAN_TIME:
539
case PERF_MEDIAN_HTTP_ALL:
540
x = statHistDeltaMedian(&l->client_http.all_svc_time,
541
&f->client_http.all_svc_time);
544
case PERF_MEDIAN_HTTP_MISS:
545
x = statHistDeltaMedian(&l->client_http.miss_svc_time,
546
&f->client_http.miss_svc_time);
549
case PERF_MEDIAN_HTTP_NM:
550
x = statHistDeltaMedian(&l->client_http.nm_svc_time,
551
&f->client_http.nm_svc_time);
554
case PERF_MEDIAN_HTTP_HIT:
555
x = statHistDeltaMedian(&l->client_http.hit_svc_time,
556
&f->client_http.hit_svc_time);
559
case PERF_MEDIAN_ICP_QUERY:
560
x = statHistDeltaMedian(&l->icp.query_svc_time, &f->icp.query_svc_time);
563
case PERF_MEDIAN_ICP_REPLY:
564
x = statHistDeltaMedian(&l->icp.reply_svc_time, &f->icp.reply_svc_time);
567
case PERF_MEDIAN_DNS:
568
x = statHistDeltaMedian(&l->dns.svc_time, &f->dns.svc_time);
571
case PERF_MEDIAN_RHR:
572
x = statRequestHitRatio(minutes);
575
case PERF_MEDIAN_BHR:
576
x = statByteHitRatio(minutes);
579
case PERF_MEDIAN_HTTP_NH:
580
x = statHistDeltaMedian(&l->client_http.nh_svc_time,
581
&f->client_http.nm_svc_time);
585
*ErrP = SNMP_ERR_NOSUCHNAME;
589
return snmp_var_new_integer(Var->name, Var->name_length,
594
*ErrP = SNMP_ERR_NOSUCHNAME;