From 32469644a029b79c1325c6f95e688d13988f76ad Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Tue, 17 Dec 2024 20:21:33 +0100 Subject: [PATCH] service: allow incremental changes to service properties Support updating data and autostart without re-running the init script or tearing down existing other service properties, e.g. validation or triggers. This can be used to allow services to manage their own data at runtime without going through the init script. Signed-off-by: Felix Fietkau --- service/service.c | 31 ++++++++++++++----------------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/service/service.c b/service/service.c index de14aa3..25e2885 100644 --- a/service/service.c +++ b/service/service.c @@ -152,32 +152,28 @@ service_update_data(struct service *s, struct blob_attr *data) } static int -service_update(struct service *s, struct blob_attr **tb, bool add) +service_update(struct service *s, struct blob_attr **tb, bool add, bool init) { struct blob_attr *cur; int rem; - if (s->trigger) { - trigger_del(s); - free(s->trigger); - s->trigger = NULL; - } - - service_validate_del(s); - - if (tb[SERVICE_SET_AUTOSTART] && !blobmsg_get_bool(tb[SERVICE_SET_AUTOSTART])) - s->autostart = false; - else + if (tb[SERVICE_SET_AUTOSTART]) + s->autostart = blobmsg_get_bool(tb[SERVICE_SET_AUTOSTART]); + else if (init) s->autostart = true; - if (tb[SERVICE_SET_TRIGGER] && blobmsg_data_len(tb[SERVICE_SET_TRIGGER])) { + if (tb[SERVICE_SET_TRIGGER]) { + free(s->trigger); s->trigger = blob_memdup(tb[SERVICE_SET_TRIGGER]); if (!s->trigger) return -1; + + trigger_del(s); trigger_add(s->trigger, s); } - if (tb[SERVICE_SET_VALIDATE] && blobmsg_data_len(tb[SERVICE_SET_VALIDATE])) { + if (tb[SERVICE_SET_VALIDATE]) { + service_validate_del(s); blobmsg_for_each_attr(cur, tb[SERVICE_SET_VALIDATE], rem) service_validate_add(s, cur); } @@ -198,7 +194,8 @@ service_update(struct service *s, struct blob_attr **tb, bool add) s->deleted = false; - rc(s->name, "running"); + if (init || tb[SERVICE_SET_INSTANCES]) + rc(s->name, "running"); return 0; } @@ -441,7 +438,7 @@ service_handle_set(struct ubus_context *ctx, struct ubus_object *obj, if (s) { P_DEBUG(2, "Update service %s\n", name); - return service_update(s, tb, add); + return service_update(s, tb, add, false); } P_DEBUG(2, "Create service %s\n", name); @@ -451,7 +448,7 @@ service_handle_set(struct ubus_context *ctx, struct ubus_object *obj, s->container = container; - ret = service_update(s, tb, add); + ret = service_update(s, tb, add, true); if (ret) return ret; -- 2.30.2