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>
struct nc_widget_label *ipmi_type_l;
struct nc_widget_label *ipmi_clear_l;
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;
struct nc_widget_label *network_l;
struct nc_widget_select *network_f;
config->autoboot_timeout_sec = x;
}
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
net_conf_type = widget_select_get_value(screen->widgets.network_f);
/* if we don't have any network interfaces, prevent per-interface
+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)
static int layout_pair(struct config_screen *screen, int y,
struct nc_widget_label *label,
struct nc_widget *field)
y += 1;
wl = widget_label_base(screen->widgets.ipmi_clear_l);
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);
widget_set_visible(wl, true);
widget_set_visible(wf, true);
widget_move(wl, y, screen->label_x);
label);
screen->widgets.ipmi_clear_l = widget_new_label(set, 0, 0,
_("Clear option:"));
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;
}
screen->ipmi_override = true;
}