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