[LEDE-DEV] [PATCH][RFC] procd: service: add data within the service itself
Pierre Lebleu
pme.lebleu at gmail.com
Wed Oct 4 04:01:43 PDT 2017
The idea behind this patch is to allow you to create some firewall
rules within the service itself rather than an instance.
Indeed, I have a wrapper script which launches several different
services but no daemon by itself, so I can not create an instance for
it.
Or, if I create an instance without any command, I get a warning and I
am not able to remove this instance because it cannot be killed and
this service instance remains forever...
In order to push the firewall data to procd, I (currently) need an
instance otherwise firewall3 needs also a patch. So, the fake instance
for this service is called "*".
2017-10-04 12:50 GMT+02:00 <pme.lebleu at gmail.com>:
> From: Pierre Lebleu <pme.lebleu at gmail.com>
>
> It gives the ability to create firewall data within the
> service itself rather than within an instance.
>
> Signed-off-by: Pierre Lebleu <pme.lebleu at gmail.com>
> ---
> service/service.c | 45 +++++++++++++++++++++++++++++++++++++++++++--
> service/service.h | 2 ++
> 2 files changed, 45 insertions(+), 2 deletions(-)
>
> diff --git a/service/service.c b/service/service.c
> index 9c798aa..595f6f7 100644
> --- a/service/service.c
> +++ b/service/service.c
> @@ -84,6 +84,7 @@ service_alloc(const char *name)
> s->name = new_name;
> s->avl.key = s->name;
> INIT_LIST_HEAD(&s->validators);
> + blobmsg_list_simple_init(&s->data);
>
> return s;
> }
> @@ -95,6 +96,7 @@ enum {
> SERVICE_SET_TRIGGER,
> SERVICE_SET_VALIDATE,
> SERVICE_SET_AUTOSTART,
> + SERVICE_SET_DATA,
> __SERVICE_SET_MAX
> };
>
> @@ -105,8 +107,20 @@ static const struct blobmsg_policy service_set_attrs[__SERVICE_SET_MAX] = {
> [SERVICE_SET_TRIGGER] = { "triggers", BLOBMSG_TYPE_ARRAY },
> [SERVICE_SET_VALIDATE] = { "validate", BLOBMSG_TYPE_ARRAY },
> [SERVICE_SET_AUTOSTART] = { "autostart", BLOBMSG_TYPE_BOOL },
> + [SERVICE_SET_DATA] = { "data", BLOBMSG_TYPE_TABLE },
> };
>
> +static void
> +service_fill_any(struct blobmsg_list *l, struct blob_attr *cur)
> +{
> + if (!cur)
> + return;
> +
> + DEBUG(2, "Add data for service\n");
> +
> + blobmsg_list_fill(l, blobmsg_data(cur), blobmsg_data_len(cur), false);
> +}
> +
> static int
> service_update(struct service *s, struct blob_attr **tb, bool add)
> {
> @@ -148,6 +162,8 @@ service_update(struct service *s, struct blob_attr **tb, bool add)
> vlist_flush(&s->instances);
> }
>
> + service_fill_any(&s->data, tb[SERVICE_SET_DATA]);
> +
> s->deleted = false;
>
> rc(s->name, "running");
> @@ -159,6 +175,7 @@ static void
> service_delete(struct service *s)
> {
> vlist_flush_all(&s->instances);
> + blobmsg_list_free(&s->data);
> s->deleted = true;
> service_stopped(s);
> }
> @@ -316,6 +333,13 @@ service_dump(struct service *s, bool verbose)
> blobmsg_add_blob(&b, s->trigger);
> if (verbose && !list_empty(&s->validators))
> service_validate_dump(&b, s);
> + if (!avl_is_empty(&s->data.avl)) {
> + struct blobmsg_list_node *var;
> + void *e = blobmsg_open_table(&b, "data");
> + blobmsg_list_for_each(&s->data, var)
> + blobmsg_add_blob(&b, var->data);
> + blobmsg_close_table(&b, e);
> + }
> blobmsg_close_table(&b, c);
> }
>
> @@ -598,13 +622,30 @@ service_get_data(struct ubus_context *ctx, struct ubus_object *obj,
> blob_buf_init(&b, 0);
> avl_for_each_element(&services, s, avl) {
> void *cs = NULL;
> + void *ci = NULL;
> + struct blobmsg_list_node *var;
>
> if (name && strcmp(name, s->name))
> continue;
>
> + blobmsg_list_for_each(&s->data, var) {
> + if (type && strcmp(blobmsg_name(var->data), type))
> + continue;
> +
> + if (!cs)
> + cs = blobmsg_open_table(&b, s->name);
> +
> + if (!ci)
> + ci = blobmsg_open_table(&b, "*");
> +
> + blobmsg_add_blob(&b, var->data);
> + }
> +
> + if (ci)
> + blobmsg_close_table(&b, ci), ci = NULL;
> +
> vlist_for_each_element(&s->instances, in, node) {
> - struct blobmsg_list_node *var;
> - void *ci = NULL;
> + ci = NULL;
>
> if (instance && strcmp(instance, in->name))
> continue;
> diff --git a/service/service.h b/service/service.h
> index a433c9f..15333c4 100644
> --- a/service/service.h
> +++ b/service/service.h
> @@ -18,6 +18,7 @@
> #include <libubox/avl.h>
> #include <libubox/vlist.h>
> #include <libubox/list.h>
> +#include "../utils/utils.h"
>
> extern struct avl_tree services;
>
> @@ -46,6 +47,7 @@ struct service {
> struct blob_attr *trigger;
> struct vlist_tree instances;
> struct list_head validators;
> + struct blobmsg_list data;
> };
>
> void service_validate_add(struct service *s, struct blob_attr *attr);
> --
> 1.9.1
>
More information about the Lede-dev
mailing list