+#define _GNU_SOURCE
+
+#include <fcntl.h>
#include <string.h>
+#include <locale.h>
#include <log/log.h>
+#include <file/file.h>
#include <types/types.h>
#include <talloc/talloc.h>
static struct platform *platform;
static struct config *config;
+static const char *kernel_cmdline_debug = "petitboot.debug";
+
static void dump_config(struct config *config)
{
unsigned int i;
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];
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]);
+
+ 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->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[1].type = DEVICE_TYPE_DISK;
+ 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;
}
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;