net-snmp/agent/mibgroup/ucd-snmp/versioninfo.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;
}