luci2: add upgrade_test, upgrade_start and upgrade_abort calls
[project/rpcd.git] / luci2.c
diff --git a/luci2.c b/luci2.c
index 86b00fa..ae36e42 100644 (file)
--- a/luci2.c
+++ b/luci2.c
@@ -110,12 +110,12 @@ static const struct blobmsg_policy rpc_opkg_package_policy[__RPC_OP_MAX] = {
 };
 
 enum {
-       RPC_OC_CONFIG,
-       __RPC_OC_MAX
+       RPC_UPGRADE_KEEP,
+       __RPC_UPGRADE_MAX
 };
 
-static const struct blobmsg_policy rpc_opkg_config_policy[__RPC_OC_MAX] = {
-       [RPC_OC_CONFIG]     = { .name = "config", .type = BLOBMSG_TYPE_STRING },
+static const struct blobmsg_policy rpc_upgrade_policy[__RPC_UPGRADE_MAX] = {
+       [RPC_UPGRADE_KEEP] = { .name = "keep",    .type = BLOBMSG_TYPE_BOOL },
 };
 
 
@@ -946,6 +946,32 @@ rpc_luci2_usb_list(struct ubus_context *ctx, struct ubus_object *obj,
        return 0;
 }
 
+static int
+rpc_luci2_upgrade_test(struct ubus_context *ctx, struct ubus_object *obj,
+                       struct ubus_request_data *req, const char *method,
+                       struct blob_attr *msg)
+{
+       const char *cmd[4] = { "sysupgrade", "--test", "/tmp/firmware.bin", NULL };
+       return rpc_exec(cmd, NULL, NULL, NULL, NULL, ctx, req);
+}
+
+static int
+rpc_luci2_upgrade_start(struct ubus_context *ctx, struct ubus_object *obj,
+                        struct ubus_request_data *req, const char *method,
+                        struct blob_attr *msg)
+{
+       return 0;
+}
+
+static int
+rpc_luci2_upgrade_abort(struct ubus_context *ctx, struct ubus_object *obj,
+                        struct ubus_request_data *req, const char *method,
+                        struct blob_attr *msg)
+{
+       unlink("/tmp/firmware.bin");
+       return 0;
+}
+
 
 static FILE *
 dnsmasq_leasefile(void)
@@ -1690,25 +1716,22 @@ rpc_luci2_opkg_config_set(struct ubus_context *ctx, struct ubus_object *obj,
                           struct blob_attr *msg)
 {
        FILE *f;
-       struct blob_attr *tb[__RPC_OC_MAX];
+       struct blob_attr *tb[__RPC_D_MAX];
 
-       blobmsg_parse(rpc_opkg_package_policy, __RPC_OC_MAX, tb,
+       blobmsg_parse(rpc_data_policy, __RPC_D_MAX, tb,
                      blob_data(msg), blob_len(msg));
 
-       if (!tb[RPC_OC_CONFIG])
+       if (!tb[RPC_D_DATA])
                return UBUS_STATUS_INVALID_ARGUMENT;
 
-       if (blobmsg_type(tb[RPC_OC_CONFIG]) != BLOBMSG_TYPE_STRING)
-               return UBUS_STATUS_INVALID_ARGUMENT;
-
-       if (blobmsg_data_len(tb[RPC_OC_CONFIG]) >= 2048)
+       if (blobmsg_data_len(tb[RPC_D_DATA]) >= 2048)
                return UBUS_STATUS_NOT_SUPPORTED;
 
        if (!(f = fopen("/etc/opkg.conf", "w")))
                return rpc_errno_status();
 
-       fwrite(blobmsg_data(tb[RPC_OC_CONFIG]),
-              blobmsg_data_len(tb[RPC_OC_CONFIG]), 1, f);
+       fwrite(blobmsg_data(tb[RPC_D_DATA]),
+              blobmsg_data_len(tb[RPC_D_DATA]), 1, f);
 
        fclose(f);
        return 0;
@@ -1741,7 +1764,11 @@ int rpc_luci2_api_init(struct ubus_context *ctx)
                UBUS_METHOD("password_set",       rpc_luci2_password_set,
                                                  rpc_password_policy),
                UBUS_METHOD_NOARG("led_list",     rpc_luci2_led_list),
-               UBUS_METHOD_NOARG("usb_list",     rpc_luci2_usb_list)
+               UBUS_METHOD_NOARG("usb_list",     rpc_luci2_usb_list),
+               UBUS_METHOD_NOARG("upgrade_test", rpc_luci2_upgrade_test),
+               UBUS_METHOD("upgrade_start",      rpc_luci2_upgrade_start,
+                                                 rpc_upgrade_policy),
+               UBUS_METHOD_NOARG("upgrade_abort", rpc_luci2_upgrade_abort)
        };
 
        static struct ubus_object_type luci2_system_type =
@@ -1790,7 +1817,7 @@ int rpc_luci2_api_init(struct ubus_context *ctx)
                UBUS_METHOD_NOARG("update",          rpc_luci2_opkg_update),
                UBUS_METHOD_NOARG("config_get",      rpc_luci2_opkg_config_get),
                UBUS_METHOD("config_set",            rpc_luci2_opkg_config_set,
-                                                    rpc_opkg_config_policy)
+                                                    rpc_data_policy)
        };
 
        static struct ubus_object_type luci2_opkg_type =