diff mbox series

[v2,3/4] ui/ncurses: Add preboot check option in the config screen

Message ID 20190923223024.995-4-maxiwell@linux.ibm.com
State Under Review
Headers show
Series Check if the kernel image has Ultravisor support | expand

Commit Message

Maxiwell S. Garcia Sept. 23, 2019, 10:30 p.m. UTC
Petitboot might run some checks to validate the kernel images before
call the kexec load. This patch adds both 'preboot check' option in the
config UI screen and a NVRAM variable 'petitboot,preboot_check' to make
the user choice persistent.

The 'preboot check' is enabled by default. The 'petitboot,preboot_check'
is created on NVRAM only when 'preboot check' is disabled by the user.

Signed-off-by: Maxiwell S. Garcia <maxiwell@linux.ibm.com>
---
 discover/platform-powerpc.c   |  7 ++++++
 discover/platform.c           |  4 ++++
 lib/param_list/param_list.c   |  1 +
 lib/pb-protocol/pb-protocol.c |  9 ++++++++
 lib/types/types.h             |  2 ++
 ui/ncurses/nc-config.c        | 43 ++++++++++++++++++++++++++++++++++-
 6 files changed, 65 insertions(+), 1 deletion(-)
diff mbox series

Patch

diff --git a/discover/platform-powerpc.c b/discover/platform-powerpc.c
index 5d7cc59..e4422d9 100644
--- a/discover/platform-powerpc.c
+++ b/discover/platform-powerpc.c
@@ -222,6 +222,13 @@  static void params_update_all(struct param_list *pl,
 
 	params_update_network_values(pl, "petitboot,network", config);
 	params_update_bootdev_values(pl, "petitboot,bootdevs", config);
+
+	if (config->preboot_check_enabled == defaults->preboot_check_enabled)
+		val = "";
+	else
+		val = config->preboot_check_enabled ? "true" : "false";
+
+	param_list_set_non_empty(pl, "petitboot,preboot_check", val, true);
 }
 
 static void config_set_ipmi_bootdev(struct config *config, enum ipmi_bootdev bootdev,
diff --git a/discover/platform.c b/discover/platform.c
index 8ce52fc..ea45594 100644
--- a/discover/platform.c
+++ b/discover/platform.c
@@ -159,6 +159,7 @@  void config_set_defaults(struct config *config)
 	else
 		config->lang = NULL;
 
+	config->preboot_check_enabled = true;
 }
 
 int platform_init(void *ctx)
@@ -572,6 +573,9 @@  void config_populate_all(struct config *config, const struct param_list *pl)
 	val = param_list_get_value(pl, "petitboot,https_proxy");
 	if (val)
 		config->https_proxy = talloc_strdup(config, val);
+
+	val = param_list_get_value(pl, "petitboot,preboot_check");
+	config->preboot_check_enabled = !val || strcmp(val, "false");
 }
 
 static char *interface_config_str(void *ctx, struct interface_config *config)
diff --git a/lib/param_list/param_list.c b/lib/param_list/param_list.c
index 9a01be6..62baddf 100644
--- a/lib/param_list/param_list.c
+++ b/lib/param_list/param_list.c
@@ -23,6 +23,7 @@  const char **common_known_params(void)
 		"petitboot,http_proxy",
 		"petitboot,https_proxy",
 		"petitboot,password",
+		"petitboot,preboot_check",
 		NULL,
 	};
 
diff --git a/lib/pb-protocol/pb-protocol.c b/lib/pb-protocol/pb-protocol.c
index daf4ec9..c9debbd 100644
--- a/lib/pb-protocol/pb-protocol.c
+++ b/lib/pb-protocol/pb-protocol.c
@@ -341,6 +341,8 @@  int pb_protocol_config_len(const struct config *config)
 
 	len += 4 + optional_strlen(config->lang);
 
+	len += 4; /* preboot check */
+
 	return len;
 }
 
