]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
logind: log wall messages to the journal
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Thu, 30 Jun 2022 10:13:49 +0000 (12:13 +0200)
committerLuca Boccassi <luca.boccassi@gmail.com>
Thu, 30 Jun 2022 18:28:41 +0000 (19:28 +0100)
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

src/login/logind-dbus.c
src/login/logind-utmp.c
src/systemd/sd-messages.h

index 031b96e9f152c155cb9631f59c1f842d8d02d736..a426842bbb3aa9faf8456465d958626662af72e0 100644 (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);
         }
index ccf959cd7325effbff19385794a222737e4d743b..06b1bcf9b46944ac359c507a9f56be0e90d35ba9 100644 (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;
 }
index 7238137e318b891fc37e9351b662bce115fc5639..bafaa065f00cce36c80388690420d317608ce5b7 100644 (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