};
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 },
};
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)
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;
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 =
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 =