To allow other services to respsond to a restart event from a procd initialised service, a new ubus method "restart" in the ubus "service" path is needed to trigger a ubus notify and also execute the installed service triggers.
Cc: Aaron Goodman <aaro...@alumni.stanford.edu> Signed-off-by: Florian Eckert <f...@dev.tdt.de> The original implementation is by Aaron Goodman. --- .../patches/0010-add-restart-event.patch | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 package/system/procd/patches/0010-add-restart-event.patch diff --git a/package/system/procd/patches/0010-add-restart-event.patch b/package/system/procd/patches/0010-add-restart-event.patch new file mode 100644 index 0000000000..86ec3d38e1 --- /dev/null +++ b/package/system/procd/patches/0010-add-restart-event.patch @@ -0,0 +1,64 @@ +--- a/service/service.c ++++ b/service/service.c +@@ -204,6 +204,17 @@ static const struct blobmsg_policy servi + }; + + enum { ++ SERVICE_RESTART_ATTR_NAME, ++ SERVICE_RESTART_ATTR_INSTANCE, ++ __SERVICE_RESTART_ATTR_MAX, ++}; ++ ++static const struct blobmsg_policy service_restart_attrs[__SERVICE_RESTART_ATTR_MAX] = { ++ [SERVICE_RESTART_ATTR_NAME] = { "name", BLOBMSG_TYPE_STRING }, ++ [SERVICE_RESTART_ATTR_INSTANCE] = { "instance", BLOBMSG_TYPE_STRING }, ++}; ++ ++enum { + SERVICE_DEL_ATTR_NAME, + SERVICE_DEL_ATTR_INSTANCE, + __SERVICE_DEL_ATTR_MAX, +@@ -681,6 +692,35 @@ service_handle_update(struct ubus_contex + return 0; + } + ++static int ++service_handle_restart(struct ubus_context *ctx, struct ubus_object *obj, ++ struct ubus_request_data *req, const char *method, ++ struct blob_attr *msg) ++{ ++ struct blob_attr *tb[__SERVICE_RESTART_ATTR_MAX], *cur; ++ struct service *s = NULL; ++ const char *name; ++ ++ blobmsg_parse(service_set_attrs, __SERVICE_RESTART_ATTR_MAX, tb, blobmsg_data(msg), blobmsg_data_len(msg)); ++ cur = tb[SERVICE_RESTART_ATTR_NAME]; ++ if (!cur) ++ return UBUS_STATUS_INVALID_ARGUMENT; ++ ++ name = blobmsg_data(cur); ++ ++ s = avl_find_element(&services, name, s, avl); ++ if (!s) ++ return UBUS_STATUS_INVALID_ARGUMENT; ++ ++ blob_buf_init(&b, 0); ++ blobmsg_add_string(&b, "service", s->name); ++ trigger_event("service.restart", b.head); ++ ++ service_event("service.restart", s->name, NULL); ++ ++ return UBUS_STATUS_OK; ++} ++ + static void ubus_event_bcast(const char *type, const char *param1, const char *val1, + const char *param2, const char *val2) + { +@@ -951,6 +991,7 @@ static struct ubus_method main_object_me + UBUS_METHOD("add", service_handle_set, service_set_attrs), + UBUS_METHOD("list", service_handle_list, service_list_attrs), + UBUS_METHOD("delete", service_handle_delete, service_del_attrs), ++ UBUS_METHOD("restart", service_handle_restart, service_restart_attrs), + UBUS_METHOD("signal", service_handle_signal, service_signal_attrs), + UBUS_METHOD("update_start", service_handle_update, service_attrs), + UBUS_METHOD("update_complete", service_handle_update, service_attrs), -- 2.20.1 _______________________________________________ openwrt-devel mailing list openwrt-devel@lists.openwrt.org https://lists.openwrt.org/mailman/listinfo/openwrt-devel