afm-unit: Fix http port multi allocation 93/18993/1
authorJosé Bollo <jose.bollo@iot.bzh>
Tue, 18 Dec 2018 09:58:25 +0000 (10:58 +0100)
committerJosé Bollo <jose.bollo@iot.bzh>
Tue, 18 Dec 2018 10:04:53 +0000 (11:04 +0100)
When serveral targets were set in the widget file, the
framework allocated the same HTTP port to each. This
lead to impossibility to run all targets or to a
systemd conflict.

This should fix the issue by allocating an HTTP port for
each target installed by the widget. To achieves that goal,
the afm-unit.conf tag for the port is moved from
'#metadata.http-port' to '#metatarget.http-port'.

Bug-AGL: SPEC-2068

Change-Id: I5376d6f052e0ffc5c77cc80041528637777aed1e
Signed-off-by: José Bollo <jose.bollo@iot.bzh>
conf/unit/afm-unit-debug.conf.in
conf/unit/afm-unit.conf.in
conf/unit/generate-unit-conf/binder.inc
src/tests/test-unit/test-unit.c
src/wgtpkg-install.c
src/wgtpkg-mustach.c
src/wgtpkg-unit.c
src/wgtpkg-unit.h

index 582e723..49eb826 100644 (file)
@@ -167,7 +167,7 @@ StandardError=journal
 ;----   text/html  application/vnd.agl.native  application/vnd.agl.service    ----
 ;---------------------------------------------------------------------------------
 {{#content.type=text/html|application/vnd.agl.native|application/vnd.agl.service}}
-X-AFM-http-port={{:#metadata.http-port}}
+X-AFM-http-port={{:#metatarget.http-port}}
 Type=notify
 ExecStart=/usr/bin/afb-daemon \
        --name afbd-{{idaver}}{{^#target=main}}@{{:#target}}{{/#target=main}} \
@@ -176,7 +176,7 @@ ExecStart=/usr/bin/afb-daemon \
        --verbose \
        --verbose \
        --monitoring \
-       --port={{:#metadata.http-port}} \
+       --port={{:#metatarget.http-port}} \
        --token=HELLO \
        --roothttp={{#content.type=application/vnd.agl.service}}.{{/content.type=application/vnd.agl.service}}{{^content.type=application/vnd.agl.service}}{{#required-permission.urn:AGL:permission::public:no-htdocs}}.{{/required-permission.urn:AGL:permission::public:no-htdocs}}{{^required-permission.urn:AGL:permission::public:no-htdocs}}htdocs{{/required-permission.urn:AGL:permission::public:no-htdocs}}{{/content.type=application/vnd.agl.service}} \
        {{#required-permission.urn:AGL:permission::public:applications:read}}--alias=/icons:{{:#metadata.icons-dir}}{{/required-permission.urn:AGL:permission::public:applications:read}} \
index 7c7d36a..50fd957 100644 (file)
@@ -166,7 +166,7 @@ StandardError=journal
 ;---------------------------------------------------------------------------------
 {{#content.type=text/html|application/vnd.agl.native|application/vnd.agl.service}}
 {{^content.type=application/vnd.agl.service}}
-X-AFM--http-port={{:#metadata.http-port}}
+X-AFM--http-port={{:#metatarget.http-port}}
 {{/content.type=application/vnd.agl.service}}
 Type=notify
 ExecStart=/usr/bin/afb-daemon \
@@ -176,7 +176,7 @@ ExecStart=/usr/bin/afb-daemon \
        {{#content.type=application/vnd.agl.service}} \
                --no-httpd \
        {{/content.type=application/vnd.agl.service}}{{^content.type=application/vnd.agl.service}} \
-               --port={{:#metadata.http-port}} \
+               --port={{:#metatarget.http-port}} \
                --random-token \
                --roothttp={{#required-permission.urn:AGL:permission::public:no-htdocs}}.{{/required-permission.urn:AGL:permission::public:no-htdocs}}{{^required-permission.urn:AGL:permission::public:no-htdocs}}htdocs{{/required-permission.urn:AGL:permission::public:no-htdocs}} \
        {{/content.type=application/vnd.agl.service}} \
index 1a5e71f..30c25d5 100644 (file)
@@ -1,10 +1,10 @@
 dnl vim: set filetype=sysctl.conf.m4 syntax=sysctl.conf.m4:
 
 IF_AGL_DEVEL
-X-AFM-http-port={{:#metadata.http-port}}
+X-AFM-http-port={{:#metatarget.http-port}}
 ELSE
 IF_NOT_CONTENT(application/vnd.agl.service)
-X-AFM--http-port={{:#metadata.http-port}}
+X-AFM--http-port={{:#metatarget.http-port}}
 ENDIF
 ENDIF
 
@@ -17,14 +17,14 @@ IF_AGL_DEVEL \
        --verbose \
        --verbose \
        --monitoring \
-       --port={{:#metadata.http-port}} \
+       --port={{:#metatarget.http-port}} \
        --token=HELLO \
        --roothttp=ON_CONTENT(application/vnd.agl.service, ., ON_PERM(:public:no-htdocs, ., htdocs)) \
 ELSE \
        IF_CONTENT(application/vnd.agl.service) \
                --no-httpd \
        ELSE \
-               --port={{:#metadata.http-port}} \
+               --port={{:#metatarget.http-port}} \
                --random-token \
                --roothttp=ON_PERM(:public:no-htdocs, ., htdocs) \
        ENDIF \
index 2b166e9..347135a 100644 (file)
@@ -65,6 +65,12 @@ puts(json_object_to_json_string_ext(desc->desc, JSON_C_TO_STRING_PRETTY));
        return 0;
 }
 
+static int port()
+{
+       static int r = 10000;
+       return r++;
+}
+
 int main(int ac, char **av)
 {
        struct unitconf conf;
@@ -73,7 +79,7 @@ int main(int ac, char **av)
 
        conf.installdir = "INSTALL-DIR";
        conf.icondir = "ICONS-DIR";
-       conf.port = 666;
+       conf.port = port;
        rc = unit_generator_open_template(*++av);
        if (rc < 0)
                error("can't read template %s: %m",*av);
index c5c41ea..8d59b37 100644 (file)
@@ -541,7 +541,7 @@ struct wgt_info *install_widget(const char *wgtfile, const char *root, int force
        struct wgt_info *ifo;
        const struct wgt_desc *desc;
        char installdir[PATH_MAX];
-       int port, err;
+       int err;
        struct unitconf uconf;
 
        NOTICE("-- INSTALLING widget %s to %s --", wgtfile, root);
@@ -596,13 +596,9 @@ struct wgt_info *install_widget(const char *wgtfile, const char *root, int force
        if (install_file_properties(desc))
                goto error4;
 
-       port = get_port();
-       if (port < 0)
-               goto error4;
-
        uconf.installdir = installdir;
        uconf.icondir = FWK_ICON_DIR;
-       uconf.port = port;
+       uconf.port = get_port;
        if (unit_install(ifo, &uconf))
                goto error4;
 
index 4251427..5e4348a 100644 (file)
@@ -31,7 +31,7 @@
 #define MAX_DEPTH 256
 
 /*
- * exploration state when instanciating mustache
+ * exploration state when instantiating mustache
  */
 struct expl {
        struct json_object *root;
index 89d1473..cca718f 100644 (file)
@@ -28,7 +28,7 @@
 #include <limits.h>
 
 #include <json-c/json.h>
+
 #include "verbose.h"
 #include "utils-file.h"
 
@@ -38,6 +38,7 @@
 #include "utils-systemd.h"
 
 #include "wgtpkg-unit.h"
+#include "wgt-strings.h"
 
 #if 0
 #include <ctype.h>
@@ -54,7 +55,7 @@ static char *template;
  * When returning 1 and 'after' isn't NULL, the pointer to the
  * first character after the pettern in 'text' is stored in 'after'.
  * The characters '\n' and ' ' have a special meaning in the search:
- *  * '\n': matches any space or tabs (including none) followed 
+ *  * '\n': matches any space or tabs (including none) followed
  *          either by '\n' or '\0' (end of the string)
  *  * ' ': matches any space or tabs but at least one.
  */
@@ -373,13 +374,26 @@ int unit_generator_open_template(const char *filename)
 
 static int add_metadata(struct json_object *jdesc, const struct unitconf *conf)
 {
+       struct json_object *targets, *targ;
        char portstr[30];
+       int port, i, n;
+
+       if (json_object_object_get_ex(jdesc, string_targets, &targets)) {
+               n = json_object_array_length(targets);
+               for (i = 0 ; i < n ; i++) {
+                       targ = json_object_array_get_idx(targets, i);
+                       port = conf->port();
+                       if (port < 0)
+                               return port;
+                       sprintf(portstr, "%d", port);
+                       if (!j_add_string_m(targ, "#metatarget.http-port", portstr))
+                               return -1;
+               }
+       }
 
-       sprintf(portstr, "%d", conf->port);
        return  j_add_many_strings_m(jdesc,
                "#metadata.install-dir", conf->installdir,
                "#metadata.icons-dir", conf->icondir,
-               "#metadata.http-port", portstr,
                NULL) ? 0 : -1;
 }
 
index 7330365..fc91204 100644 (file)
@@ -47,7 +47,7 @@ struct unitdesc {
 struct unitconf {
        const char *installdir;
        const char *icondir;
-       int port;
+       int (*port)();
 };
 
 struct generatedesc {