diff mbox

[LEDE-DEV,procd] system: add reboot method to system ubus object

Message ID 1467731553-14129-1-git-send-email-zajec5@gmail.com
State Changes Requested
Headers show

Commit Message

Rafał Miłecki July 5, 2016, 3:12 p.m. UTC
Sometimes, for various reasons, user may want to reboot a device. This
is a common task and it makes sense to support it with something common
like a procd.

Right now both: LuCI and LuCI2 implement this feature on their own with
luci-rpc-luci2-system reboot and luci-rpc-sys reboot. This leads to code
duplication and situation may become even worse with more software
controlling system with ubus.

Once we get this patch in place we may consider switching LuCI and LuCI2
to this new method.

Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
---
I wrote a simple app for my own purposes (and a bit of fun) that uses
ubus over HTTP. I wanted to add support for rebooting device and I hit
this issue. I didn't want another deamon or rpcd plugin adding reboot
support so I decided to come with this procd patch.

If you would like to take a look at trivial usage of this, you may check
my small python script at:
http://files.zajec.net/lede/diagedel/
---
 system.c | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

Comments

John Crispin July 6, 2016, 5:42 a.m. UTC | #1
On 05/07/2016 17:12, Rafał Miłecki wrote:
> Sometimes, for various reasons, user may want to reboot a device. This
> is a common task and it makes sense to support it with something common
> like a procd.
> 
> Right now both: LuCI and LuCI2 implement this feature on their own with
> luci-rpc-luci2-system reboot and luci-rpc-sys reboot. This leads to code
> duplication and situation may become even worse with more software
> controlling system with ubus.
> 
> Once we get this patch in place we may consider switching LuCI and LuCI2
> to this new method.
> 
> Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
> ---
> I wrote a simple app for my own purposes (and a bit of fun) that uses
> ubus over HTTP. I wanted to add support for rebooting device and I hit
> this issue. I didn't want another deamon or rpcd plugin adding reboot
> support so I decided to come with this procd patch.
> 
> If you would like to take a look at trivial usage of this, you may check
> my small python script at:
> http://files.zajec.net/lede/diagedel/
> ---
>  system.c | 20 ++++++++++++++++++++
>  1 file changed, 20 insertions(+)
> 
> diff --git a/system.c b/system.c
> index 569a75d..ac34d12 100644
> --- a/system.c
> +++ b/system.c
> @@ -18,6 +18,7 @@
>  #endif
>  #include <sys/ioctl.h>
>  #include <sys/types.h>
> +#include <sys/reboot.h>
>  #include <sys/stat.h>
>  #include <fcntl.h>
>  #include <signal.h>
> @@ -242,6 +243,24 @@ static int system_upgrade(struct ubus_context *ctx, struct ubus_object *obj,
>  	return 0;
>  }
>  
> +static int system_reboot(struct ubus_context *ctx, struct ubus_object *obj,
> +			 struct ubus_request_data *req, const char *method,
> +			 struct blob_attr *msg)
> +{
> +	switch (fork()) {
> +	case -1:
> +		return UBUS_STATUS_UNKNOWN_ERROR;
> +	case 0:
> +		sync();
> +		sleep(1);
> +		reboot(RB_AUTOBOOT);
> +		while (1)
> +			sleep(1);

please use procd_shutdown(RB_AUTOBOOT) instead of rebooting manually

	John

> +	default:
> +		return 0;
> +	}
> +}
> +
>  enum {
>  	WDT_FREQUENCY,
>  	WDT_TIMEOUT,
> @@ -388,6 +407,7 @@ static const struct ubus_method system_methods[] = {
>  	UBUS_METHOD_NOARG("board", system_board),
>  	UBUS_METHOD_NOARG("info",  system_info),
>  	UBUS_METHOD_NOARG("upgrade", system_upgrade),
> +	UBUS_METHOD_NOARG("reboot", system_reboot),
>  	UBUS_METHOD("watchdog", watchdog_set, watchdog_policy),
>  	UBUS_METHOD("signal", proc_signal, signal_policy),
>  
>
diff mbox

Patch

diff --git a/system.c b/system.c
index 569a75d..ac34d12 100644
--- a/system.c
+++ b/system.c
@@ -18,6 +18,7 @@ 
 #endif
 #include <sys/ioctl.h>
 #include <sys/types.h>
+#include <sys/reboot.h>
 #include <sys/stat.h>
 #include <fcntl.h>
 #include <signal.h>
@@ -242,6 +243,24 @@  static int system_upgrade(struct ubus_context *ctx, struct ubus_object *obj,
 	return 0;
 }
 
+static int system_reboot(struct ubus_context *ctx, struct ubus_object *obj,
+			 struct ubus_request_data *req, const char *method,
+			 struct blob_attr *msg)
+{
+	switch (fork()) {
+	case -1:
+		return UBUS_STATUS_UNKNOWN_ERROR;
+	case 0:
+		sync();
+		sleep(1);
+		reboot(RB_AUTOBOOT);
+		while (1)
+			sleep(1);
+	default:
+		return 0;
+	}
+}
+
 enum {
 	WDT_FREQUENCY,
 	WDT_TIMEOUT,
@@ -388,6 +407,7 @@  static const struct ubus_method system_methods[] = {
 	UBUS_METHOD_NOARG("board", system_board),
 	UBUS_METHOD_NOARG("info",  system_info),
 	UBUS_METHOD_NOARG("upgrade", system_upgrade),
+	UBUS_METHOD_NOARG("reboot", system_reboot),
 	UBUS_METHOD("watchdog", watchdog_set, watchdog_policy),
 	UBUS_METHOD("signal", proc_signal, signal_policy),