diff options
Diffstat (limited to 'agent/mibgroup/ucd-snmp/versioninfo.c')
-rw-r--r-- | agent/mibgroup/ucd-snmp/versioninfo.c | 219 |
1 files changed, 219 insertions, 0 deletions
diff --git a/agent/mibgroup/ucd-snmp/versioninfo.c b/agent/mibgroup/ucd-snmp/versioninfo.c new file mode 100644 index 0000000..f7a8c63 --- /dev/null +++ b/agent/mibgroup/ucd-snmp/versioninfo.c @@ -0,0 +1,219 @@ +#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; +} |