Skip to content

Commit

Permalink
logind: log wall messages to the journal
Browse files Browse the repository at this point in the history
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
  • Loading branch information
keszybz authored and bluca committed Jun 30, 2022
1 parent f63d1b0 commit 9075066
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 14 deletions.
10 changes: 8 additions & 2 deletions src/login/logind-dbus.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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);

This comment has been minimized.

Copy link
@poettering

poettering Aug 10, 2022

Member

"operator"? that's a new word we haven't used so far?

maybe REQUESTED_BY_USER=?

This comment has been minimized.

Copy link
@keszybz

keszybz Aug 17, 2022

Author Member

I think "operator" is appropriate. It is clear, and this use matches the dictionary meaning of "administrator":

1. One who operates.
7. (computing) The administrator of a or network.


utmp_wall("System shutdown has been cancelled",
username, tty, logind_wall_tty_filter, m);
}
Expand Down
31 changes: 19 additions & 12 deletions src/login/logind-utmp.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down
8 changes: 8 additions & 0 deletions src/systemd/sd-messages.h
Original file line number Diff line number Diff line change
Expand Up @@ -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)

This comment has been minimized.

Copy link
@poettering

poettering Aug 10, 2022

Member

hmm "logind"? why carry that in the name? we usually don't carry that in the name?

Shouldn't this be SD_MESSAGE_SCHEDULED_SHUTDOWN or so?

This comment has been minimized.

Copy link
@keszybz

keszybz Aug 17, 2022

Author Member

#24341

#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)

This comment has been minimized.

Copy link
@poettering

poettering Aug 10, 2022

Member

and then SD_MESSAGE_SCHEDULED_SCHEDULED_SHUTDOWN?


This comment has been minimized.

Copy link
@poettering

poettering Aug 10, 2022

Member

these message ids really should come with entries in the catalog

_SD_END_DECLARATIONS;

#endif

0 comments on commit 9075066

Please sign in to comment.