Browse Source

Initial commit

Baptiste Jonglez 7 years ago
commit
9f834e69f3
6 changed files with 115 additions and 0 deletions
  1. 14 0
      Makefile
  2. 22 0
      src/lease_select.cc
  3. 21 0
      src/pkt_receive.cc
  4. 49 0
      src/runscript.cc
  5. 2 0
      src/runscript.h
  6. 7 0
      src/version.cc

+ 14 - 0
Makefile

@@ -0,0 +1,14 @@
+
+OBJECTS = src/runscript.cc src/pkt_receive.o src/lease_select.o src/version.o
+CXXFLAGS = -I /usr/include/kea -fPIC -Wno-deprecated
+LDFLAGS = -L /usr/lib/kea/lib -shared -lkea-dhcpsrv -lkea-dhcp++ -lkea-hooks -lkea-log -lkea-util -lkea-exceptions
+
+kea-hook-runscript.so: $(OBJECTS)
+	g++ -o $@ $(CXXFLAGS) $(LDFLAGS) $(OBJECTS)
+
+%.o: %.cc
+	g++ -c $(CXXFLAGS) -o $@ $<
+
+clean:
+	rm -f src/*.o
+	rm -f kea-auth-radius.so

+ 22 - 0
src/lease_select.cc

@@ -0,0 +1,22 @@
+#include <hooks/hooks.h>
+#include <dhcp/pkt4.h>
+#include <dhcp/dhcp6.h>
+#include <dhcp/pkt6.h>
+#include <dhcpsrv/lease.h>
+
+#include "runscript.h"
+
+using namespace isc::dhcp;
+using namespace isc::hooks;
+
+extern "C" {
+
+int lease4_select(CalloutHandle& handle) {
+    int ret;
+    char *env[] = { "HOME=/usr/home", "FOO=bar", (char *)NULL };
+    ret = run_script("/tmp/test.sh", "lease4_select", env);
+    fprintf(stderr, "ret = %d\n", ret);
+    return 0;
+}
+
+} // end extern "C"

+ 21 - 0
src/pkt_receive.cc

@@ -0,0 +1,21 @@
+#include <hooks/hooks.h>
+#include <dhcp/pkt4.h>
+#include <dhcp/dhcp6.h>
+#include <dhcp/pkt6.h>
+
+#include "runscript.h"
+
+using namespace isc::dhcp;
+using namespace isc::hooks;
+
+extern "C" {
+
+int pkt4_receive(CalloutHandle& handle) {
+    int ret;
+    char *env[] = { "HOME=/usr/home", "FOO=bar", (char *)NULL };
+    ret = run_script("/tmp/test.sh", "pkt4_receive", env);
+    fprintf(stderr, "ret = %d\n", ret);
+    return 0;
+}
+
+} // end extern "C"

+ 49 - 0
src/runscript.cc

@@ -0,0 +1,49 @@
+#include <unistd.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <string.h>
+// TODO: Not nescessary
+#include <stdio.h>
+
+/* Runs the given script with the given argument and environment
+ * variables.  Returns -1 upon failure, or the exit code of the script
+ * upon success. */
+int run_script(char *scriptpath, const char *arg0, char *const *envp)
+{
+    int ret, wstatus, exitcode;
+    pid_t pid;
+    pid = fork();
+    if (pid == -1) {
+        // TODO: logging, errno is usable
+        fprintf(stderr, "Error during fork()\n");
+        return -1;
+    }
+    if (pid == 0) {
+        /* Child process */
+        char *scriptname = strrchr(scriptpath, '/');
+        if (scriptname == NULL) {
+            scriptname = scriptpath + strlen(scriptpath);
+        }
+        ret = execle(scriptpath, scriptname, arg0, (char *)NULL, envp);
+        // TODO: logging, errno is usable
+        fprintf(stderr, "Error during execle() in child\n");
+        exit(EXIT_FAILURE);
+    } else {
+        /* Parent process */
+        fprintf(stderr, "Waiting for script to return...\n");
+        ret = wait(&wstatus);
+        if (ret == -1) {
+            // TODO: logging, errno is usable
+            fprintf(stderr, "waitpid() failure\n");
+            return -1;
+        }
+        /* Get exit code */
+        if (WIFEXITED(wstatus))
+            exitcode = WEXITSTATUS(wstatus);
+        else
+            /* By default, assume everything worked well */
+            exitcode = 0;
+        return exitcode;
+    }
+}

+ 2 - 0
src/runscript.h

@@ -0,0 +1,2 @@
+
+int run_script(char *scriptpath, const char *arg0, char *const *envp);

+ 7 - 0
src/version.cc

@@ -0,0 +1,7 @@
+// version.cc
+#include <hooks/hooks.h>
+extern "C" {
+int version() {
+    return (KEA_HOOKS_VERSION);
+}
+}