diff options
author | Lennart Poettering <lennart@poettering.net> | 2014-07-07 15:05:37 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2014-07-07 15:25:55 +0200 |
commit | 418b9be50018303cde79b423d4701b7fd86ddbdc (patch) | |
tree | 9686495c5b3f975cbe8d2e2cfb5abb7e64b21ed3 /src/firstboot/firstboot-generator.c | |
parent | 037c26d0aeb750ca9c8d605884ea1db7baecfea8 (diff) |
firstboot: add new component to query basic system settings on first boot, or when creating OS images offline
A new tool "systemd-firstboot" can be used either interactively on boot,
where it will query basic locale, timezone, hostname, root password
information and set it. Or it can be used non-interactively from the
command line when prepareing disk images for booting. When used
non-inertactively the tool can either copy settings from the host, or
take settings on the command line.
$ systemd-firstboot --root=/path/to/my/new/root --copy-locale --copy-root-password --hostname=waldi
The tool will be automatically invoked (interactively) now on first boot
if /etc is found unpopulated.
This also creates the infrastructure for generators to be notified via
an environment variable whether they are running on the first boot, or
not.
Diffstat (limited to 'src/firstboot/firstboot-generator.c')
-rw-r--r-- | src/firstboot/firstboot-generator.c | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/src/firstboot/firstboot-generator.c b/src/firstboot/firstboot-generator.c new file mode 100644 index 0000000000..6d23f40fa2 --- /dev/null +++ b/src/firstboot/firstboot-generator.c @@ -0,0 +1,71 @@ +/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ + +/*** + This file is part of systemd. + + Copyright 2014 Lennart Poettering + + systemd is free software; you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + systemd is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with systemd; If not, see <http://www.gnu.org/licenses/>. +***/ + +#include "util.h" +#include "mkdir.h" + +static const char *arg_dest = "/tmp"; + +static bool is_first_boot(void) { + const char *e; + + e = getenv("SYSTEMD_FIRST_BOOT"); + if (!e) + return false; + + return parse_boolean(e) > 0; +} + +int main(int argc, char *argv[]) { + int r; + + if (argc > 1 && argc != 4) { + log_error("This program takes three or no arguments."); + return EXIT_FAILURE; + } + + if (argc > 1) + arg_dest = argv[2]; + + log_set_target(LOG_TARGET_SAFE); + log_parse_environment(); + log_open(); + + umask(0022); + + if (is_first_boot()) { + const char *t; + + t = strappenda(arg_dest, "/default.target.wants/systemd-firstboot.service"); + + mkdir_parents(t, 0755); + if (symlink(SYSTEM_DATA_UNIT_PATH "/systemd-firstboot.service", t) < 0 && errno != EEXIST) { + log_error("Failed to create firstboot service symlinks %s: %m", t); + r = -errno; + goto finish; + } + } + + r = 0; + +finish: + return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; +} |