logind: log wall messages to the journal

Currently kde installs a fake utmp session to listen for this. This provides an
alternative mechanism as discussed in #23574.

Example with 'shutdown 6 -r' and shutdown -c':
    PRIORITY=6
    SYSLOG_FACILITY=4
    SYSLOG_IDENTIFIER=systemd-logind
    ...
    CODE_FILE=src/login/logind-utmp.c
    CODE_LINE=90
    CODE_FUNC=warn_wall
    MESSAGE_ID=9e7066279dc8403da79ce4b1a69064b2
    OPERATOR=root
    MESSAGE=The system will reboot at Thu 2022-06-30 12:16:43 CEST!
    ACTION=reboot

    PRIORITY=5
    SYSLOG_FACILITY=4
    SYSLOG_IDENTIFIER=systemd-logind
    ...
    OPERATOR=root
    CODE_FILE=src/login/logind-dbus.c
    CODE_LINE=2407
    CODE_FUNC=method_cancel_scheduled_shutdown
    MESSAGE=System shutdown has been cancelled
    MESSAGE_ID=249f6fb9e6e2428c96f3f0875681ffa3
    ACTION=reboot
This commit is contained in:
Zbigniew Jędrzejewski-Szmek 2022-06-30 12:13:49 +02:00 committed by Luca Boccassi
parent f63d1b0efa
commit 9075066955
3 changed files with 35 additions and 14 deletions

View file

@ -2347,7 +2347,6 @@ static int method_cancel_scheduled_shutdown(sd_bus_message *message, void *userd
if (m->enable_wall_messages) {
_cleanup_(sd_bus_creds_unrefp) sd_bus_creds *creds = NULL;
_cleanup_free_ char *username = NULL;
const char *tty = NULL;
uid_t uid = 0;
@ -2357,7 +2356,14 @@ static int method_cancel_scheduled_shutdown(sd_bus_message *message, void *userd
(void) sd_bus_creds_get_tty(creds, &tty);
}
username = uid_to_name(uid);
_cleanup_free_ char *username = uid_to_name(uid);
log_struct(LOG_INFO,
LOG_MESSAGE("System shutdown has been cancelled"),
"ACTION=%s", handle_action_to_string(a->handle),
"MESSAGE_ID=" SD_MESSAGE_LOGIND_SHUTDOWN_CANCELED_STR,
username ? "OPERATOR=%s" : NULL, username);
utmp_wall("System shutdown has been cancelled",
username, tty, logind_wall_tty_filter, m);
}

View file

@ -64,30 +64,37 @@ bool logind_wall_tty_filter(const char *tty, bool is_local, void *userdata) {
}
static int warn_wall(Manager *m, usec_t n) {
int r;
assert(m);
if (!m->enable_wall_messages || !m->scheduled_shutdown_action)
if (!m->scheduled_shutdown_action)
return 0;
usec_t left = m->scheduled_shutdown_timeout > n;
bool left = m->scheduled_shutdown_timeout > n;
_cleanup_free_ char *l = NULL, *username = NULL;
r = asprintf(&l, "%s%sThe system will %s %s%s!",
_cleanup_free_ char *l = NULL;
if (asprintf(&l, "%s%sThe system will %s %s%s!",
strempty(m->wall_message),
isempty(m->wall_message) ? "" : "\n",
handle_action_verb_to_string(m->scheduled_shutdown_action->handle),
left ? "at " : "now",
left ? FORMAT_TIMESTAMP(m->scheduled_shutdown_timeout) : "");
if (r < 0) {
left ? FORMAT_TIMESTAMP(m->scheduled_shutdown_timeout) : "") < 0) {
log_oom();
return 0;
return 1; /* We're out-of-memory for now, but let's try to print the message later */
}
username = uid_to_name(m->scheduled_shutdown_uid);
utmp_wall(l, username, m->scheduled_shutdown_tty, logind_wall_tty_filter, m);
_cleanup_free_ char *username = uid_to_name(m->scheduled_shutdown_uid);
int level = left ? LOG_INFO : LOG_NOTICE;
log_struct(level,
LOG_MESSAGE("%s", l),
"ACTION=%s", handle_action_to_string(m->scheduled_shutdown_action->handle),
"MESSAGE_ID=" SD_MESSAGE_LOGIND_SHUTDOWN_STR,
username ? "OPERATOR=%s" : NULL, username);
if (m->enable_wall_messages)
utmp_wall(l, username, m->scheduled_shutdown_tty, logind_wall_tty_filter, m);
return 1;
}

View file

@ -203,6 +203,14 @@ _SD_BEGIN_DECLARATIONS;
#define SD_MESSAGE_TIME_SYNC SD_ID128_MAKE(7c,8a,41,f3,7b,76,49,41,a0,e1,78,0b,1b,e2,f0,37)
#define SD_MESSAGE_TIME_SYNC_STR SD_ID128_MAKE_STR(7c,8a,41,f3,7b,76,49,41,a0,e1,78,0b,1b,e2,f0,37)
#define SD_MESSAGE_LOGIND_SHUTDOWN SD_ID128_MAKE(9e,70,66,27,9d,c8,40,3d,a7,9c,e4,b1,a6,90,64,b2)
#define SD_MESSAGE_LOGIND_SHUTDOWN_STR SD_ID128_MAKE_STR(9e,70,66,27,9d,c8,40,3d,a7,9c,e4,b1,a6,90,64,b2)
#define SD_MESSAGE_LOGIND_SHUTDOWN_CANCELED \
SD_ID128_MAKE(24,9f,6f,b9,e6,e2,42,8c,96,f3,f0,87,56,81,ff,a3)
#define SD_MESSAGE_LOGIND_SHUTDOWN_CANCELED_STR \
SD_ID128_MAKE_STR(24,9f,6f,b9,e6,e2,42,8c,96,f3,f0,87,56,81,ff,a3)
_SD_END_DECLARATIONS;
#endif