summaryrefslogtreecommitdiff
path: root/agent/mibgroup/ucd-snmp/versioninfo.c
diff options
context:
space:
mode:
Diffstat (limited to 'agent/mibgroup/ucd-snmp/versioninfo.c')
-rw-r--r--agent/mibgroup/ucd-snmp/versioninfo.c219
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;
+}