supervisor: Make it a HTTP server
[src/app-framework-binder.git] / src / afb-supervision.c
index a7099a4..9759524 100644 (file)
 #include "afb-xreq.h"
 #include "afb-trace.h"
 #include "afb-session.h"
+#include "afb-config.h"
 #include "afb-supervision.h"
 #include "afs-supervision.h"
 #include "afb-stub-ws.h"
 #include "afb-debug.h"
+#include "afb-fdev.h"
 #include "verbose.h"
 #include "wrap-json.h"
+#include "jobs.h"
+
+extern struct afb_config *main_config;
 
 /* api and apiset name */
 static const char supervision_apiname[] = AFS_SURPERVISION_APINAME;
+static const char supervisor_apiname[] = AFS_SURPERVISOR_APINAME;
 
 /* path of the supervision socket */
 static const char supervisor_socket_path[] = AFS_SURPERVISION_SOCKET;
@@ -108,20 +114,24 @@ static int open_supervisor_socket(const char *path)
        return fd;
 }
 
-static void cleanup_supervisor(void *nada)
+static void disconnect_supervisor()
 {
-       struct afb_trace *t = __atomic_exchange_n(&trace, NULL, __ATOMIC_RELAXED);
+       struct afb_stub_ws *s;
+       struct afb_trace *t;
+
+       INFO("Disconnecting supervision");
+       s = __atomic_exchange_n(&supervisor, NULL, __ATOMIC_RELAXED);
+       t = __atomic_exchange_n(&trace, NULL, __ATOMIC_RELAXED);
+       if (s)
+               afb_stub_ws_unref(s);
        if (t)
                afb_trace_unref(t);
-       supervisor = NULL;
 }
 
-static void disconnect_supervisor()
+static void on_supervisor_hangup(struct afb_stub_ws *s)
 {
-       struct afb_stub_ws *s = __atomic_exchange_n(&supervisor, NULL, __ATOMIC_RELAXED);
-
-       if (s)
-               afb_stub_ws_unref(s);
+       if (s && s == supervisor)
+               disconnect_supervisor();
 }
 
 /* try to connect to supervisor */
@@ -130,6 +140,7 @@ static void try_connect_supervisor()
        int fd;
        ssize_t srd;
        struct afs_supervision_initiator initiator;
+       struct fdev *fdev;
 
        /* get the mutex */
        pthread_mutex_lock(&mutex);
@@ -187,11 +198,17 @@ static void try_connect_supervisor()
        }
 
        /* make the supervisor link */
-       supervisor = afb_stub_ws_create_server(fd, supervision_apiname, supervision_apiset);
+       fdev = afb_fdev_create(fd);
+       if (!fdev) {
+               ERROR("Creation of fdev failed: %m");
+               goto end2;
+       }
+       supervisor = afb_stub_ws_create_server(fdev, supervision_apiname, supervision_apiset);
        if (!supervisor) {
                ERROR("Creation of supervisor failed: %m");
-               goto end2;
+               goto end;
        }
+       afb_stub_ws_on_hangup(supervisor, on_supervisor_hangup);
 
        /* successful termination */
        goto end;
@@ -202,11 +219,18 @@ end:
        pthread_mutex_unlock(&mutex);
 }
 
-static void on_sighup(int signum)
+static void try_connect_supervisor_job(int signum, void *args)
 {
+       INFO("Try to connect supervisor after SIGHUP");
        try_connect_supervisor();
 }
 
+static void on_sighup(int signum)
+{
+       INFO("Supervision received a SIGHUP");
+       jobs_queue(NULL, 0, try_connect_supervisor_job, NULL);
+}
+
 /**
  * initalize the supervision
  */
@@ -265,9 +289,8 @@ static void slist(void *closure, struct afb_session *session)
 ******************************************************************************/
 
 static const char *verbs[] = {
-       "break", "do", "exit", "sclose", "slist", "trace", "wait" };
-enum  {  Break ,  Do ,  Exit ,  Sclose ,  Slist ,  Trace ,  Wait  };
-
+       "break", "config", "do", "exit", "sclose", "slist", "trace", "wait" };
+enum  {  Break ,  Config ,  Do ,  Exit ,  Sclose ,  Slist ,  Trace ,  Wait  };
 
 static void on_supervision_call(void *closure, struct afb_xreq *xreq)
 {
@@ -319,11 +342,15 @@ static void on_supervision_call(void *closure, struct afb_xreq *xreq)
                afb_session_foreach(slist, list);
                afb_xreq_success(xreq, list, NULL);
                break;
+       case Config:
+               afb_xreq_success(xreq, afb_config_json(main_config), NULL);
+               break;
        case Trace:
                if (!trace)
-                       trace = afb_trace_create(supervision_apiname, NULL /* not bound to any session */);
+                       trace = afb_trace_create(supervisor_apiname, NULL /* not bound to any session */);
 
-               req = afb_xreq_unstore((struct afb_stored_req*)xreq);
+               req = xreq_to_req(xreq);
+               add = drop = NULL;
                wrap_json_unpack(args, "{s?o s?o}", "add", &add, "drop", &drop);
                if (add) {
                        rc = afb_trace_add(req, add, trace);