summaryrefslogtreecommitdiff
path: root/agent/mibgroup/host/hr_proc.c
diff options
context:
space:
mode:
Diffstat (limited to 'agent/mibgroup/host/hr_proc.c')
-rw-r--r--agent/mibgroup/host/hr_proc.c233
1 files changed, 233 insertions, 0 deletions
diff --git a/agent/mibgroup/host/hr_proc.c b/agent/mibgroup/host/hr_proc.c
new file mode 100644
index 0000000..6f93079
--- /dev/null
+++ b/agent/mibgroup/host/hr_proc.c
@@ -0,0 +1,233 @@
+/*
+ * Host Resources MIB - proc processor group implementation - hr_proc.c
+ *
+ */
+
+#include <net-snmp/net-snmp-config.h>
+#include <net-snmp/net-snmp-includes.h>
+#include <net-snmp/agent/net-snmp-agent-includes.h>
+#if HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+#if HAVE_STRING_H
+#include <string.h>
+#else
+#include <strings.h>
+#endif
+#include <ctype.h>
+
+#include "host_res.h"
+#include "hr_proc.h"
+#include <net-snmp/agent/auto_nlist.h>
+#include <net-snmp/agent/agent_read_config.h>
+#include <net-snmp/agent/hardware/cpu.h>
+#include "ucd-snmp/loadave.h"
+
+#define HRPROC_MONOTONICALLY_INCREASING
+
+ /*********************
+ *
+ * Kernel & interface information,
+ * and internal forward declarations
+ *
+ *********************/
+
+extern void Init_HR_Proc(void);
+extern int Get_Next_HR_Proc(void);
+const char *describe_proc(int);
+int proc_status(int);
+int header_hrproc(struct variable *, oid *, size_t *, int,
+ size_t *, WriteMethod **);
+
+
+ /*********************
+ *
+ * Initialisation & common implementation functions
+ *
+ *********************/
+netsnmp_cpu_info *HRP_cpu;
+
+#define HRPROC_ID 1
+#define HRPROC_LOAD 2
+
+struct variable4 hrproc_variables[] = {
+ {HRPROC_ID, ASN_OBJECT_ID, NETSNMP_OLDAPI_RONLY,
+ var_hrproc, 2, {1, 1}},
+ {HRPROC_LOAD, ASN_INTEGER, NETSNMP_OLDAPI_RONLY,
+ var_hrproc, 2, {1, 2}}
+};
+oid hrproc_variables_oid[] = { 1, 3, 6, 1, 2, 1, 25, 3, 3 };
+
+
+void
+init_hr_proc(void)
+{
+ init_device[HRDEV_PROC] = Init_HR_Proc;
+ next_device[HRDEV_PROC] = Get_Next_HR_Proc;
+ device_descr[HRDEV_PROC] = describe_proc;
+ device_status[HRDEV_PROC] = proc_status;
+#ifdef HRPROC_MONOTONICALLY_INCREASING
+ dev_idx_inc[HRDEV_PROC] = 1;
+#endif
+
+ REGISTER_MIB("host/hr_proc", hrproc_variables, variable4,
+ hrproc_variables_oid);
+}
+
+/*
+ * header_hrproc(...
+ * Arguments:
+ * vp IN - pointer to variable entry that points here
+ * name IN/OUT - IN/name requested, OUT/name found
+ * length IN/OUT - length of IN/OUT oid's
+ * exact IN - TRUE if an exact match was requested
+ * var_len OUT - length of variable or 0 if function returned
+ * write_method
+ *
+ */
+
+int
+header_hrproc(struct variable *vp,
+ oid * name,
+ size_t * length,
+ int exact, size_t * var_len, WriteMethod ** write_method)
+{
+#define HRPROC_ENTRY_NAME_LENGTH 11
+ oid newname[MAX_OID_LEN];
+ int proc_idx, LowIndex = -1;
+ int result;
+
+ DEBUGMSGTL(("host/hr_proc", "var_hrproc: "));
+ DEBUGMSGOID(("host/hr_proc", name, *length));
+ DEBUGMSG(("host/hr_proc", " %d\n", exact));
+
+ memcpy((char *) newname, (char *) vp->name, vp->namelen * sizeof(oid));
+ /*
+ * Find "next" proc entry
+ */
+
+ Init_HR_Proc();
+ for (;;) {
+ proc_idx = Get_Next_HR_Proc();
+ if (proc_idx == -1)
+ break;
+ newname[HRPROC_ENTRY_NAME_LENGTH] = proc_idx;
+ result = snmp_oid_compare(name, *length, newname, vp->namelen + 1);
+ if (exact && (result == 0)) {
+ LowIndex = proc_idx;
+ /*
+ * Save processor status information
+ */
+ break;
+ }
+ if ((!exact && (result < 0)) &&
+ (LowIndex == -1 || proc_idx < LowIndex)) {
+ LowIndex = proc_idx;
+ /*
+ * Save processor status information
+ */
+#ifdef HRPROC_MONOTONICALLY_INCREASING
+ break;
+#endif
+ }
+ }
+
+ if (LowIndex == -1) {
+ DEBUGMSGTL(("host/hr_proc", "... index out of range\n"));
+ return (MATCH_FAILED);
+ }
+
+ memcpy((char *) name, (char *) newname,
+ (vp->namelen + 1) * sizeof(oid));
+ *length = vp->namelen + 1;
+ *write_method = (WriteMethod*)0;
+ *var_len = sizeof(long); /* default to 'long' results */
+
+ DEBUGMSGTL(("host/hr_proc", "... get proc stats "));
+ DEBUGMSGOID(("host/hr_proc", name, *length));
+ DEBUGMSG(("host/hr_proc", "\n"));
+ return LowIndex;
+}
+
+
+ /*********************
+ *
+ * System specific implementation functions
+ *
+ *********************/
+
+
+u_char *
+var_hrproc(struct variable * vp,
+ oid * name,
+ size_t * length,
+ int exact, size_t * var_len, WriteMethod ** write_method)
+{
+ int proc_idx;
+ unsigned long long value;
+ netsnmp_cpu_info *cpu;
+
+ proc_idx =
+ header_hrproc(vp, name, length, exact, var_len, write_method);
+ if (proc_idx == MATCH_FAILED)
+ return NULL;
+
+ switch (vp->magic) {
+ case HRPROC_ID:
+ *var_len = nullOidLen;
+ return (u_char *) nullOid;
+ case HRPROC_LOAD:
+ cpu = netsnmp_cpu_get_byIdx( proc_idx & HRDEV_TYPE_MASK, 0 );
+ if ( !cpu || !cpu->history || !cpu->history[0].total_hist ||
+ ( cpu->history[0].total_hist == cpu->total_ticks ))
+ return NULL;
+
+ value = (cpu->idle_ticks - cpu->history[0].idle_hist)*100;
+ value /= (cpu->total_ticks - cpu->history[0].total_hist);
+ long_return = 100 - value;
+ if (long_return < 0)
+ long_return = 0;
+ return (u_char *) & long_return;
+ default:
+ DEBUGMSGTL(("host/hr_proc", "unknown sub-id %d in var_hrproc\n",
+ vp->magic));
+ }
+ return NULL;
+}
+
+
+ /*********************
+ *
+ * Internal implementation functions
+ *
+ *********************/
+
+void
+Init_HR_Proc(void)
+{
+ HRP_cpu = netsnmp_cpu_get_first(); /* 'Overall' entry */
+}
+
+int
+Get_Next_HR_Proc(void)
+{
+ HRP_cpu = netsnmp_cpu_get_next( HRP_cpu );
+ if ( HRP_cpu )
+ return (HRDEV_PROC << HRDEV_TYPE_SHIFT) + HRP_cpu->idx;
+ else
+ return -1;
+}
+
+const char *
+describe_proc(int idx)
+{
+ netsnmp_cpu_info *cpu = netsnmp_cpu_get_byIdx( idx & HRDEV_TYPE_MASK, 0 );
+ return (cpu ? cpu->descr : NULL );
+}
+
+int
+proc_status(int idx)
+{
+ netsnmp_cpu_info *cpu = netsnmp_cpu_get_byIdx( idx & HRDEV_TYPE_MASK, 0 );
+ return (cpu ? cpu->status : 0 );
+}