summaryrefslogtreecommitdiff
path: root/accel-pppd/extra/net-snmp
diff options
context:
space:
mode:
Diffstat (limited to 'accel-pppd/extra/net-snmp')
-rw-r--r--accel-pppd/extra/net-snmp/ACCEL-PPP-MIB.txt8
-rw-r--r--accel-pppd/extra/net-snmp/CMakeLists.txt1
-rw-r--r--accel-pppd/extra/net-snmp/agent.c2
-rw-r--r--accel-pppd/extra/net-snmp/exec_cli.c123
-rw-r--r--accel-pppd/extra/net-snmp/exec_cli.h12
5 files changed, 146 insertions, 0 deletions
diff --git a/accel-pppd/extra/net-snmp/ACCEL-PPP-MIB.txt b/accel-pppd/extra/net-snmp/ACCEL-PPP-MIB.txt
index 5af38e8..20f7f94 100644
--- a/accel-pppd/extra/net-snmp/ACCEL-PPP-MIB.txt
+++ b/accel-pppd/extra/net-snmp/ACCEL-PPP-MIB.txt
@@ -323,4 +323,12 @@ shutdown OBJECT-TYPE
"shutdown accel-ppp"
::= { accelPPPAdmin 2 }
+cli OBJECT-TYPE
+ SYNTAX OCTET STRING
+ MAX-ACCESS write-only
+ STATUS current
+ DESCRIPTION
+ "execute cli command"
+ ::= { accelPPPAdmin 3 }
+
END
diff --git a/accel-pppd/extra/net-snmp/CMakeLists.txt b/accel-pppd/extra/net-snmp/CMakeLists.txt
index bb0e6f7..b61c0d0 100644
--- a/accel-pppd/extra/net-snmp/CMakeLists.txt
+++ b/accel-pppd/extra/net-snmp/CMakeLists.txt
@@ -12,6 +12,7 @@ SET(sources
statPPTP.c
terminate.c
shutdown.c
+ exec_cli.c
)
ADD_LIBRARY(net-snmp SHARED ${sources})
diff --git a/accel-pppd/extra/net-snmp/agent.c b/accel-pppd/extra/net-snmp/agent.c
index dd38b44..878cd9a 100644
--- a/accel-pppd/extra/net-snmp/agent.c
+++ b/accel-pppd/extra/net-snmp/agent.c
@@ -16,6 +16,7 @@
#include "terminate.h"
#include "shutdown.h"
#include "sessionTable.h"
+#include "exec_cli.h"
static const char *conf_agent_name = "accel-ppp";
static int conf_master = 0;
@@ -96,6 +97,7 @@ static void *snmp_thread(void *a)
init_terminate();
init_shutdown();
init_sessionTable();
+ init_cli();
init_snmp(conf_agent_name);
diff --git a/accel-pppd/extra/net-snmp/exec_cli.c b/accel-pppd/extra/net-snmp/exec_cli.c
new file mode 100644
index 0000000..63a8958
--- /dev/null
+++ b/accel-pppd/extra/net-snmp/exec_cli.c
@@ -0,0 +1,123 @@
+/*
+ * Note: this file originally auto-generated by mib2c using
+ * : mib2c.scalar.conf 11805 2005-01-07 09:37:18Z dts12 $
+ */
+
+#include <net-snmp/net-snmp-config.h>
+#include <net-snmp/net-snmp-includes.h>
+#include <net-snmp/agent/net-snmp-agent-includes.h>
+#include "exec_cli.h"
+#include "cli_p.h"
+
+#include "memdebug.h"
+
+static void no_disconnect(struct cli_client_t *tcln)
+{
+}
+
+static int no_send(struct cli_client_t *tcln, const void *_buf, int size)
+{
+ return 0;
+}
+
+static int no_sendv(struct cli_client_t *tcln, const char *fmt, va_list ap)
+{
+ return 0;
+}
+
+static void set_action(const char *cmd, size_t len)
+{
+ struct cli_client_t cc = {
+ .cmdline = _malloc(len + 1),
+ .send = no_send,
+ .sendv = no_sendv,
+ .disconnect = no_disconnect,
+ };
+
+ memcpy(cc.cmdline, cmd, len);
+ cc.cmdline[len] = 0;
+
+ cli_process_cmd(&cc);
+
+ _free(cc.cmdline);
+}
+
+/** Initializes the cli module */
+void
+init_cli(void)
+{
+ static oid cli_oid[] = { 1,3,6,1,4,1,8072,100,3,3 };
+
+ DEBUGMSGTL(("cli", "Initializing\n"));
+
+ netsnmp_register_scalar(
+ netsnmp_create_handler_registration("cli", handle_cli,
+ cli_oid, OID_LENGTH(cli_oid),
+ HANDLER_CAN_RWRITE
+ ));
+}
+
+int
+handle_cli(netsnmp_mib_handler *handler,
+ netsnmp_handler_registration *reginfo,
+ netsnmp_agent_request_info *reqinfo,
+ netsnmp_request_info *requests)
+{
+ int ret;
+ /* We are never called for a GETNEXT if it's registered as a
+ "instance", as it's "magically" handled for us. */
+
+ /* a instance handler also only hands us one request at a time, so
+ we don't need to loop over a list of requests; we'll only get one. */
+
+ switch(reqinfo->mode) {
+
+ case MODE_GET:
+ netsnmp_set_request_error(reqinfo, requests, SNMP_NOSUCHINSTANCE );
+ break;
+
+ /*
+ * SET REQUEST
+ *
+ * multiple states in the transaction. See:
+ * http://www.net-snmp.org/tutorial-5/toolkit/mib_module/set-actions.jpg
+ */
+ case MODE_SET_RESERVE1:
+ /* or you could use netsnmp_check_vb_type_and_size instead */
+ ret = netsnmp_check_vb_type(requests->requestvb, ASN_OCTET_STR);
+ if ( ret != SNMP_ERR_NOERROR ) {
+ netsnmp_set_request_error(reqinfo, requests, ret );
+ }
+ break;
+
+ case MODE_SET_RESERVE2:
+ /* XXX malloc "undo" storage buffer */
+ break;
+
+ case MODE_SET_FREE:
+ /* XXX: free resources allocated in RESERVE1 and/or
+ RESERVE2. Something failed somewhere, and the states
+ below won't be called. */
+ break;
+
+ case MODE_SET_ACTION:
+ /* XXX: perform the value change here */
+ set_action((char *)requests->requestvb->val.string, requests->requestvb->val_len);
+ break;
+
+ case MODE_SET_COMMIT:
+ /* XXX: delete temporary storage */
+ break;
+
+ case MODE_SET_UNDO:
+ /* XXX: UNDO and return to previous value for the object */
+ break;
+
+ default:
+ /* we should never get here, so this is a really bad error */
+ snmp_log(LOG_ERR, "unknown mode (%d) in handle_cli\n", reqinfo->mode );
+ return SNMP_ERR_GENERR;
+ }
+
+ return SNMP_ERR_NOERROR;
+}
diff --git a/accel-pppd/extra/net-snmp/exec_cli.h b/accel-pppd/extra/net-snmp/exec_cli.h
new file mode 100644
index 0000000..78bcd50
--- /dev/null
+++ b/accel-pppd/extra/net-snmp/exec_cli.h
@@ -0,0 +1,12 @@
+/*
+ * Note: this file originally auto-generated by mib2c using
+ * : mib2c.scalar.conf 11805 2005-01-07 09:37:18Z dts12 $
+ */
+#ifndef CLI_H
+#define CLI_H
+
+/* function declarations */
+void init_cli(void);
+Netsnmp_Node_Handler handle_cli;
+
+#endif /* CLI_H */