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> <variablelist>
<xi:include href="standard-options.xml" xpointer="help" /> <xi:include href="standard-options.xml" xpointer="help" />
<xi:include href="standard-options.xml" xpointer="version" /> <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> </variablelist>
</refsect1> </refsect1>
<refsect1> <refsect1>

View File

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

View File

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

View File

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