Blame agent/mibgroup/host/hr_proc.c

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
}