Skip to content

Commit

Permalink
system-update-generator: warn if the command line blocks updates
Browse files Browse the repository at this point in the history
If "3", "5", "systemd.unit=", or similar are present on the kernel command line,
the system will not enter into offline update. This behaviour is in line with the
general logic that configuration on the kernel command line has higher priority
than the configuration on disk, but is rather surprising. Emit a warning to help
users diagnose the situation.

https://bugzilla.redhat.com/show_bug.cgi?id=1405439#c4
  • Loading branch information
keszybz committed Jan 28, 2017
1 parent 9cd7b12 commit aff8c8d
Showing 1 changed file with 36 additions and 0 deletions.
36 changes: 36 additions & 0 deletions src/system-update-generator/system-update-generator.c
Expand Up @@ -22,6 +22,7 @@

#include "fs-util.h"
#include "log.h"
#include "proc-cmdline.h"
#include "special.h"
#include "string-util.h"
#include "util.h"
Expand All @@ -47,9 +48,41 @@ static int generate_symlink(void) {
if (symlink(SYSTEM_DATA_UNIT_PATH "/system-update.target", p) < 0)
return log_error_errno(errno, "Failed to create symlink %s: %m", p);

return 1;
}

static int parse_proc_cmdline_item(const char *key, const char *value, void *data) {
assert(key);

if (streq(key, "systemd.unit")) {
if (proc_cmdline_value_missing(key, value))
return 0;

log_warning("Offline system update overriden by kernel command line systemd.unit= setting");

} else if (!value) {
const char *target;

target = runlevel_to_target(key);
if (target)
log_warning("Offline system update overriden by runlevel \"%s\" on the kernel command line", key);
}

return 0;
}

static void maybe_warn(void) {
/* Check if a run level is specified on the kernel command line. The
* command line has higher priority than any on-disk configuration, so
* it'll make any symlink we create moot.
*/
int r;

r = proc_cmdline_parse(parse_proc_cmdline_item, NULL, 0);
if (r < 0)
log_warning_errno(r, "Failed to parse kernel command line, ignoring: %m");
}

int main(int argc, char *argv[]) {
int r;

Expand All @@ -69,5 +102,8 @@ int main(int argc, char *argv[]) {

r = generate_symlink();

if (r > 0)
maybe_warn();

return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
}

0 comments on commit aff8c8d

Please sign in to comment.