220 lines
6.4 KiB
C
220 lines
6.4 KiB
C
#include <net-snmp/net-snmp-config.h>
|
|
#include <net-snmp/net-snmp-features.h>
|
|
|
|
#include <sys/types.h>
|
|
#if TIME_WITH_SYS_TIME
|
|
# include <sys/time.h>
|
|
# include <time.h>
|
|
#else
|
|
# if HAVE_SYS_TIME_H
|
|
# include <sys/time.h>
|
|
# else
|
|
# include <time.h>
|
|
# endif
|
|
#endif
|
|
#if HAVE_NETINET_IN_H
|
|
#include <netinet/in.h>
|
|
#endif
|
|
#if HAVE_STRING_H
|
|
#include <string.h>
|
|
#endif
|
|
|
|
#include <net-snmp/net-snmp-includes.h>
|
|
#include <net-snmp/agent/net-snmp-agent-includes.h>
|
|
|
|
#include "struct.h"
|
|
#include "versioninfo.h"
|
|
#include "util_funcs/header_generic.h"
|
|
#include "util_funcs/restart.h"
|
|
#include "util_funcs.h" /* clear_cache */
|
|
|
|
netsnmp_feature_require(clear_cache)
|
|
|
|
|
|
void
|
|
init_versioninfo(void)
|
|
{
|
|
|
|
/*
|
|
* define the structure we're going to ask the agent to register our
|
|
* information at
|
|
*/
|
|
struct variable2 extensible_version_variables[] = {
|
|
{MIBINDEX, ASN_INTEGER, NETSNMP_OLDAPI_RONLY,
|
|
var_extensible_version, 1, {MIBINDEX}},
|
|
{VERTAG, ASN_OCTET_STR, NETSNMP_OLDAPI_RONLY,
|
|
var_extensible_version, 1, {VERTAG}},
|
|
{VERDATE, ASN_OCTET_STR, NETSNMP_OLDAPI_RONLY,
|
|
var_extensible_version, 1, {VERDATE}},
|
|
{VERCDATE, ASN_OCTET_STR, NETSNMP_OLDAPI_RONLY,
|
|
var_extensible_version, 1, {VERCDATE}},
|
|
{VERIDENT, ASN_OCTET_STR, NETSNMP_OLDAPI_RONLY,
|
|
var_extensible_version, 1, {VERIDENT}},
|
|
{VERCONFIG, ASN_OCTET_STR, NETSNMP_OLDAPI_RONLY,
|
|
var_extensible_version, 1, {VERCONFIG}},
|
|
{VERCLEARCACHE, ASN_INTEGER, NETSNMP_OLDAPI_RWRITE,
|
|
var_extensible_version, 1, {VERCLEARCACHE}},
|
|
{VERUPDATECONFIG, ASN_INTEGER, NETSNMP_OLDAPI_RWRITE,
|
|
var_extensible_version, 1, {VERUPDATECONFIG}},
|
|
{VERRESTARTAGENT, ASN_INTEGER, NETSNMP_OLDAPI_RWRITE,
|
|
var_extensible_version, 1, {VERRESTARTAGENT}},
|
|
{VERSAVEPERSISTENT, ASN_INTEGER, NETSNMP_OLDAPI_RWRITE,
|
|
var_extensible_version, 1, {VERSAVEPERSISTENT}},
|
|
{VERDEBUGGING, ASN_INTEGER, NETSNMP_OLDAPI_RWRITE,
|
|
var_extensible_version, 1, {VERDEBUGGING}}
|
|
};
|
|
|
|
/*
|
|
* Define the OID pointer to the top of the mib tree that we're
|
|
* registering underneath
|
|
*/
|
|
oid version_variables_oid[] =
|
|
{ NETSNMP_UCDAVIS_MIB, NETSNMP_VERSIONMIBNUM };
|
|
|
|
/*
|
|
* register ourselves with the agent to handle our mib tree
|
|
*/
|
|
REGISTER_MIB("ucd-snmp/versioninfo", extensible_version_variables,
|
|
variable2, version_variables_oid);
|
|
|
|
}
|
|
|
|
|
|
u_char *
|
|
var_extensible_version(struct variable *vp,
|
|
oid * name,
|
|
size_t * length,
|
|
int exact,
|
|
size_t * var_len, WriteMethod ** write_method)
|
|
{
|
|
|
|
static long long_ret;
|
|
static char errmsg[300];
|
|
char *cptr;
|
|
time_t curtime;
|
|
#ifdef NETSNMP_CONFIGURE_OPTIONS
|
|
static char config_opts[] = NETSNMP_CONFIGURE_OPTIONS;
|
|
#endif
|
|
|
|
DEBUGMSGTL(("ucd-snmp/versioninfo", "var_extensible_version: "));
|
|
DEBUGMSGOID(("ucd-snmp/versioninfo", name, *length));
|
|
DEBUGMSG(("ucd-snmp/versioninfo", " %d\n", exact));
|
|
|
|
if (header_generic(vp, name, length, exact, var_len, write_method))
|
|
return (NULL);
|
|
|
|
switch (vp->magic) {
|
|
case MIBINDEX:
|
|
long_ret = name[8];
|
|
return ((u_char *) (&long_ret));
|
|
case VERTAG:
|
|
strlcpy(errmsg, netsnmp_get_version(), sizeof(errmsg));
|
|
*var_len = strlen(errmsg);
|
|
return ((u_char *) errmsg);
|
|
case VERDATE:
|
|
strlcpy(errmsg, "$Date$", sizeof(errmsg));
|
|
*var_len = strlen(errmsg);
|
|
return ((u_char *) errmsg);
|
|
case VERCDATE:
|
|
curtime = time(NULL);
|
|
cptr = ctime(&curtime);
|
|
strlcpy(errmsg, cptr, sizeof(errmsg));
|
|
*var_len = strlen(errmsg) - 1; /* - 1 to strip trailing newline */
|
|
return ((u_char *) errmsg);
|
|
case VERIDENT:
|
|
strlcpy(errmsg, "$Id$", sizeof(errmsg));
|
|
*var_len = strlen(errmsg);
|
|
return ((u_char *) errmsg);
|
|
case VERCONFIG:
|
|
#ifdef NETSNMP_CONFIGURE_OPTIONS
|
|
*var_len = strlen(config_opts);
|
|
if (*var_len > 1024)
|
|
*var_len = 1024; /* mib imposed restriction */
|
|
return (u_char *) config_opts;
|
|
#else
|
|
strlcpy(errmsg, "", sizeof(errmsg));
|
|
*var_len = strlen(errmsg);
|
|
return ((u_char *) errmsg);
|
|
#endif
|
|
case VERCLEARCACHE:
|
|
*write_method = clear_cache;
|
|
long_ret = 0;
|
|
return ((u_char *) & long_ret);
|
|
case VERUPDATECONFIG:
|
|
*write_method = update_hook;
|
|
long_ret = 0;
|
|
return ((u_char *) & long_ret);
|
|
case VERRESTARTAGENT:
|
|
*write_method = restart_hook;
|
|
long_ret = 0;
|
|
return ((u_char *) & long_ret);
|
|
case VERSAVEPERSISTENT:
|
|
*write_method = save_persistent;
|
|
long_ret = 0;
|
|
return ((u_char *) & long_ret);
|
|
case VERDEBUGGING:
|
|
*write_method = debugging_hook;
|
|
long_ret = snmp_get_do_debugging();
|
|
return ((u_char *) & long_ret);
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
int
|
|
update_hook(int action,
|
|
u_char * var_val,
|
|
u_char var_val_type,
|
|
size_t var_val_len,
|
|
u_char * statP, oid * name, size_t name_len)
|
|
{
|
|
long tmp = 0;
|
|
|
|
if (var_val_type != ASN_INTEGER) {
|
|
snmp_log(LOG_ERR, "Wrong type != int\n");
|
|
return SNMP_ERR_WRONGTYPE;
|
|
}
|
|
tmp = *((long *) var_val);
|
|
if (tmp == 1 && action == COMMIT) {
|
|
update_config();
|
|
}
|
|
return SNMP_ERR_NOERROR;
|
|
}
|
|
|
|
int
|
|
debugging_hook(int action,
|
|
u_char * var_val,
|
|
u_char var_val_type,
|
|
size_t var_val_len,
|
|
u_char * statP, oid * name, size_t name_len)
|
|
{
|
|
long tmp = 0;
|
|
|
|
if (var_val_type != ASN_INTEGER) {
|
|
DEBUGMSGTL(("versioninfo", "Wrong type != int\n"));
|
|
return SNMP_ERR_WRONGTYPE;
|
|
}
|
|
tmp = *((long *) var_val);
|
|
if (action == COMMIT) {
|
|
snmp_set_do_debugging(tmp);
|
|
}
|
|
return SNMP_ERR_NOERROR;
|
|
}
|
|
|
|
int
|
|
save_persistent(int action,
|
|
u_char * var_val,
|
|
u_char var_val_type,
|
|
size_t var_val_len,
|
|
u_char * statP, oid * name, size_t name_len)
|
|
{
|
|
if (var_val_type != ASN_INTEGER) {
|
|
DEBUGMSGTL(("versioninfo", "Wrong type != int\n"));
|
|
return SNMP_ERR_WRONGTYPE;
|
|
}
|
|
if (action == COMMIT) {
|
|
snmp_store(netsnmp_ds_get_string(NETSNMP_DS_LIBRARY_ID,
|
|
NETSNMP_DS_LIB_APPTYPE));
|
|
}
|
|
return SNMP_ERR_NOERROR;
|
|
}
|