@@ -667,6 +669,9 @@  int pb_protocol_serialise_config(const struct config *config,
 
 	pos += pb_protocol_serialise_string(pos, config->lang);
 
+	*(uint32_t *)pos = config->preboot_check_enabled;
+	pos += 4;
+
 	assert(pos <= buf + buf_len);
 
 	return (pos <= buf + buf_len) ? 0 : -1;
@@ -1317,6 +1322,10 @@  int pb_protocol_deserialise_config(struct config *config,
 
 	config->lang = str;
 
+	if (read_u32(&pos, &len, &tmp))
+		goto out;
+	config->preboot_check_enabled = !!tmp;
+
 	rc = 0;
 
 out:
diff --git a/lib/types/types.h b/lib/types/types.h
index 433a37b..7643234 100644
--- a/lib/types/types.h
+++ b/lib/types/types.h
@@ -184,6 +184,8 @@  struct config {
 	unsigned int		autoboot_timeout_sec;
 	struct network_config	network;
 
+	bool			preboot_check_enabled;
+
 	struct autoboot_option	*autoboot_opts;
 	unsigned int		n_autoboot_opts;
 
diff --git a/ui/ncurses/nc-config.c b/ui/ncurses/nc-config.c
index 943ee8a..b12baec 100644
--- a/ui/ncurses/nc-config.c
+++ b/ui/ncurses/nc-config.c
@@ -34,7 +34,7 @@ 
 #include "nc-config.h"
 #include "nc-widgets.h"
 
-#define N_FIELDS	51
+#define N_FIELDS	53
 
 extern struct help_text config_help_text;
 
@@ -70,6 +70,8 @@  struct config_screen {
 	bool			ipmi_mailbox;
 	bool			net_override;
 
+	bool			preboot_check_enabled;
+
 	struct {
 		struct nc_widget_label		*autoboot_l;
 		struct nc_widget_select		*autoboot_f;
@@ -124,6 +126,9 @@  struct config_screen {
 
 		struct nc_widget_button		*update_password_l;
 
+		struct nc_widget_label		*preboot_check_l;
+		struct nc_widget_select		*preboot_check_f;
+
 		struct nc_widget_label		*net_override_l;
 		struct nc_widget_label		*safe_mode;
 		struct nc_widget_button		*ok_b;
@@ -364,6 +369,9 @@  static int screen_process_form(struct config_screen *screen)
 		}
 	}
 
+	config->preboot_check_enabled = widget_select_get_value(
+						screen->widgets.preboot_check_f);
+
 	config->safe_mode = false;
 	rc = cui_send_config(screen->cui, config);
 	talloc_free(config);
@@ -735,6 +743,17 @@  static void config_screen_layout_widgets(struct config_screen *screen)
 		y += 1;
 	}
 
+	wl = widget_label_base(screen->widgets.preboot_check_l);
+	widget_set_visible(wl, true);
+	widget_move(wl, y, screen->label_x);
+
+	wf = widget_select_base(screen->widgets.preboot_check_f);
+	widget_set_visible(wf, true);
+	widget_move(wf, y, screen->field_x);
+	y += widget_height(wf);
+
+	y += 1;
+
 	widget_move(widget_button_base(screen->widgets.ok_b),
 			y, screen->field_x);
 	widget_move(widget_button_base(screen->widgets.help_b),
@@ -770,6 +789,15 @@  static void config_screen_autoboot_change(void *arg, int value)
 	widgetset_post(screen->widgetset);
 }
 
+static void config_screen_preboot_check_change(void *arg, int value)
+{
+	struct config_screen *screen = arg;
+	screen->preboot_check_enabled = !!value;
+	widgetset_unpost(screen->widgetset);
+	config_screen_layout_widgets(screen);
+	widgetset_post(screen->widgetset);
+}
+
 static void config_screen_add_device(void *arg)
 {
 	struct config_screen *screen = arg;
@@ -1196,6 +1224,19 @@  static void config_screen_setup_widgets(struct config_screen *screen,
 			_("Update system password"), password_click, screen);
 #endif
 
+	screen->preboot_check_enabled = config->preboot_check_enabled;
+	screen->widgets.preboot_check_l = widget_new_label(set, 0, 0, _("Pre-boot Check:"));
+	screen->widgets.preboot_check_f = widget_new_select(set, 0, 0,
+					COLS - screen->field_x - 1);
+
+	widget_select_add_option(screen->widgets.preboot_check_f, 0, _("Disabled"),
+				!screen->preboot_check_enabled);
+	widget_select_add_option(screen->widgets.preboot_check_f, 1, _("Enabled"),
+				screen->preboot_check_enabled);
+
+	widget_select_on_change(screen->widgets.preboot_check_f,
+			config_screen_preboot_check_change, screen);
+
 	screen->widgets.ok_b = widget_new_button(set, 0, 0, 10, _("OK"),
 			ok_click, screen);
 	screen->widgets.help_b = widget_new_button(set, 0, 0, 10, _("Help"),