From 82a9d796219de863253b96340bb03c4506c8c676 Mon Sep 17 00:00:00 2001 From: Jose Bollo Date: Tue, 3 Dec 2019 00:12:31 +0100 Subject: main-afb-daemon: manage listening interfaces MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Change-Id: I3fb2a77a5c03dd4c2118ebe3267794f79bfc0262 --- src/afb-args.c | 9 +++++++-- src/afb-hsrv.c | 2 +- src/main-afb-daemon.c | 43 +++++++++++++++++++++++++++++++++++-------- 3 files changed, 43 insertions(+), 11 deletions(-) diff --git a/src/afb-args.c b/src/afb-args.c index 50bdc979..9d156088 100644 --- a/src/afb-args.c +++ b/src/afb-args.c @@ -119,6 +119,7 @@ #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); diff --git a/src/afb-hsrv.c b/src/afb-hsrv.c index 3f11047e..3795b7b2 100644 --- a/src/afb-hsrv.c +++ b/src/afb-hsrv.c @@ -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; diff --git a/src/main-afb-daemon.c b/src/main-afb-daemon.c index f9c4ed4e..31bf4f76 100644 --- a/src/main-afb-daemon.c +++ b/src/main-afb-daemon.c @@ -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; } -- cgit 1.2.3-korg