1 #include <net-snmp/net-snmp-config.h>
17 #if HAVE_MACHINE_PARAM_H
18 #include <machine/param.h>
20 #if HAVE_SYS_VMMETER_H
21 #if !defined(bsdi2) && !defined(netbsd1)
22 #include <sys/vmmeter.h>
34 #ifdef HAVE_SYS_STAT_H
37 #ifdef HAVE_SYS_VNODE_H
38 #include <sys/vnode.h>
40 #ifdef HAVE_UFS_UFS_QUOTA_H
41 #include <ufs/ufs/quota.h>
43 #ifdef HAVE_UFS_UFS_INODE_H
44 #include <ufs/ufs/inode.h>
47 #include <ufs/ffs/fs.h>
59 #if HAVE_SYS_STATVFS_H
60 #include <sys/statvfs.h>
65 #if (!defined(HAVE_STATVFS)) && defined(HAVE_STATFS)
67 #include <sys/param.h>
70 #include <sys/mount.h>
73 #include <sys/sysctl.h>
75 #define statvfs statfs
77 #if HAVE_VM_SWAP_PAGER_H
78 #include <vm/swap_pager.h>
80 #if HAVE_SYS_FIXPOINT_H
81 #include <sys/fixpoint.h>
91 #if TIME_WITH_SYS_TIME
92 # include <sys/time.h>
96 # include <sys/time.h>
102 #include <net-snmp/net-snmp-includes.h>
103 #include <net-snmp/agent/net-snmp-agent-includes.h>
104 #include <net-snmp/agent/auto_nlist.h>
108 #include "util_funcs.h"
111 FindVarMethod var_extensible_vmstat;
116 struct variable2 extensible_vmstat_variables[] = {
117 {MIBINDEX, ASN_INTEGER, RONLY, var_extensible_vmstat, 1,
119 {ERRORNAME, ASN_OCTET_STR, RONLY, var_extensible_vmstat, 1,
121 {SWAPIN, ASN_INTEGER, RONLY, var_extensible_vmstat, 1, {SWAPIN}},
122 {SWAPOUT, ASN_INTEGER, RONLY, var_extensible_vmstat, 1, {SWAPOUT}},
123 {IOSENT, ASN_INTEGER, RONLY, var_extensible_vmstat, 1, {IOSENT}},
124 {IORECEIVE, ASN_INTEGER, RONLY, var_extensible_vmstat, 1,
126 {SYSINTERRUPTS, ASN_INTEGER, RONLY, var_extensible_vmstat, 1,
128 {SYSCONTEXT, ASN_INTEGER, RONLY, var_extensible_vmstat, 1,
130 {CPUUSER, ASN_INTEGER, RONLY, var_extensible_vmstat, 1, {CPUUSER}},
131 {CPUSYSTEM, ASN_INTEGER, RONLY, var_extensible_vmstat, 1,
133 {CPUIDLE, ASN_INTEGER, RONLY, var_extensible_vmstat, 1, {CPUIDLE}},
134 {CPURAWUSER, ASN_COUNTER, RONLY, var_extensible_vmstat, 1,
136 {CPURAWNICE, ASN_COUNTER, RONLY, var_extensible_vmstat, 1,
138 {CPURAWSYSTEM, ASN_COUNTER, RONLY, var_extensible_vmstat, 1,
140 {CPURAWIDLE, ASN_COUNTER, RONLY, var_extensible_vmstat, 1,
142 {SYSRAWINTERRUPTS, ASN_COUNTER, RONLY, var_extensible_vmstat, 1,
144 {SYSRAWCONTEXT, ASN_COUNTER, RONLY, var_extensible_vmstat, 1,
150 * {ERRORFLAG, ASN_INTEGER, RONLY, var_extensible_vmstat, 1, {ERRORFLAG }},
151 * {ERRORMSG, ASN_OCTET_STR, RONLY, var_extensible_vmstat, 1, {ERRORMSG }}
156 * Define the OID pointer to the top of the mib tree that we're
157 * registering underneath
159 oid vmstat_variables_oid[] = { UCDAVIS_MIB, 11 };
162 * register ourselves with the agent to handle our mib tree
164 REGISTER_MIB("ucd-snmp/vmstat", extensible_vmstat_variables, variable2,
165 vmstat_variables_oid);
171 #define VMSTAT_FILE "/proc/stat"
174 getstat(unsigned long *cuse, unsigned long *cice, unsigned long *csys,
175 unsigned long *cide, unsigned long *pin, unsigned long *pout,
176 unsigned long *swpin, unsigned long *swpout, unsigned long *itot,
177 unsigned long *i1, unsigned long *ct)
181 static char *buff = NULL;
182 static int bsize = 0;
184 if ((statfd = open(VMSTAT_FILE, O_RDONLY, 0)) != -1) {
188 buff = malloc(bsize);
190 while (read(statfd, buff, bsize) == bsize) {
192 buff = realloc(buff, bsize);
193 DEBUGMSGTL(("vmstat", "/proc/stat buffer increased to %d\n", bsize));
195 statfd = open(VMSTAT_FILE, O_RDONLY, 0);
199 *i1 = 1; /* ensure assert below will fail if the sscanf bombs */
200 b = strstr(buff, "cpu ");
202 sscanf(b, "cpu %lu %lu %lu %lu", cuse, cice, csys, cide);
205 snmp_log(LOG_ERR, "No cpu line in /proc/stat\n");
206 *cuse = *cice = *csys = *cide = 0;
208 b = strstr(buff, "page ");
210 sscanf(b, "page %lu %lu", pin, pout);
213 snmp_log(LOG_ERR, "No page line in /proc/stat\n");
216 b = strstr(buff, "swap ");
218 sscanf(b, "swap %lu %lu", swpin, swpout);
221 snmp_log(LOG_ERR, "No swap line in /proc/stat\n");
222 *swpin = *swpout = 0;
224 b = strstr(buff, "intr ");
226 sscanf(b, "intr %lu %lu", itot, i1);
229 snmp_log(LOG_ERR, "No intr line in /proc/stat\n");
232 b = strstr(buff, "ctxt ");
234 sscanf(b, "ctxt %lu", ct);
237 snmp_log(LOG_ERR, "No ctxt line in /proc/stat\n");
242 snmp_log_perror(VMSTAT_FILE);
246 enum vmstat_index { swapin = 0, swapout,
248 sysinterrupts, syscontext,
249 cpuuser, cpusystem, cpuidle,
250 cpurawuser, cpurawnice,
251 cpurawsystem, cpurawidle,
252 sysrawinterrupts, sysrawcontext
258 unsigned long cpu_use, cpu_nic, cpu_sys, cpu_idl;
259 double duse, dsys, didl, ddiv, divo2;
260 unsigned long pgpgin, pgpgout, pswpin, pswpout;
261 unsigned long inter, ticks, ctxt;
264 getstat(&cpu_use, &cpu_nic, &cpu_sys, &cpu_idl,
265 &pgpgin, &pgpgout, &pswpin, &pswpout, &inter, &ticks, &ctxt);
266 duse = cpu_use + cpu_nic;
269 ddiv = (duse + dsys + didl);
270 hz = sysconf(_SC_CLK_TCK); /* get ticks/s from system */
275 return (pswpin * 4 * hz + divo2) / ddiv;
277 return (pswpout * 4 * hz + divo2) / ddiv;
279 return (pgpgin * hz + divo2) / ddiv;
281 return (pgpgout * hz + divo2) / ddiv;
283 return (inter * hz + divo2) / ddiv;
285 return (ctxt * hz + divo2) / ddiv;
287 return (100 * duse / ddiv);
289 return (100 * dsys / ddiv);
291 return (100 * didl / ddiv);
300 case sysrawinterrupts:
310 var_extensible_vmstat(struct variable *vp,
314 size_t * var_len, WriteMethod ** write_method)
317 static long long_ret;
318 static char errmsg[300];
320 struct vmtotal total;
323 long_ret = 0; /* set to 0 as default */
325 if (header_generic(vp, name, length, exact, var_len, write_method))
330 return ((u_char *) (&long_ret));
331 case ERRORNAME: /* dummy name */
332 sprintf(errmsg, "systemStats");
333 *var_len = strlen(errmsg);
334 return ((u_char *) (errmsg));
337 long_ret = vmstat(swapin);
339 return ((u_char *) (&long_ret));
342 long_ret = vmstat(swapout);
344 return ((u_char *) (&long_ret));
347 long_ret = vmstat(iosent);
349 return ((u_char *) (&long_ret));
352 long_ret = vmstat(ioreceive);
354 return ((u_char *) (&long_ret));
357 long_ret = vmstat(sysinterrupts);
359 return ((u_char *) (&long_ret));
362 long_ret = vmstat(syscontext);
364 return ((u_char *) (&long_ret));
367 long_ret = vmstat(cpuuser);
369 return ((u_char *) (&long_ret));
372 long_ret = vmstat(cpusystem);
374 return ((u_char *) (&long_ret));
377 long_ret = vmstat(cpuidle);
379 return ((u_char *) (&long_ret));
382 long_ret = vmstat(cpurawuser);
384 return ((u_char *) (&long_ret));
387 long_ret = vmstat(cpurawnice);
389 return ((u_char *) (&long_ret));
392 long_ret = vmstat(cpurawsystem);
394 return ((u_char *) (&long_ret));
397 long_ret = vmstat(cpurawidle);
399 return ((u_char *) (&long_ret));
400 case SYSRAWINTERRUPTS:
402 long_ret = vmstat(sysrawinterrupts);
404 return ((u_char *) (&long_ret));
407 long_ret = vmstat(sysrawcontext);
409 return ((u_char *) (&long_ret));
411 * reserved for future use
415 * return((u_char *) (&long_ret));
417 * return((u_char *) (&long_ret));