/*
- * luci-rpcd - LuCI UBUS RPC server
+ * rpcd - UBUS RPC server
*
* Copyright (C) 2013 Jo-Philipp Wich <jow@openwrt.org>
*
#include <arpa/inet.h>
#include <signal.h>
#include <glob.h>
+#include <libubox/blobmsg_json.h>
+#include <libubus.h>
+#include <uci.h>
-#include "luci2.h"
-#include "exec.h"
-#include "session.h"
+#include <rpcd/plugin.h>
+
+/* limit of log size buffer */
+#define RPC_LUCI2_MAX_LOGSIZE (128 * 1024)
+#define RPC_LUCI2_DEF_LOGSIZE (16 * 1024)
+
+/* location of menu definitions */
+#define RPC_LUCI2_MENU_FILES "/usr/share/luci2/menu.d/*.json" /* */
+
+
+static const struct rpc_daemon_ops *ops;
static struct blob_buf buf;
static struct uci_context *cursor;
struct blob_attr *msg)
{
const char *cmd[4] = { "sysupgrade", "--test", "/tmp/firmware.bin", NULL };
- return rpc_exec(cmd, NULL, NULL, NULL, NULL, ctx, req);
+ return ops->exec(cmd, NULL, NULL, NULL, NULL, NULL, ctx, req);
}
static int
const char *cmd[4] = { "sysupgrade", "--restore-backup",
"/tmp/backup.tar.gz", NULL };
- return rpc_exec(cmd, NULL, NULL, NULL, NULL, ctx, req);
+ return ops->exec(cmd, NULL, NULL, NULL, NULL, NULL, ctx, req);
}
static int
return (nl - buf + 1);
}
-static void
+static int
backup_finish_list(struct blob_buf *blob, int status, void *priv)
{
struct backup_state *s = priv;
if (!s->open)
- return;
+ return UBUS_STATUS_NO_DATA;
blobmsg_close_array(blob, s->array);
+
+ return UBUS_STATUS_OK;
}
static int
memset(state, 0, sizeof(*state));
- return rpc_exec(cmd, backup_parse_list, NULL, backup_finish_list,
- state, ctx, req);
+ return ops->exec(cmd, NULL, backup_parse_list, NULL, backup_finish_list,
+ state, ctx, req);
}
static int
return (nl - buf + 1);
}
-static void
+static int
opkg_finish_list(struct blob_buf *blob, int status, void *priv)
{
struct opkg_state *s = priv;
if (!s->open)
- return;
+ return UBUS_STATUS_NO_DATA;
blobmsg_close_array(blob, s->array);
blobmsg_add_u32(blob, "total", s->total);
+
+ return UBUS_STATUS_OK;
}
static int
if (state->req_count <= 0 || state->req_count > 100)
state->req_count = 100;
- return rpc_exec(cmd, opkg_parse_list, NULL, opkg_finish_list,
- state, ctx, req);
+ return ops->exec(cmd, NULL, opkg_parse_list, NULL, opkg_finish_list,
+ state, ctx, req);
}
struct blob_attr *msg)
{
const char *cmd[3] = { "opkg", "update", NULL };
- return rpc_exec(cmd, NULL, NULL, NULL, NULL, ctx, req);
+ return ops->exec(cmd, NULL, NULL, NULL, NULL, NULL, ctx, req);
}
static int
cmd[3] = blobmsg_data(tb[RPC_OP_PACKAGE]);
- return rpc_exec(cmd, NULL, NULL, NULL, NULL, ctx, req);
+ return ops->exec(cmd, NULL, NULL, NULL, NULL, NULL, ctx, req);
}
static int
cmd[3] = blobmsg_data(tb[RPC_OP_PACKAGE]);
- return rpc_exec(cmd, NULL, NULL, NULL, NULL, ctx, req);
+ return ops->exec(cmd, NULL, NULL, NULL, NULL, NULL, ctx, req);
}
static int
blobmsg_for_each_attr(acl, acls, rem)
{
- if (!rpc_session_access(blobmsg_data(sid), "luci-ui",
- blobmsg_data(acl), "read"))
+ if (!ops->session_access(blobmsg_data(sid), "luci-ui",
+ blobmsg_data(acl), "read"))
{
rv = false;
break;
}
blobmsg_add_u8(e, blobmsg_data(acl),
- rpc_session_access(blobmsg_data(sid), "luci-ui",
- blobmsg_data(acl), "write"));
+ ops->session_access(blobmsg_data(sid), "luci-ui",
+ blobmsg_data(acl), "write"));
}
blobmsg_close_table(e, c);
}
-int rpc_luci2_api_init(struct ubus_context *ctx)
+static int
+rpc_luci2_api_init(const struct rpc_daemon_ops *o, struct ubus_context *ctx)
{
int rv = 0;
if (!cursor)
return UBUS_STATUS_UNKNOWN_ERROR;
+ ops = o;
+
rv |= ubus_add_object(ctx, &system_obj);
rv |= ubus_add_object(ctx, &network_obj);
rv |= ubus_add_object(ctx, &opkg_obj);
return rv;
}
+
+const struct rpc_plugin rpc_plugin = {
+ .init = rpc_luci2_api_init
+};