3 * $Id: snmp_agent.cc,v 1.80 2001/02/07 18:56:52 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"
40 /************************************************************************
42 SQUID MIB Implementation
44 ************************************************************************/
47 snmp_sysFn(variable_list
* Var
, snint
* ErrP
)
49 variable_list
*Answer
= NULL
;
50 debug(49, 5) ("snmp_sysFn: Processing request:\n", Var
->name
[LEN_SQ_SYS
]);
51 snmpDebugOid(5, Var
->name
, Var
->name_length
);
52 *ErrP
= SNMP_ERR_NOERROR
;
53 switch (Var
->name
[LEN_SQ_SYS
]) {
55 Answer
= snmp_var_new_integer(Var
->name
, Var
->name_length
,
60 Answer
= snmp_var_new_integer(Var
->name
, Var
->name_length
,
65 Answer
= snmp_var_new_integer(Var
->name
, Var
->name_length
,
66 tvSubDsec(squid_start
, current_time
) * 100,
70 *ErrP
= SNMP_ERR_NOSUCHNAME
;
77 snmp_confFn(variable_list
* Var
, snint
* ErrP
)
79 variable_list
*Answer
= NULL
;
81 debug(49, 5) ("snmp_confFn: Processing request with magic %d!\n", Var
->name
[8]);
82 *ErrP
= SNMP_ERR_NOERROR
;
83 switch (Var
->name
[LEN_SQ_CONF
]) {
85 Answer
= snmp_var_new(Var
->name
, Var
->name_length
);
86 Answer
->type
= ASN_OCTET_STR
;
87 Answer
->val_len
= strlen(Config
.adminEmail
);
88 Answer
->val
.string
= (u_char
*) xstrdup(Config
.adminEmail
);
91 Answer
= snmp_var_new(Var
->name
, Var
->name_length
);
92 Answer
->type
= ASN_OCTET_STR
;
93 Answer
->val_len
= strlen(appname
);
94 Answer
->val
.string
= (u_char
*) xstrdup(appname
);
97 Answer
= snmp_var_new(Var
->name
, Var
->name_length
);
98 Answer
->type
= ASN_OCTET_STR
;
99 Answer
->val_len
= strlen(SQUID_VERSION
);
100 Answer
->val
.string
= (u_char
*) xstrdup(SQUID_VERSION
);
103 switch (Var
->name
[LEN_SQ_CONF
+ 1]) {
105 Answer
= snmp_var_new_integer(Var
->name
, Var
->name_length
,
106 (snint
) Config
.memMaxSize
>> 20,
109 case CONF_ST_SWMAXSZ
:
110 Answer
= snmp_var_new_integer(Var
->name
, Var
->name_length
,
111 (snint
) Config
.Swap
.maxSize
>> 10,
115 Answer
= snmp_var_new_integer(Var
->name
, Var
->name_length
,
116 (snint
) Config
.Swap
.highWaterMark
,
120 Answer
= snmp_var_new_integer(Var
->name
, Var
->name_length
,
121 (snint
) Config
.Swap
.lowWaterMark
,
125 *ErrP
= SNMP_ERR_NOSUCHNAME
;
130 Answer
= snmp_var_new(Var
->name
, Var
->name_length
);
131 if (!(cp
= Config
.debugOptions
))
133 Answer
->type
= ASN_OCTET_STR
;
134 Answer
->val_len
= strlen(cp
);
135 Answer
->val
.string
= (u_char
*) xstrdup(cp
);
138 *ErrP
= SNMP_ERR_NOSUCHNAME
;
145 snmp_meshPtblFn(variable_list
* Var
, snint
* ErrP
)
147 variable_list
*Answer
= NULL
;
148 struct in_addr
*laddr
;
152 debug(49, 5) ("snmp_meshPtblFn: peer %d requested!\n", Var
->name
[LEN_SQ_MESH
+ 3]);
153 *ErrP
= SNMP_ERR_NOERROR
;
154 laddr
= oid2addr(&Var
->name
[LEN_SQ_MESH
+ 3]);
155 for (p
= Config
.peers
; p
!= NULL
; p
= p
->next
, cnt
++)
156 if (p
->in_addr
.sin_addr
.s_addr
== laddr
->s_addr
)
159 *ErrP
= SNMP_ERR_NOSUCHNAME
;
162 switch (Var
->name
[LEN_SQ_MESH
+ 2]) {
165 Answer
= snmp_var_new(Var
->name
, Var
->name_length
);
166 Answer
->type
= ASN_OCTET_STR
;
167 Answer
->val_len
= strlen(cp
);
168 Answer
->val
.string
= (u_char
*) xstrdup(cp
);
171 Answer
= snmp_var_new_integer(Var
->name
, Var
->name_length
,
172 (snint
) p
->in_addr
.sin_addr
.s_addr
,
176 Answer
= snmp_var_new_integer(Var
->name
, Var
->name_length
,
177 (snint
) p
->http_port
,
181 Answer
= snmp_var_new_integer(Var
->name
, Var
->name_length
,
186 Answer
= snmp_var_new_integer(Var
->name
, Var
->name_length
,
190 case MESH_PTBL_STATE
:
191 Answer
= snmp_var_new_integer(Var
->name
, Var
->name_length
,
192 (snint
) neighborUp(p
),
196 Answer
= snmp_var_new_integer(Var
->name
, Var
->name_length
,
200 case MESH_PTBL_PACKED
:
201 Answer
= snmp_var_new_integer(Var
->name
, Var
->name_length
,
202 p
->stats
.pings_acked
,
205 case MESH_PTBL_FETCHES
:
206 Answer
= snmp_var_new_integer(Var
->name
, Var
->name_length
,
211 Answer
= snmp_var_new_integer(Var
->name
, Var
->name_length
,
216 Answer
= snmp_var_new_integer(Var
->name
, Var
->name_length
,
217 p
->stats
.ignored_replies
,
220 case MESH_PTBL_KEEPAL_S
:
221 Answer
= snmp_var_new_integer(Var
->name
, Var
->name_length
,
222 p
->stats
.n_keepalives_sent
,
225 case MESH_PTBL_KEEPAL_R
:
226 Answer
= snmp_var_new_integer(Var
->name
, Var
->name_length
,
227 p
->stats
.n_keepalives_recv
,
231 *ErrP
= SNMP_ERR_NOSUCHNAME
;
238 snmp_prfSysFn(variable_list
* Var
, snint
* ErrP
)
240 variable_list
*Answer
= NULL
;
241 static struct rusage rusage
;
242 debug(49, 5) ("snmp_prfSysFn: Processing request with magic %d!\n", Var
->name
[LEN_SQ_PRF
+ 1]);
243 *ErrP
= SNMP_ERR_NOERROR
;
244 switch (Var
->name
[LEN_SQ_PRF
+ 1]) {
246 squid_getrusage(&rusage
);
247 Answer
= snmp_var_new_integer(Var
->name
, Var
->name_length
,
248 rusage_pagefaults(&rusage
),
252 Answer
= snmp_var_new_integer(Var
->name
, Var
->name_length
,
256 case PERF_SYS_MEMUSAGE
:
257 Answer
= snmp_var_new_integer(Var
->name
, Var
->name_length
,
258 (snint
) statMemoryAccounted() >> 10,
261 case PERF_SYS_CPUTIME
:
262 squid_getrusage(&rusage
);
263 Answer
= snmp_var_new_integer(Var
->name
, Var
->name_length
,
264 (snint
) rusage_cputime(&rusage
),
267 case PERF_SYS_CPUUSAGE
:
268 squid_getrusage(&rusage
);
269 Answer
= snmp_var_new_integer(Var
->name
, Var
->name_length
,
270 (snint
) dpercent(rusage_cputime(&rusage
), tvSubDsec(squid_start
, current_time
)),
273 case PERF_SYS_MAXRESSZ
:
274 squid_getrusage(&rusage
);
275 Answer
= snmp_var_new_integer(Var
->name
, Var
->name_length
,
276 (snint
) rusage_maxrss(&rusage
),
279 case PERF_SYS_CURLRUEXP
:
280 /* No global LRU info anymore */
281 Answer
= snmp_var_new_integer(Var
->name
, Var
->name_length
,
285 case PERF_SYS_CURUNLREQ
:
286 Answer
= snmp_var_new_integer(Var
->name
, Var
->name_length
,
287 (snint
) statCounter
.unlink
.requests
,
290 case PERF_SYS_CURUNUSED_FD
:
291 Answer
= snmp_var_new_integer(Var
->name
, Var
->name_length
,
292 (snint
) Squid_MaxFD
- Number_FD
,
295 case PERF_SYS_CURRESERVED_FD
:
296 Answer
= snmp_var_new_integer(Var
->name
, Var
->name_length
,
300 case PERF_SYS_NUMOBJCNT
:
301 Answer
= snmp_var_new_integer(Var
->name
, Var
->name_length
,
302 (snint
) memInUse(MEM_STOREENTRY
),
306 *ErrP
= SNMP_ERR_NOSUCHNAME
;
313 snmp_prfProtoFn(variable_list
* Var
, snint
* ErrP
)
315 variable_list
*Answer
= NULL
;
316 static StatCounters
*f
= NULL
;
317 static StatCounters
*l
= NULL
;
320 debug(49, 5) ("snmp_prfProtoFn: Processing request with magic %d!\n", Var
->name
[LEN_SQ_PRF
]);
321 *ErrP
= SNMP_ERR_NOERROR
;
322 switch (Var
->name
[LEN_SQ_PRF
+ 1]) {
323 case PERF_PROTOSTAT_AGGR
: /* cacheProtoAggregateStats */
324 switch (Var
->name
[LEN_SQ_PRF
+ 2]) {
325 case PERF_PROTOSTAT_AGGR_HTTP_REQ
:
326 Answer
= snmp_var_new_integer(Var
->name
, Var
->name_length
,
327 (snint
) statCounter
.client_http
.requests
,
330 case PERF_PROTOSTAT_AGGR_HTTP_HITS
:
331 Answer
= snmp_var_new_integer(Var
->name
, Var
->name_length
,
332 (snint
) statCounter
.client_http
.hits
,
335 case PERF_PROTOSTAT_AGGR_HTTP_ERRORS
:
336 Answer
= snmp_var_new_integer(Var
->name
, Var
->name_length
,
337 (snint
) statCounter
.client_http
.errors
,
340 case PERF_PROTOSTAT_AGGR_HTTP_KBYTES_IN
:
341 Answer
= snmp_var_new_integer(Var
->name
, Var
->name_length
,
342 (snint
) statCounter
.client_http
.kbytes_in
.kb
,
345 case PERF_PROTOSTAT_AGGR_HTTP_KBYTES_OUT
:
346 Answer
= snmp_var_new_integer(Var
->name
, Var
->name_length
,
347 (snint
) statCounter
.client_http
.kbytes_out
.kb
,
350 case PERF_PROTOSTAT_AGGR_ICP_S
:
351 Answer
= snmp_var_new_integer(Var
->name
, Var
->name_length
,
352 (snint
) statCounter
.icp
.pkts_sent
,
355 case PERF_PROTOSTAT_AGGR_ICP_R
:
356 Answer
= snmp_var_new_integer(Var
->name
, Var
->name_length
,
357 (snint
) statCounter
.icp
.pkts_recv
,
360 case PERF_PROTOSTAT_AGGR_ICP_SKB
:
361 Answer
= snmp_var_new_integer(Var
->name
, Var
->name_length
,
362 (snint
) statCounter
.icp
.kbytes_sent
.kb
,
365 case PERF_PROTOSTAT_AGGR_ICP_RKB
:
366 Answer
= snmp_var_new_integer(Var
->name
, Var
->name_length
,
367 (snint
) statCounter
.icp
.kbytes_recv
.kb
,
370 case PERF_PROTOSTAT_AGGR_REQ
:
371 Answer
= snmp_var_new_integer(Var
->name
, Var
->name_length
,
372 (snint
) statCounter
.server
.all
.requests
,
375 case PERF_PROTOSTAT_AGGR_ERRORS
:
376 Answer
= snmp_var_new_integer(Var
->name
, Var
->name_length
,
377 (snint
) statCounter
.server
.all
.errors
,
380 case PERF_PROTOSTAT_AGGR_KBYTES_IN
:
381 Answer
= snmp_var_new_integer(Var
->name
, Var
->name_length
,
382 (snint
) statCounter
.server
.all
.kbytes_in
.kb
,
385 case PERF_PROTOSTAT_AGGR_KBYTES_OUT
:
386 Answer
= snmp_var_new_integer(Var
->name
, Var
->name_length
,
387 (snint
) statCounter
.server
.all
.kbytes_out
.kb
,
390 case PERF_PROTOSTAT_AGGR_CURSWAP
:
391 Answer
= snmp_var_new_integer(Var
->name
, Var
->name_length
,
392 (snint
) store_swap_size
,
395 case PERF_PROTOSTAT_AGGR_CLIENTS
:
396 Answer
= snmp_var_new_integer(Var
->name
, Var
->name_length
,
397 (snint
) statCounter
.client_http
.clients
,
401 *ErrP
= SNMP_ERR_NOSUCHNAME
;
405 case PERF_PROTOSTAT_MEDIAN
:
406 if (Var
->name_length
== LEN_SQ_PRF
+ 5)
407 minutes
= Var
->name
[LEN_SQ_PRF
+ 4];
410 if ((minutes
< 1) || (minutes
> 60))
413 l
= snmpStatGet(minutes
);
414 debug(49, 8) ("median: min= %d, %d l= %x , f = %x\n", minutes
,
415 Var
->name
[LEN_SQ_PRF
+ 3], l
, f
);
416 debug(49, 8) ("median: l= %x , f = %x\n", l
, f
);
417 switch (Var
->name
[LEN_SQ_PRF
+ 3]) {
418 case PERF_MEDIAN_TIME
:
421 case PERF_MEDIAN_HTTP_ALL
:
422 x
= statHistDeltaMedian(&l
->client_http
.all_svc_time
,
423 &f
->client_http
.all_svc_time
);
425 case PERF_MEDIAN_HTTP_MISS
:
426 x
= statHistDeltaMedian(&l
->client_http
.miss_svc_time
,
427 &f
->client_http
.miss_svc_time
);
429 case PERF_MEDIAN_HTTP_NM
:
430 x
= statHistDeltaMedian(&l
->client_http
.nm_svc_time
,
431 &f
->client_http
.nm_svc_time
);
433 case PERF_MEDIAN_HTTP_HIT
:
434 x
= statHistDeltaMedian(&l
->client_http
.hit_svc_time
,
435 &f
->client_http
.hit_svc_time
);
437 case PERF_MEDIAN_ICP_QUERY
:
438 x
= statHistDeltaMedian(&l
->icp
.query_svc_time
, &f
->icp
.query_svc_time
);
440 case PERF_MEDIAN_ICP_REPLY
:
441 x
= statHistDeltaMedian(&l
->icp
.reply_svc_time
, &f
->icp
.reply_svc_time
);
443 case PERF_MEDIAN_DNS
:
444 x
= statHistDeltaMedian(&l
->dns
.svc_time
, &f
->dns
.svc_time
);
446 case PERF_MEDIAN_RHR
:
447 x
= statRequestHitRatio(minutes
);
449 case PERF_MEDIAN_BHR
:
450 x
= statByteHitRatio(minutes
);
453 *ErrP
= SNMP_ERR_NOSUCHNAME
;
456 return snmp_var_new_integer(Var
->name
, Var
->name_length
,
460 *ErrP
= SNMP_ERR_NOSUCHNAME
;