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

Reply via email to