Skip to content

Commit

Permalink
ui/ncurses: Don't modify config when clearing IPMI override
Browse files Browse the repository at this point in the history
When safe mode is active the config displayed in nc-config is only a
subset of the actual config since device init has not yet occurred.
However when the "clear override" checkbox is ticked and the config
saved, the form will set the config as it is displayed, resulting in
device-specific config (eg. boot order and network settings) being
cleared. If the user only ticked the "clear override" checkbox this most
likely isn't what they intended.

Instead change the checkbox to a button which when pressed clears the
override and exits safe mode if active, without modifying the rest of
the configuration.

Signed-off-by: Samuel Mendoza-Jonas <sam@mendozajonas.com>
  • Loading branch information
sammj committed Aug 24, 2017
1 parent b9b5fa3 commit c30d76a
Showing 1 changed file with 26 additions and 9 deletions.
35 changes: 26 additions & 9 deletions ui/ncurses/nc-config.c
Expand Up @@ -84,7 +84,7 @@ struct config_screen {

struct nc_widget_label *ipmi_type_l;
struct nc_widget_label *ipmi_clear_l;
struct nc_widget_checkbox *ipmi_clear_cb;
struct nc_widget_button *ipmi_clear_b;

struct nc_widget_label *network_l;
struct nc_widget_select *network_f;
Expand Down Expand Up @@ -256,11 +256,6 @@ static int screen_process_form(struct config_screen *screen)
config->autoboot_timeout_sec = x;
}

if (screen->ipmi_override)
if (widget_checkbox_get_value(screen->widgets.ipmi_clear_cb))
config->ipmi_bootdev = IPMI_BOOTDEV_INVALID;


net_conf_type = widget_select_get_value(screen->widgets.network_f);

/* if we don't have any network interfaces, prevent per-interface
Expand Down Expand Up @@ -398,6 +393,26 @@ static void cancel_click(void *arg)
screen->exit = true;
}

static void ipmi_clear_click(void *arg)
{
struct config_screen *screen = arg;
struct config *config;
int rc;

config = config_copy(screen, screen->cui->config);
config->ipmi_bootdev = IPMI_BOOTDEV_INVALID;
config->safe_mode = false;

rc = cui_send_config(screen->cui, config);
talloc_free(config);

if (rc)
pb_log("cui_send_config failed!\n");
else
pb_debug("config sent!\n");
screen->exit = true;
}

static int layout_pair(struct config_screen *screen, int y,
struct nc_widget_label *label,
struct nc_widget *field)
Expand Down Expand Up @@ -497,7 +512,7 @@ static void config_screen_layout_widgets(struct config_screen *screen)
y += 1;

wl = widget_label_base(screen->widgets.ipmi_clear_l);
wf = widget_checkbox_base(screen->widgets.ipmi_clear_cb);
wf = widget_button_base(screen->widgets.ipmi_clear_b);
widget_set_visible(wl, true);
widget_set_visible(wf, true);
widget_move(wl, y, screen->label_x);
Expand Down Expand Up @@ -937,8 +952,10 @@ static void config_screen_setup_widgets(struct config_screen *screen,
label);
screen->widgets.ipmi_clear_l = widget_new_label(set, 0, 0,
_("Clear option:"));
screen->widgets.ipmi_clear_cb = widget_new_checkbox(set, 0, 0,
false);
screen->widgets.ipmi_clear_b = widget_new_button(set, 0, 0,
strncols(_("Clear IPMI override now")) + 10,
_("Clear IPMI override now"),
ipmi_clear_click, screen);
screen->ipmi_override = true;
}

Expand Down

0 comments on commit c30d76a

Please sign in to comment.