aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJose Bollo <jose.bollo@iot.bzh>2019-12-03 00:12:31 +0100
committerJosé Bollo <jose.bollo@iot.bzh>2019-12-03 18:51:51 +0100
commit82a9d796219de863253b96340bb03c4506c8c676 (patch)
tree79fb62db3e532fefa58dd8e4fcacdf14a808668f
parent7a28ebbeb8af7bf37d46fc1158a203790f1ddcc7 (diff)
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
-rw-r--r--src/afb-args.c9
-rw-r--r--src/afb-hsrv.c2
-rw-r--r--src/main-afb-daemon.c43
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;
}