X-Git-Url: http://git.ozlabs.org/?p=petitboot;a=blobdiff_plain;f=discover%2Fplatform.c;h=cc6306f035b96e622fb40026b780925279ac78fa;hp=d74571230bbcdc63df6d75edf9da2bd2c1884511;hb=d63bacef37d61b46e8db10914d4a7a677ba0775a;hpb=90d16d056b4d7c6b8e2afb6b3406babd38f6c9e5 diff --git a/discover/platform.c b/discover/platform.c index d745712..cc6306f 100644 --- a/discover/platform.c +++ b/discover/platform.c @@ -1,7 +1,12 @@ +#define _GNU_SOURCE + +#include #include +#include #include +#include #include #include @@ -11,22 +16,7 @@ void *platform_ctx; static struct platform *platform; static struct config *config; -static const char *device_type_name(enum device_type type) -{ - switch (type) { - case DEVICE_TYPE_DISK: - return "disk"; - case DEVICE_TYPE_OPTICAL: - return "optical"; - case DEVICE_TYPE_NETWORK: - return "network"; - case DEVICE_TYPE_ANY: - return "any"; - case DEVICE_TYPE_UNKNOWN: - default: - return "unknown"; - } -} +static const char *kernel_cmdline_debug = "petitboot.debug"; static void dump_config(struct config *config) { @@ -43,6 +33,12 @@ static void dump_config(struct config *config) if (config->network.n_interfaces || config->network.n_dns_servers) pb_log(" network configuration:\n"); + if (config->safe_mode) + pb_log(" safe mode: active\n"); + + if (config->disable_snapshots) + pb_log(" dm-snapshots disabled\n"); + for (i = 0; i < config->network.n_interfaces; i++) { struct interface_config *ifconf = config->network.interfaces[i]; @@ -64,38 +60,102 @@ static void dump_config(struct config *config) pb_log(" static:\n"); pb_log(" ip: %s\n", ifconf->static_config.address); pb_log(" gw: %s\n", ifconf->static_config.gateway); + pb_log(" url: %s\n", ifconf->static_config.url); } } for (i = 0; i < config->network.n_dns_servers; i++) pb_log(" dns server %s\n", config->network.dns_servers[i]); - if (config->n_boot_priorities) - pb_log(" boot priority order:\n"); - - for (i = 0; i < config->n_boot_priorities; i++) { - struct boot_priority *prio = &config->boot_priorities[i]; - pb_log(" %10s: %d\n", device_type_name(prio->type), - prio->priority); + for (i = 0; i < config->n_autoboot_opts; i++) { + if (config->autoboot_opts[i].boot_type == BOOT_DEVICE_TYPE) + pb_log(" boot device %d: %s\n", i, + device_type_name(config->autoboot_opts[i].type)); + else + pb_log(" boot device %d: uuid: %s\n", + i, config->autoboot_opts[i].uuid); } + + pb_log(" IPMI boot device 0x%02x%s\n", config->ipmi_bootdev, + config->ipmi_bootdev_persistent ? " (persistent)" : ""); + + pb_log(" Modifications allowed to disks: %s\n", + config->allow_writes ? "yes" : "no"); + + pb_log(" Default UI to boot on: %s\n", + config->boot_console ?: "none set"); + if (config->manual_console) + pb_log(" (Manually set)\n"); + + if (config->http_proxy) + pb_log(" HTTP Proxy: %s\n", config->http_proxy); + if (config->https_proxy) + pb_log(" HTTPS Proxy: %s\n", config->https_proxy); + + + pb_log(" language: %s\n", config->lang ?: ""); +} + +static bool config_debug_on_cmdline(void) +{ + char buf[600]; + int rc, fd; + + fd = open("/proc/cmdline", O_RDONLY); + if (fd < 0) + return false; + + rc = read(fd, buf, sizeof(buf)); + close(fd); + + if (rc <= 0) + return false; + + return memmem(buf, rc, kernel_cmdline_debug, + strlen(kernel_cmdline_debug)) != NULL; } void config_set_defaults(struct config *config) { + const char *lang; + config->autoboot_enabled = true; config->autoboot_timeout_sec = 10; + config->autoboot_enabled = true; config->network.interfaces = NULL; config->network.n_interfaces = 0; config->network.dns_servers = NULL; config->network.n_dns_servers = 0; + config->http_proxy = NULL; + config->https_proxy = NULL; + config->safe_mode = false; + config->allow_writes = true; + config->disable_snapshots = false; + + config->n_consoles = 0; + config->consoles = NULL; + config->boot_console = NULL; + + config->n_autoboot_opts = 2; + config->autoboot_opts = talloc_array(config, struct autoboot_option, + config->n_autoboot_opts); + config->autoboot_opts[0].boot_type = BOOT_DEVICE_TYPE; + config->autoboot_opts[0].type = DEVICE_TYPE_NETWORK; + config->autoboot_opts[1].boot_type = BOOT_DEVICE_TYPE; + config->autoboot_opts[1].type = DEVICE_TYPE_ANY; + + config->ipmi_bootdev = 0; + config->ipmi_bootdev_persistent = false; + + config->debug = config_debug_on_cmdline(); + + lang = setlocale(LC_ALL, NULL); + pb_log("lang: %s\n", lang); + if (lang && strlen(lang)) + config->lang = talloc_strdup(config, lang); + else + config->lang = NULL; - config->n_boot_priorities = 2; - config->boot_priorities = talloc_array(config, struct boot_priority, - config->n_boot_priorities); - config->boot_priorities[0].type = DEVICE_TYPE_NETWORK; - config->boot_priorities[0].priority = 2; - config->boot_priorities[1].type = DEVICE_TYPE_DISK; - config->boot_priorities[1].priority = 1; } int platform_init(void *ctx) @@ -134,6 +194,21 @@ const struct platform *platform_get(void) return platform; } +void platform_pre_boot(void) +{ + const struct config *config = config_get(); + + if (platform && config && platform->pre_boot) + platform->pre_boot(platform, config); +} + +int platform_get_sysinfo(struct system_info *info) +{ + if (platform && platform->get_sysinfo) + return platform->get_sysinfo(platform, info); + return -1; +} + int config_set(struct config *newconfig) { int rc;