main-afb-daemon: manage listening interfaces 69/23169/1 8.99.2 8.99.3 icefish/8.99.2 icefish/8.99.3 icefish_8.99.2 icefish_8.99.3
authorJose Bollo <jose.bollo@iot.bzh>
Mon, 2 Dec 2019 23:12:31 +0000 (00:12 +0100)
committerJosé Bollo <jose.bollo@iot.bzh>
Tue, 3 Dec 2019 17:51:51 +0000 (18:51 +0100)
This change allows to specify interfaces to serve
explicitely.

By default the option --port=PORT lead to serving
interface of specification "tcp:*:PORT". Meaning
that all interfaces are listened.

This is intended to be used with localuser family
of hostnames.

Bug-AGL: SPEC-2968

Signed-off-by: José Bollo <jose.bollo@iot.bzh>
Change-Id: I3fb2a77a5c03dd4c2118ebe3267794f79bfc0262

src/afb-args.c
src/afb-hsrv.c
src/main-afb-daemon.c

index 50bdc97..9d15608 100644 (file)
 #define SET_DAEMON         'D'
 #define SET_EXEC           'e'
 #define GET_HELP           'h'
+#define ADD_INTERFACE      'i'
 #define SET_LOG            'l'
 #if defined(WITH_MONITORING_OPTION)
 #define SET_MONITORING     'M'
@@ -158,7 +159,8 @@ static struct option_desc optdefs[] = {
 
        {SET_NAME,            1, "name",        "Set the visible name"},
 
-       {SET_PORT,            1, "port",        "HTTP listening TCP port  [default " d2s(DEFAULT_HTTP_PORT) "]"},
+       {SET_PORT,            1, "port",        "HTTP listening TCP port of all interfaces [default " d2s(DEFAULT_HTTP_PORT) "]"},
+       {ADD_INTERFACE,       1, "interface",   "Add HTTP listening interface (ex: tcp:localhost:8080)"},
        {SET_ROOT_HTTP,       1, "roothttp",    "HTTP Root Directory [default no root http (files not served but apis still available)]"},
        {SET_ROOT_BASE,       1, "rootbase",    "Angular Base Root URL [default /opa]"},
        {SET_ROOT_API,        1, "rootapi",     "HTML Root API URL [default /api]"},
@@ -241,7 +243,6 @@ static const struct {
        int optid;
        int valdef;
 } default_optint_values[] = {
-       { SET_PORT,             DEFAULT_HTTP_PORT },
        { SET_API_TIMEOUT,      DEFAULT_API_TIMEOUT },
        { SET_CACHE_TIMEOUT,    DEFAULT_CACHE_TIMEOUT },
        { SET_SESSION_TIMEOUT,  DEFAULT_SESSION_TIMEOUT },
@@ -841,6 +842,7 @@ static void parse_arguments_inner(int argc, char **argv, struct json_object *con
                case ADD_WS_CLIENT:
                case ADD_WS_SERVICE:
                case ADD_AUTO_API:
+               case ADD_INTERFACE:
                        config_add_optstr(config, optid);
                        break;
 
@@ -985,6 +987,9 @@ static void fulfill_config(struct json_object *config)
                if (!config_has(config, default_optstr_values[i].optid))
                        config_set_str(config, default_optstr_values[i].optid, default_optstr_values[i].valdef);
 
+       if (!config_has(config, SET_PORT) && !config_has(config, ADD_INTERFACE) && !config_has_bool(config, SET_NO_HTTPD))
+               config_set_int(config, SET_PORT, DEFAULT_HTTP_PORT);
+
        // default AUTH_TOKEN
        if (config_has_bool(config, SET_RANDOM_TOKEN))
                config_del(config, SET_TOKEN);
index 3f11047..3795b7b 100644 (file)
@@ -533,7 +533,7 @@ static int hsrv_itf_connect(struct hsrv_itf *itf)
        char hbuf[NI_MAXHOST], sbuf[NI_MAXSERV];
        int rgni;
 
-       itf->fdev = afb_socket_open_fdev(itf->uri, 1);
+       itf->fdev = afb_socket_open_fdev_scheme(itf->uri, 1, "tcp");
        if (!itf->fdev) {
                ERROR("can't create socket %s", itf->uri);
                return 0;
index f9c4ed4..31bf4f7 100644 (file)
@@ -340,14 +340,25 @@ static int init_http_server(struct afb_hsrv *hsrv)
        return 1;
 }
 
+static int add_interface(void *closure, const char *value)
+{
+       struct afb_hsrv *hsrv = closure;
+       int rc;
+
+       rc = afb_hsrv_add_interface(hsrv, value);
+       return rc > 0;
+}
+
 static struct afb_hsrv *start_http_server()
 {
        int rc;
-       const char *uploaddir, *rootdir;
+       const char *uploaddir, *rootdir, *errs;
        struct afb_hsrv *hsrv;
        int cache_timeout, http_port;
+       struct json_object *junk;
 
-       rc = wrap_json_unpack(main_config, "{ss ss si si}",
+       http_port = -1;
+       rc = wrap_json_unpack(main_config, "{ss ss si s?i}",
                                "uploaddir", &uploaddir,
                                "rootdir", &rootdir,
                                "cache-eol", &cache_timeout,
@@ -364,6 +375,7 @@ static struct afb_hsrv *start_http_server()
                        ERROR("unable to fallback to upload directory %s", fallback_uploaddir);
                        return NULL;
                }
+               uploaddir = fallback_uploaddir;
        }
 
        hsrv = afb_hsrv_create();
@@ -379,9 +391,6 @@ static struct afb_hsrv *start_http_server()
                return NULL;
        }
 
-       NOTICE("Waiting port=%d rootdir=%s", http_port, rootdir);
-       NOTICE("Browser URL= http://localhost:%d", http_port);
-
        rc = afb_hsrv_start(hsrv, 15);
        if (!rc) {
                ERROR("starting of httpd failed");
@@ -389,9 +398,27 @@ static struct afb_hsrv *start_http_server()
                return NULL;
        }
 
-       rc = afb_hsrv_add_interface_tcp(hsrv, DEFAULT_BINDER_INTERFACE, (uint16_t) http_port);
-       if (!rc) {
-               ERROR("setting interface failed");
+       NOTICE("Serving rootdir=%s uploaddir=%s", rootdir, uploaddir);
+
+       /* check if port is set */
+       if (http_port < 0) {
+               /* not set, check existing interfaces */
+               if (!json_object_object_get_ex(main_config, "interface", &junk)) {
+                       ERROR("No port and no interface ");
+               }
+       } else {
+               rc = afb_hsrv_add_interface_tcp(hsrv, DEFAULT_BINDER_INTERFACE, (uint16_t) http_port);
+               if (!rc) {
+                       ERROR("setting interface failed");
+                       afb_hsrv_put(hsrv);
+                       return NULL;
+               }
+               NOTICE("Browser URL= http://localhost:%d", http_port);
+       }
+
+       errs = run_for_config_array_opt("interface", add_interface, hsrv);
+       if (errs) {
+               ERROR("setting interface %s failed", errs);
                afb_hsrv_put(hsrv);
                return NULL;
        }