@@ -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,
@@ -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)
@@ -23,6 +23,7 @@ const char **common_known_params(void)
"petitboot,http_proxy",
"petitboot,https_proxy",
"petitboot,password",
+ "petitboot,preboot_check",
NULL,
};
@@ -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:
@@ -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;
@@ -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"),
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(-)