summaryrefslogtreecommitdiffstats
path: root/ui/common
diff options
context:
space:
mode:
authorSamuel Mendoza-Jonas <sam@mendozajonas.com>2017-07-24 15:58:50 +1000
committerSamuel Mendoza-Jonas <sam@mendozajonas.com>2017-08-15 13:38:17 +1000
commit5b3dd56d982629349e612b9e984e65dec09b438f (patch)
tree1a89bd6376fc58e45691a3c8b72b91c275602f7b /ui/common
parentd90efe9e2bbfb18ee05ec2032b5723dbfa902d82 (diff)
downloadtalos-petitboot-5b3dd56d982629349e612b9e984e65dec09b438f.tar.gz
talos-petitboot-5b3dd56d982629349e612b9e984e65dec09b438f.zip
ui/ncurses: Add plugin menu and nc-plugin screen
Add a second pmenu accessible via the main menu which displays uninstalled and installed pb-plugins. Uninstalled options can be selected to trigger pb-plugin to install them, after which they are updated and marked as installed in the menu. Installed plugins can be investigated by entering the new plugin screen, where plugin metadata and executables are displayed. Executables can be run from this screen via cui_run_cmd(). Signed-off-by: Samuel Mendoza-Jonas <sam@mendozajonas.com>
Diffstat (limited to 'ui/common')
-rw-r--r--ui/common/discover-client.c48
-rw-r--r--ui/common/discover-client.h10
2 files changed, 58 insertions, 0 deletions
diff --git a/ui/common/discover-client.c b/ui/common/discover-client.c
index dce74f9..8ad4611 100644
--- a/ui/common/discover-client.c
+++ b/ui/common/discover-client.c
@@ -112,6 +112,21 @@ static void device_remove(struct discover_client *client, const char *id)
talloc_free(device);
}
+static void plugin_option_add(struct discover_client *client,
+ struct plugin_option *opt)
+{
+ talloc_steal(client, opt);
+
+ if (client->ops.plugin_option_add)
+ client->ops.plugin_option_add(opt, client->ops.cb_arg);
+}
+
+static void plugins_remove(struct discover_client *client)
+{
+ if (client->ops.plugins_remove)
+ client->ops.plugins_remove(client->ops.cb_arg);
+}
+
void discover_client_enumerate(struct discover_client *client)
{
struct boot_option *opt;
@@ -155,6 +170,7 @@ static int discover_client_process(void *arg)
{
struct discover_client *client = arg;
struct pb_protocol_message *message;
+ struct plugin_option *p_opt;
struct system_info *sysinfo;
struct boot_option *opt;
struct status *status;
@@ -235,6 +251,20 @@ static int discover_client_process(void *arg)
}
update_config(client, config);
break;
+ case PB_PROTOCOL_ACTION_PLUGIN_OPTION_ADD:
+ p_opt = talloc_zero(ctx, struct plugin_option);
+
+ rc = pb_protocol_deserialise_plugin_option(p_opt, message);
+ if (rc) {
+ pb_log("%s: no plugin_option?\n", __func__);
+ goto out;
+ }
+
+ plugin_option_add(client, p_opt);
+ break;
+ case PB_PROTOCOL_ACTION_PLUGINS_REMOVE:
+ plugins_remove(client);
+ break;
default:
pb_log("%s: unknown action %d\n", __func__, message->action);
}
@@ -404,3 +434,21 @@ int discover_client_send_url(struct discover_client *client,
return pb_protocol_write_message(client->fd, message);
}
+
+int discover_client_send_plugin_install(struct discover_client *client,
+ char *file)
+{
+ struct pb_protocol_message *message;
+ int len;
+
+ len = pb_protocol_url_len(file);
+
+ message = pb_protocol_create_message(client,
+ PB_PROTOCOL_ACTION_PLUGIN_INSTALL, len);
+ if (!message)
+ return -1;
+
+ pb_protocol_serialise_url(file, message->payload, len);
+
+ return pb_protocol_write_message(client->fd, message);
+}
diff --git a/ui/common/discover-client.h b/ui/common/discover-client.h
index 95a5d9e..7224691 100644
--- a/ui/common/discover-client.h
+++ b/ui/common/discover-client.h
@@ -14,6 +14,11 @@ struct pb_boot_data {
char *args_sig_file;
};
+struct pb_plugin_data {
+ char *plugin_file;
+ struct plugin_option *opt;
+};
+
/**
* struct discover_client_ops - Application supplied client info.
* @device_add: PB_PROTOCOL_ACTION_ADD event callback.
@@ -35,6 +40,8 @@ struct discover_client_ops {
int (*boot_option_add)(struct device *dev, struct boot_option *option,
void *arg);
void (*device_remove)(struct device *device, void *arg);
+ int (*plugin_option_add)(struct plugin_option *option, void *arg);
+ int (*plugins_remove)(void *arg);
void (*update_status)(struct status *status, void *arg);
void (*update_sysinfo)(struct system_info *sysinfo, void *arg);
void (*update_config)(struct config *sysinfo, void *arg);
@@ -91,5 +98,8 @@ void discover_client_enumerate(struct discover_client *client);
/* Send url to config to the discover server */
int discover_client_send_url(struct discover_client *client, char *url);
+/* Send plugin file path to discover server to install */
+int discover_client_send_plugin_install(struct discover_client *client,
+ char *file);
#endif
OpenPOWER on IntegriCloud