#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;
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 */
int fd;
ssize_t srd;
struct afs_supervision_initiator initiator;
+ struct fdev *fdev;
/* get the mutex */
pthread_mutex_lock(&mutex);
}
/* 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;
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
*/
******************************************************************************/
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)
{
i = 0;
if (wrap_json_unpack(args, "i", &i))
wrap_json_unpack(args, "{si}", "code", &i);
- ERROR("existing from supervision with code %d -> %d", i, i & 127);
+ ERROR("exiting from supervision with code %d -> %d", i, i & 127);
exit(i & 127);
break;
case Sclose:
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);