Merge pull request #28697 from 1awesomeJ/new_bsod

systemd-bsod: Add "--continuous" option
This commit is contained in:
Luca Boccassi 2023-08-18 00:20:04 +01:00 committed by GitHub
commit b24d10e35a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 70 additions and 16 deletions

View file

@ -43,7 +43,16 @@
<variablelist>
<xi:include href="standard-options.xml" xpointer="help" />
<xi:include href="standard-options.xml" xpointer="version" />
<varlistentry>
<term><option>-c</option></term>
<term><option>--continuous</option></term>
<listitem><para> Used to make systemd-bsod wait continuously for changes in the
journal's status if doesn't find any emergency messages on initial attempt.</para></listitem>
</varlistentry>
</variablelist>
</refsect1>
<refsect1>

View file

@ -22,6 +22,8 @@
#include "sysctl-util.h"
#include "terminal-util.h"
static bool arg_continuous = false;
static int help(void) {
_cleanup_free_ char *link = NULL;
int r;
@ -36,6 +38,8 @@ static int help(void) {
"as a string and a QR code.\n\n%s"
" -h --help Show this help\n"
" --version Show package version\n"
" -c --continuous Make systemd-bsod wait continuously\n"
"for changes in the journal\n"
"\nSee the %s for details.\n",
program_invocation_short_name,
ansi_highlight(),
@ -75,13 +79,24 @@ static int acquire_first_emergency_log_message(char **ret) {
if (r < 0)
return log_error_errno(r, "Failed to seek to start of jornal: %m");
r = sd_journal_next(j);
if (r < 0)
return log_error_errno(r, "Failed to read next journal entry: %m");
if (r == 0) {
log_debug("No emergency level entries in the journal");
*ret = NULL;
return 0;
for(;;) {
r = sd_journal_next(j);
if (r < 0)
return log_error_errno(r, "Failed to read next journal entry: %m");
if (r > 0)
break;
if (!arg_continuous) {
log_debug("No emergency level entries in the journal");
*ret = NULL;
return 0;
}
r = sd_journal_wait(j, (uint64_t) -1);
if (r < 0)
return log_error_errno(r, "Failed to wait for changes: %m");
continue;
}
r = sd_journal_get_data(j, "MESSAGE", &d, &l);
@ -210,6 +225,7 @@ static int parse_argv(int argc, char * argv[]) {
static const struct option options[] = {
{ "help", no_argument, NULL, 'h' },
{ "version", no_argument, NULL, ARG_VERSION },
{ "continuous", no_argument, NULL, 'c' },
{}
};
@ -218,7 +234,7 @@ static int parse_argv(int argc, char * argv[]) {
assert(argc >= 0);
assert(argv);
while ((c = getopt_long(argc, argv, "h", options, NULL)) >= 0)
while ((c = getopt_long(argc, argv, "hc", options, NULL)) >= 0)
switch (c) {
@ -228,6 +244,10 @@ static int parse_argv(int argc, char * argv[]) {
case ARG_VERSION:
return version();
case 'c':
arg_continuous = true;
break;
case '?':
return -EINVAL;

View file

@ -72,6 +72,13 @@ executables += [
threads,
],
},
libexec_template + {
'name' : 'systemd-bsod',
'conditions' : ['HAVE_QRENCODE'],
'sources' : files('bsod.c'),
'link_with' : libshared,
'dependencies' : libqrencode,
},
executable_template + {
'name' : 'systemd-cat',
'public' : true,
@ -95,14 +102,6 @@ executables += [
threads,
],
},
executable_template + {
'name' : 'systemd-bsod',
'conditions' : ['HAVE_QRENCODE'],
'public' : true,
'sources' : files('bsod.c'),
'link_with' : libshared,
'dependencies' : libqrencode,
},
journal_test_template + {
'sources' : files('test-journal-append.c'),
'type' : 'manual',

View file

@ -60,6 +60,11 @@ units = [
'conditions' : ['ENABLE_INITRD'],
'symlinks' : ['initrd.target.wants/'],
},
{
'file' : 'systemd-bsod.service.in',
'conditions' : ['HAVE_QRENCODE','ENABLE_INITRD'],
'symlinks' : ['initrd.target.wants/'],
},
{
'file' : 'initrd-cleanup.service',
'conditions' : ['ENABLE_INITRD'],

View file

@ -0,0 +1,21 @@
# SPDX-License-Identifier: LGPL-2.1-or-later
#
# This file is part of systemd.
#
# 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.
[Unit]
Description=Displays emergency message full screen.
Documentation=man:systemd-bsod(8)
ConditionVirtualization=no
DefaultDependencies=no
Conflicts=shutdown.target
Before=shutdown.target
After=systemd-battery-check.service
[Service]
RemainAfterExit=yes
ExecStart={{LIBEXECDIR}}/systemd-bsod --continuous