]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
systemctl: add shutdown --show option
authorLudwig Nussel <ludwig.nussel@suse.de>
Wed, 8 Dec 2021 11:48:35 +0000 (12:48 +0100)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Thu, 9 Dec 2021 14:07:40 +0000 (15:07 +0100)
Shows the scheduled shutdown action and time if there's one.

man/shutdown.xml
src/systemctl/systemctl-compat-shutdown.c
src/systemctl/systemctl-logind.c
src/systemctl/systemctl-logind.h
src/systemctl/systemctl.c
src/systemctl/systemctl.h

index f29010f6b653f910363810a44d9219564fbd2c77..b07736ee680111a111c9fc50e0b1ed55d226c4ca 100644 (file)
         <literal>now</literal>.</para></listitem>
       </varlistentry>
 
+      <varlistentry>
+        <term><option>--show</option></term>
+
+        <listitem><para>Show a pending shutdown action and time if
+        there is any.</para></listitem>
+      </varlistentry>
+
     </variablelist>
   </refsect1>
 
index 5e613e2aa20ba79792d00e0aa1d7d21b8b0b4ec1..6571802f95bf8bbd972e5d169630acdc30b05941 100644 (file)
@@ -28,6 +28,7 @@ static int shutdown_help(void) {
                "  -k             Don't halt/power-off/reboot, just send warnings\n"
                "     --no-wall   Don't send wall message before halt/power-off/reboot\n"
                "  -c             Cancel a pending shutdown\n"
+               "     --show      Show pending shutdown\n"
                "\nSee the %s for details.\n",
                program_invocation_short_name,
                ansi_highlight(),
@@ -40,7 +41,8 @@ static int shutdown_help(void) {
 int shutdown_parse_argv(int argc, char *argv[]) {
         enum {
                 ARG_HELP = 0x100,
-                ARG_NO_WALL
+                ARG_NO_WALL,
+                ARG_SHOW
         };
 
         static const struct option options[] = {
@@ -50,6 +52,7 @@ int shutdown_parse_argv(int argc, char *argv[]) {
                 { "reboot",    no_argument,       NULL, 'r'         },
                 { "kexec",     no_argument,       NULL, 'K'         }, /* not documented extension */
                 { "no-wall",   no_argument,       NULL, ARG_NO_WALL },
+                { "show",      no_argument,       NULL, ARG_SHOW    },
                 {}
         };
 
@@ -108,6 +111,10 @@ int shutdown_parse_argv(int argc, char *argv[]) {
                         arg_action = ACTION_CANCEL_SHUTDOWN;
                         break;
 
+                case ARG_SHOW:
+                        arg_action = ACTION_SHOW_SHUTDOWN;
+                        break;
+
                 case '?':
                         return -EINVAL;
 
index b1c0e13f2cd716bbf90f3e9392e33b4956800371..2d2043f1772c9ddebdfc3e58de96cb50937390f7 100644 (file)
@@ -372,6 +372,41 @@ int logind_cancel_shutdown(void) {
 #endif
 }
 
+int logind_show_shutdown(void) {
+#if ENABLE_LOGIND
+        _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
+        _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
+        sd_bus *bus;
+        const char *action = NULL;
+        uint64_t elapse;
+        int r;
+
+        r = acquire_bus(BUS_FULL, &bus);
+        if (r < 0)
+                return r;
+
+        r = bus_get_property(bus, bus_login_mgr, "ScheduledShutdown", &error, &reply, "(st)");
+        if (r < 0)
+                return log_error_errno(r, "Failed to query scheduled shutdown: %s", bus_error_message(&error, r));
+
+        r = sd_bus_message_read(reply, "(st)", &action, &elapse);
+        if (r < 0)
+                return r;
+
+        if (isempty(action))
+                return log_error_errno(SYNTHETIC_ERRNO(ENODATA), "No scheduled shutdown.");
+
+        log_info("%s scheduled for %s, use 'shutdown -c' to cancel.",
+                 action,
+                 FORMAT_TIMESTAMP_STYLE(arg_when, arg_timestamp_style));
+
+        return 0;
+#else
+        return log_error_errno(SYNTHETIC_ERRNO(ENOSYS),
+                               "Not compiled with logind support, cannot show scheduled shutdowns.");
+#endif
+}
+
 int help_boot_loader_entry(void) {
 #if ENABLE_LOGIND
         _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
index 144056b93978786ec961c3cd3c4bed76f6fec08f..6e73cb762520c576e25e27f42514c180ad75ed75 100644 (file)
@@ -14,5 +14,6 @@ int prepare_boot_loader_entry(void);
 
 int logind_schedule_shutdown(void);
 int logind_cancel_shutdown(void);
+int logind_show_shutdown(void);
 
 int help_boot_loader_entry(void);
index 6f76a63165e987ab4e0f40a07ffd956735ebae36..9031e685ea53ca9dddd3fd8a0d96686d37b38289 100644 (file)
@@ -1169,6 +1169,10 @@ static int run(int argc, char *argv[]) {
                 r = logind_cancel_shutdown();
                 break;
 
+        case ACTION_SHOW_SHUTDOWN:
+                r = logind_show_shutdown();
+                break;
+
         case ACTION_RUNLEVEL:
                 r = runlevel_main();
                 break;
index 8199ae9e0d3032d11c0198c98f8fd05f6c06c1a5..d6b9d7495c40f2d3648168af29e8d8680e6a615d 100644 (file)
@@ -32,6 +32,7 @@ enum action {
         ACTION_RUNLEVEL,
         ACTION_TELINIT,
         ACTION_CANCEL_SHUTDOWN,
+        ACTION_SHOW_SHUTDOWN,
         _ACTION_MAX,
         _ACTION_INVALID = -EINVAL,
 };