[LEDE-DEV] [PATCH][RFC] procd: service: add data within the service itself
Pierre Lebleu
pme.lebleu at gmail.com
Wed Oct 25 08:53:55 PDT 2017
Hi John,
I reworked this patch a bit in order to have the data outside of any
instances. Doing that, I needed also to patch firewall3 in order to
parse this data.
Here come the "dump" of a dummy script:
ubus call service list '{ "name" : "myservice" }'
{
"myservice": {
"data": {
"firewall": [
{
"type": "rule",
"src": "wan",
"proto": "udp",
"dest_port": "xxxx",
"target": "DROP"
},
{
"type": "rule",
"src": "wan",
"proto": "udp",
"dest_port": "yyyy",
"target": "ACCEPT"
},
]
}
}
}
ubus call service get_data '{ "name" : "myservice" }'
{
"myservice": {
"firewall": [
{
"type": "rule",
"src": "wan",
"proto": "udp",
"dest_port": "xxxx",
"target": "DROP"
},
{
"type": "rule",
"src": "wan",
"proto": "udp",
"dest_port": "yyyy",
"target": "ACCEPT"
},
]
}
}
2017-10-18 9:25 GMT+02:00 John Crispin <john at phrozen.org>:
> Hi Pierre
>
> sorry for the late reply, comments inline
>
>
>
> On 04/10/17 12:50, pme.lebleu at gmail.com wrote:
>>
>> 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;
>> +
>
>
> maybe i am reading the code wrong but it looks to me as if this would result
> int he service and instance data being intermingled. not sure if this is
> good or bad. could you possibly post a json dump of what the generated blob
> would looks like ?
>
> John
>
>
>> 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);
>
>
--
Pierre Lebleu
Mobile : +32 485 033 706
Email : pme.lebleu at gmail.com
More information about the Lede-dev
mailing list