From: Jeremy Kerr Date: Thu, 24 Oct 2013 06:02:49 +0000 (+0800) Subject: ui/ncurses: Parse configuration form & send to server X-Git-Tag: v1.0.0~340 X-Git-Url: http://git.ozlabs.org/?p=petitboot;a=commitdiff_plain;h=663197d945b6e393c1237c6b2b25f11567a449d7 ui/ncurses: Parse configuration form & send to server This change implements the configuration save action, when the user submits the nc-config form. Signed-off-by: Jeremy Kerr --- diff --git a/ui/common/discover-client.c b/ui/common/discover-client.c index b48d541..0e7da9d 100644 --- a/ui/common/discover-client.c +++ b/ui/common/discover-client.c @@ -332,3 +332,21 @@ int discover_client_cancel_default(struct discover_client *client) return pb_protocol_write_message(client->fd, message); } + +int discover_client_send_config(struct discover_client *client, + struct config *config) +{ + struct pb_protocol_message *message; + int len; + + len = pb_protocol_config_len(config); + + message = pb_protocol_create_message(client, + PB_PROTOCOL_ACTION_CONFIG, len); + if (!message) + return -1; + + pb_protocol_serialise_config(config, 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 fa97fa5..68be8a5 100644 --- a/ui/common/discover-client.h +++ b/ui/common/discover-client.h @@ -75,4 +75,8 @@ int discover_client_boot(struct discover_client *client, /* Tell the discover server to cancel the default boot option, if any */ int discover_client_cancel_default(struct discover_client *client); + +/* Send new configuration data to the discover server */ +int discover_client_send_config(struct discover_client *client, + struct config *config); #endif diff --git a/ui/ncurses/nc-config.c b/ui/ncurses/nc-config.c index 0b2a8d7..0141ba0 100644 --- a/ui/ncurses/nc-config.c +++ b/ui/ncurses/nc-config.c @@ -17,9 +17,11 @@ #define _GNU_SOURCE - +#include +#include #include +#include #include #include #include @@ -123,11 +125,111 @@ struct nc_scr *config_screen_scr(struct config_screen *screen) return &screen->scr; } +static int screen_process_form(struct config_screen *screen) +{ + const struct system_info *sysinfo = screen->cui->sysinfo; + struct config *config = talloc_zero(screen, struct config); + enum net_conf_type net_conf_type; + struct interface_config *iface; + char *str, *end; + int rc; + + config_set_defaults(config); + + config->autoboot_enabled = + widget_checkbox_get_value(screen->widgets.autoboot_f); + + + str = widget_textbox_get_value(screen->widgets.timeout_f); + if (str) { + unsigned long x; + errno = 0; + x = strtoul(str, &end, 10); + if (!errno && end != str) + config->autoboot_timeout_sec = x; + } + + net_conf_type = widget_select_get_value(screen->widgets.network_f); + + /* if we don't have any network interfaces, prevent per-interface + * configuration */ + if (sysinfo->n_interfaces == 0) + net_conf_type = NET_CONF_TYPE_DHCP_ALL; + + if (net_conf_type == NET_CONF_TYPE_DHCP_ALL) { + config->network.n_interfaces = 0; + + } else { + int idx; + + iface = talloc_zero(config, struct interface_config); + config->network.n_interfaces = 1; + config->network.interfaces = talloc_array(config, + struct interface_config *, 1); + config->network.interfaces[0] = iface; + + /* copy hwaddr (from the sysinfo interface data) to + * the configuration */ + idx = widget_select_get_value(screen->widgets.iface_f); + memcpy(iface->hwaddr, sysinfo->interfaces[idx]->hwaddr, + sizeof(iface->hwaddr)); + } + + if (net_conf_type == NET_CONF_TYPE_DHCP_ONE) { + iface->method = CONFIG_METHOD_DHCP; + } + + if (net_conf_type == NET_CONF_TYPE_STATIC) { + iface->method = CONFIG_METHOD_STATIC; + iface->static_config.address = talloc_asprintf(iface, "%s/%s", + widget_textbox_get_value( + screen->widgets.ip_addr_f), + widget_textbox_get_value( + screen->widgets.ip_mask_f)); + iface->static_config.gateway = talloc_strdup(iface, + widget_textbox_get_value( + screen->widgets.gateway_f)); + } + + str = widget_textbox_get_value(screen->widgets.dns_f); + if (str && strlen(str)) { + char *dns, *tmp; + int i; + + for (;;) { + dns = strtok_r(str, " \t", &tmp); + + if (!dns) + break; + + i = config->network.n_dns_servers++; + config->network.dns_servers = talloc_realloc(config, + config->network.dns_servers, + const char *, + config->network.n_dns_servers); + config->network.dns_servers[i] = + talloc_strdup(config, dns); + + str = NULL; + } + } + + 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"); + + return 0; +} + static void ok_click(void *arg) { struct config_screen *screen = arg; - /* todo: save config */ - screen->on_exit(screen->cui); + screen_process_form(screen); + screen->exit = true; } static void cancel_click(void *arg) @@ -212,13 +314,8 @@ static void config_screen_layout_widgets(struct config_screen *screen, if (show) y += layout_pair(screen, y, screen->widgets.gateway_l, wf); - wl = widget_label_base(screen->widgets.dns_l); - wf = widget_textbox_base(screen->widgets.dns_f); - widget_set_visible(wl, show); - widget_set_visible(wf, show); - - if (show) - y += 1 + layout_pair(screen, y, screen->widgets.dns_l, wf); + y += 1 + layout_pair(screen, y, screen->widgets.dns_l, + widget_textbox_base(screen->widgets.dns_f)); widget_move(widget_button_base(screen->widgets.ok_b), y, screen->field_x); diff --git a/ui/ncurses/nc-cui.c b/ui/ncurses/nc-cui.c index d74c1a4..93377bb 100644 --- a/ui/ncurses/nc-cui.c +++ b/ui/ncurses/nc-cui.c @@ -551,6 +551,11 @@ static void cui_update_config(struct config *config, void *arg) cui->config = talloc_steal(cui, config); } +int cui_send_config(struct cui *cui, struct config *config) +{ + return discover_client_send_config(cui->client, config); +} + static struct discover_client_ops cui_client_ops = { .device_add = NULL, .boot_option_add = cui_boot_option_add, diff --git a/ui/ncurses/nc-cui.h b/ui/ncurses/nc-cui.h index 752f2db..aba682a 100644 --- a/ui/ncurses/nc-cui.h +++ b/ui/ncurses/nc-cui.h @@ -74,6 +74,7 @@ void cui_item_edit(struct pmenu_item *item); void cui_item_new(struct pmenu *menu); void cui_show_sysinfo(struct cui *cui); void cui_show_config(struct cui *cui); +int cui_send_config(struct cui *cui, struct config *config); /* convenience routines */