vmstat_bsdi4.c
上传用户:wxp200602
上传日期:2007-10-30
资源大小:4028k
文件大小:8k
源码类别:

SNMP编程

开发平台:

Unix_Linux

  1. /*
  2.  * vmstat_bsdi4.c
  3.  */
  4. #include <net-snmp/net-snmp-config.h>
  5. /*
  6.  * Ripped from /usr/scr/usr.bin/vmstat/vmstat.c (covering all bases) 
  7.  */
  8. #include <sys/param.h>
  9. #include <sys/time.h>
  10. #include <sys/proc.h>
  11. #include <sys/dkstat.h>
  12. #include <sys/buf.h>
  13. #include <sys/uio.h>
  14. #include <sys/namei.h>
  15. #include <sys/malloc.h>
  16. #include <sys/signal.h>
  17. #include <sys/fcntl.h>
  18. #include <sys/ioctl.h>
  19. #include <sys/sysctl.h>
  20. #include <sys/vmmeter.h>
  21. #include <vm/vm_param.h>
  22. #include <vm/vm_extern.h>
  23. #include <time.h>
  24. #include <nlist.h>
  25. #include <kvm.h>
  26. #include <errno.h>
  27. #include <unistd.h>
  28. #include <stdio.h>
  29. #include <ctype.h>
  30. #include <stdlib.h>
  31. #include <string.h>
  32. #include <paths.h>
  33. #include <limits.h>
  34. #include <net-snmp/net-snmp-includes.h>
  35. #include <net-snmp/agent/net-snmp-agent-includes.h>
  36. #include <net-snmp/agent/auto_nlist.h>
  37. #include "util_funcs.h"
  38. #include "vmstat.h"
  39. /*
  40.  * CPU percentage 
  41.  */
  42. #define CPU_PRC         100
  43. #define BOOTTIME_SYMBOL "boottime"
  44. FindVarMethod var_extensible_vmstat;
  45. void
  46. init_vmstat_bsdi4(void)
  47. {
  48.     struct variable2 extensible_vmstat_variables[] = {
  49.         {MIBINDEX, ASN_INTEGER, RONLY, var_extensible_vmstat, 1,
  50.          {MIBINDEX}},
  51.         {ERRORNAME, ASN_OCTET_STR, RONLY, var_extensible_vmstat, 1,
  52.          {ERRORNAME}},
  53.         {SWAPIN, ASN_INTEGER, RONLY, var_extensible_vmstat, 1, {SWAPIN}},
  54.         {SWAPOUT, ASN_INTEGER, RONLY, var_extensible_vmstat, 1, {SWAPOUT}},
  55.         {IOSENT, ASN_INTEGER, RONLY, var_extensible_vmstat, 1, {IOSENT}},
  56.         {IORECEIVE, ASN_INTEGER, RONLY, var_extensible_vmstat, 1,
  57.          {IORECEIVE}},
  58.         {SYSINTERRUPTS, ASN_INTEGER, RONLY, var_extensible_vmstat, 1,
  59.          {SYSINTERRUPTS}},
  60.         {SYSCONTEXT, ASN_INTEGER, RONLY, var_extensible_vmstat, 1,
  61.          {SYSCONTEXT}},
  62.         {CPUUSER, ASN_INTEGER, RONLY, var_extensible_vmstat, 1, {CPUUSER}},
  63.         {CPUSYSTEM, ASN_INTEGER, RONLY, var_extensible_vmstat, 1,
  64.          {CPUSYSTEM}},
  65.         {CPUIDLE, ASN_INTEGER, RONLY, var_extensible_vmstat, 1, {CPUIDLE}},
  66.         {CPURAWUSER, ASN_COUNTER, RONLY, var_extensible_vmstat, 1,
  67.          {CPURAWUSER}},
  68.         {CPURAWNICE, ASN_COUNTER, RONLY, var_extensible_vmstat, 1,
  69.          {CPURAWNICE}},
  70.         {CPURAWSYSTEM, ASN_COUNTER, RONLY, var_extensible_vmstat, 1,
  71.          {CPURAWSYSTEM}},
  72.         {CPURAWIDLE, ASN_COUNTER, RONLY, var_extensible_vmstat, 1,
  73.          {CPURAWIDLE}},
  74.         {CPURAWKERNEL, ASN_COUNTER, RONLY, var_extensible_vmstat, 1,
  75.          {CPURAWKERNEL}},
  76.         {CPURAWINTR, ASN_COUNTER, RONLY, var_extensible_vmstat, 1,
  77.          {CPURAWINTR}},
  78.         /*
  79.          * Future use: 
  80.          */
  81.         /*
  82.          * {ERRORFLAG, ASN_INTEGER, RONLY, var_extensible_vmstat, 1, {ERRORFLAG }},
  83.          * {ERRORMSG, ASN_OCTET_STR, RONLY, var_extensible_vmstat, 1, {ERRORMSG }}
  84.          */
  85.     };
  86.     /*
  87.      * Define the OID pointer to the top of the mib tree that we're
  88.      * registering underneath 
  89.      */
  90.     oid             vmstat_variables_oid[] = { UCDAVIS_MIB, 11 };
  91.     /*
  92.      * register ourselves with the agent to handle our mib tree 
  93.      */
  94.     REGISTER_MIB("ucd-snmp/vmstat", extensible_vmstat_variables, variable2,
  95.                  vmstat_variables_oid);
  96. }
  97. long
  98. getuptime(void)
  99. {
  100.     static time_t   now, boottime;
  101.     time_t          uptime;
  102.     if (boottime == 0)
  103.         auto_nlist(BOOTTIME_SYMBOL, (char *) &boottime, sizeof(boottime));
  104.     time(&now);
  105.     uptime = now - boottime;
  106.     return (uptime);
  107. }
  108. unsigned char  *
  109. var_extensible_vmstat(struct variable *vp,
  110.                       oid * name,
  111.                       size_t * length,
  112.                       int exact,
  113.                       size_t * var_len, WriteMethod ** write_method)
  114. {
  115.     int             loop;
  116.     time_t          time_new = getuptime();
  117.     static time_t   time_old;
  118.     static time_t   time_diff;
  119.     static long     cpu_old[CPUSTATES];
  120.     static long     cpu_new[CPUSTATES];
  121.     static long     cpu_diff[CPUSTATES];
  122.     static long     cpu_total;
  123.     long            cpu_sum;
  124.     double          cpu_prc;
  125.     static struct vmmeter mem_old, mem_new;
  126.     int             mem_mib[] = { CTL_VM, VM_CNT };
  127.     int             mem_size = sizeof(struct vmmeter);
  128.     int             cpu_mib[] = { CTL_KERN, KERN_CPUSTATS };
  129.     int             cpu_size = sizeof(struct cpustats);
  130.     static long     long_ret;
  131.     static char     errmsg[300];
  132.     long_ret = 0;               /* set to 0 as default */
  133.     if (header_generic(vp, name, length, exact, var_len, write_method))
  134.         return (NULL);
  135.     /*
  136.      * Update structures (only if time has passed) 
  137.      */
  138.     if (time_new != time_old) {
  139.         time_diff = time_new - time_old;
  140.         time_old = time_new;
  141.         /*
  142.          * CPU usage 
  143.          */
  144.         sysctl(cpu_mib, 2, &cpu_new, &cpu_size, NULL, 0);
  145.         cpu_total = 0;
  146.         for (loop = 0; loop < CPUSTATES; loop++) {
  147.             cpu_diff[loop] = cpu_new[loop] - cpu_old[loop];
  148.             cpu_old[loop] = cpu_new[loop];
  149.             cpu_total += cpu_diff[loop];
  150.         }
  151.         if (cpu_total == 0)
  152.             cpu_total = 1;
  153.         /*
  154.          * Memory info 
  155.          */
  156.         mem_old = mem_new;
  157.         sysctl(mem_mib, 2, &mem_new, &mem_size, NULL, 0);
  158.     }
  159.     /*
  160.      * Rate macro 
  161.      */
  162. #define rate(x) (((x)+ time_diff/2) / time_diff)
  163.     /*
  164.      * Page-to-kb macro 
  165.      */
  166. #define ptok(p) ((p) * (mem_new.v_page_size >> 10))
  167.     switch (vp->magic) {
  168.     case MIBINDEX:
  169.         long_ret = 1;
  170.         return ((u_char *) (&long_ret));
  171.     case ERRORNAME:            /* dummy name */
  172.         sprintf(errmsg, "systemStats");
  173.         *var_len = strlen(errmsg);
  174.         return ((u_char *) (errmsg));
  175.     case SWAPIN:
  176.         long_ret = ptok(mem_new.v_swpin - mem_old.v_swpin);
  177.         long_ret = rate(long_ret);
  178.         return ((u_char *) (&long_ret));
  179.     case SWAPOUT:
  180.         long_ret = ptok(mem_new.v_swpout - mem_old.v_swpout);
  181.         long_ret = rate(long_ret);
  182.         return ((u_char *) (&long_ret));
  183.     case IOSENT:
  184. #if NO_DUMMY_VALUES
  185.         return NULL;
  186. #endif
  187.         long_ret = -1;
  188.         return ((u_char *) (&long_ret));
  189.     case IORECEIVE:
  190. #if NO_DUMMY_VALUES
  191.         return NULL;
  192. #endif
  193.         long_ret = -1;
  194.         return ((u_char *) (&long_ret));
  195.     case SYSINTERRUPTS:
  196.         long_ret = rate(mem_new.v_intr - mem_old.v_intr);
  197.         return ((u_char *) (&long_ret));
  198.     case SYSCONTEXT:
  199.         long_ret = rate(mem_new.v_swtch - mem_old.v_swtch);
  200.         return ((u_char *) (&long_ret));
  201.     case CPUUSER:
  202.         cpu_sum = cpu_diff[CP_USER] + cpu_diff[CP_NICE];
  203.         cpu_prc = (float) cpu_sum / (float) cpu_total;
  204.         long_ret = cpu_prc * CPU_PRC;
  205.         return ((u_char *) (&long_ret));
  206.     case CPUSYSTEM:
  207.         cpu_sum = cpu_diff[CP_SYS] + cpu_diff[CP_INTR];
  208.         cpu_prc = (float) cpu_sum / (float) cpu_total;
  209.         long_ret = cpu_prc * CPU_PRC;
  210.         return ((u_char *) (&long_ret));
  211.     case CPUIDLE:
  212.         cpu_sum = cpu_diff[CP_IDLE];
  213.         cpu_prc = (float) cpu_sum / (float) cpu_total;
  214.         long_ret = cpu_prc * CPU_PRC;
  215.         return ((u_char *) (&long_ret));
  216.     case CPURAWUSER:
  217.         long_ret = cpu_new[CP_USER];
  218.         return ((u_char *) (&long_ret));
  219.     case CPURAWNICE:
  220.         long_ret = cpu_new[CP_NICE];
  221.         return ((u_char *) (&long_ret));
  222.     case CPURAWSYSTEM:
  223.         long_ret = cpu_new[CP_SYS] + cpu_new[CP_INTR];
  224.         return ((u_char *) (&long_ret));
  225.     case CPURAWIDLE:
  226.         long_ret = cpu_new[CP_IDLE];
  227.         return ((u_char *) (&long_ret));
  228.     case CPURAWKERNEL:
  229.         long_ret = cpu_new[CP_SYS];
  230.         return ((u_char *) (&long_ret));
  231.     case CPURAWINTR:
  232.         long_ret = cpu_new[CP_INTR];
  233.         return ((u_char *) (&long_ret));
  234.         /*
  235.          * reserved for future use 
  236.          */
  237.         /*
  238.          * case ERRORFLAG:
  239.          * return((u_char *) (&long_ret));
  240.          * case ERRORMSG:
  241.          * return((u_char *) (&long_ret));
  242.          */
  243.     }
  244.     return NULL;
  245. }