GNU bug report logs - #74819
[PATCH] services: elogind: Support Hook Directories

Previous Next

Package: guix-patches;

Reported by: 45mg <45mg.writes <at> gmail.com>

Date: Thu, 12 Dec 2024 11:35:01 UTC

Severity: normal

Tags: patch

Done: Ludovic Courtès <ludo <at> gnu.org>

Bug is archived. No further changes may be made.

Full log


View this message in rfc822 format

From: help-debbugs <at> gnu.org (GNU bug Tracking System)
To: Ludovic Courtès <ludo <at> gnu.org>
Cc: tracker <at> debbugs.gnu.org
Subject: bug#74819: closed ([PATCH] services: elogind: Support Hook
 Directories)
Date: Mon, 30 Dec 2024 11:28:02 +0000
[Message part 1 (text/plain, inline)]
Your message dated Mon, 30 Dec 2024 12:26:43 +0100
with message-id <87msgdtnrg.fsf <at> gnu.org>
and subject line Re: [bug#74819] [PATCH v4] services: elogind: Support Hook Directories
has caused the debbugs.gnu.org bug report #74819,
regarding [PATCH] services: elogind: Support Hook Directories
to be marked as done.

(If you believe you have received this mail in error, please contact
help-debbugs <at> gnu.org.)


-- 
74819: https://debbugs.gnu.org/cgi/bugreport.cgi?bug=74819
GNU Bug Tracking System
Contact help-debbugs <at> gnu.org with problems
[Message part 2 (message/rfc822, inline)]
From: 45mg <45mg.writes <at> gmail.com>
To: guix-patches <at> gnu.org
Cc: 45mg <45mg.writes <at> gmail.com>
Subject: [PATCH] services: elogind: Support Hook Directories
Date: Thu, 12 Dec 2024 11:33:46 +0000
Allow the user to specify scripts to be added into Elogind's hook
directories. This gives users a way to run scripts before/after
suspend/hibernate/poweroff/reboot.

Also allow setting the related sleep config options.

* gnu/services/desktop.scm (elogind-configuration): add
`system-sleep-hook-files`, `system-shutdown-hook-files`,
`allow-power-off-interrupts?`, `allow-suspend-interrupts?`,
`broadcast-power-off-interrupts?`, `broadcast-suspend-interrupts?`.
(elogind-configuration-file): Add the corresponding entries under the
`[Sleep]` section.
(elogind-service-type): Extend `activation-service-type` with new
`elogind-activation`.
(elogind-activation): Copy the supplied script files into the hook
directories.
* doc/guix.texi: Document the new options.

Change-Id: I7e22cbaa9d031049b9d085ba0ce4cc8a8b4f16ff
---
 doc/guix.texi            | 27 ++++++++++++++++++++
 gnu/services/desktop.scm | 54 ++++++++++++++++++++++++++++++++++++++--
 2 files changed, 79 insertions(+), 2 deletions(-)

diff --git a/doc/guix.texi b/doc/guix.texi
index a2915de954..36977b9bbc 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -134,6 +134,7 @@
 Copyright @copyright{} 2024 Nigko Yerden@*
 Copyright @copyright{} 2024 Troy Figiel@*
 Copyright @copyright{} 2024 Sharlatan Hellseher@*
+Copyright @copyright{} 2024 45mg@*
 
 Permission is granted to copy, distribute and/or modify this document
 under the terms of the GNU Free Documentation License, Version 1.3 or
@@ -25282,6 +25283,32 @@ Desktop Services
 @item @code{suspend-estimation-seconds} (default: @code{*unspecified*}) (type: integer)
 ...
 
+@item @code{system-sleep-hook-files} (default: @code{'()}) (type: list)
+A list of executables (file-like objects) that will be installed into
+the @file{/etc/elogind/system-shutdown/} hook directory.
+
+@lisp
+(elogind-configuration
+ (system-sleep-hook-files
+  (list (local-file "sleep-script"))))
+@end lisp
+
+See `Hook directories' in the @code{loginctl(1)} man page for more information.
+
+@item @code{system-shutdown-hook-files} (default: @code{'()}) (type: list)
+A list of executables (file-like objects) that will be installed into
+the @file{/etc/elogind/system-shutdown/} hook directory.
+
+@item @code{allow-power-off-interrupts?} (default: @code{#f}) (type: boolean)
+@item @code{allow-suspend-interrupts?} (default: @code{#f}) (type: boolean)
+Whether the executables in Elogind's hook directories (see above) can
+cause a power-off or suspend action to be cancelled (interrupted) by
+printing an appropriate error message to stdout.
+
+@item @code{broadcast-power-off-interrupts?} (default: @code{#t}) (type: boolean)
+@item @code{broadcast-suspend-interrupts?} (default: @code{#t}) (type: boolean)
+Whether an interrupt of a power-off or suspend action is broadcasted.
+
 @end table
 @end deftp
 
diff --git a/gnu/services/desktop.scm b/gnu/services/desktop.scm
index 274aeeef9b..ed644385f5 100644
--- a/gnu/services/desktop.scm
+++ b/gnu/services/desktop.scm
@@ -17,6 +17,7 @@
 ;;; Copyright © 2021, 2022 muradm <mail <at> muradm.net>
 ;;; Copyright © 2023 Bruno Victal <mirai <at> makinata.eu>
 ;;; Copyright © 2023 Zheng Junjie <873216071 <at> qq.com>
+;;; Copyright © 2024 45mg <45mg.writes <at> gmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -1084,7 +1085,19 @@ (define-record-type* <elogind-configuration> elogind-configuration
   (hibernate-delay-seconds          elogind-hibernate-delay-seconds
                                     (default *unspecified*))
   (suspend-estimation-seconds       elogind-suspend-estimation-seconds
-                                    (default *unspecified*)))
+                                    (default *unspecified*))
+  (system-sleep-hook-files          elogind-system-sleep-hook-files
+                                    (default '()))
+  (system-shutdown-hook-files       elogind-system-shutdown-hook-files
+                                    (default '()))
+  (allow-power-off-interrupts?      elogind-allow-power-off-interrupts?
+                                    (default #f))
+  (allow-suspend-interrupts?        elogind-allow-suspend-interrupts?
+                                    (default #f))
+  (broadcast-power-off-interrupts?  elogind-broadcast-power-off-interrupts?
+                                    (default #t))
+  (broadcast-suspend-interrupts?    elogind-broadcast-suspend-interrupts?
+                                    (default #t)))
 
 (define (elogind-configuration-file config)
   (define (yesno x)
@@ -1172,7 +1185,40 @@ (define (elogind-configuration-file config)
    ("HybridSleepState" (sleep-list elogind-hybrid-sleep-state))
    ("HybridSleepMode" (sleep-list elogind-hybrid-sleep-mode))
    ("HibernateDelaySec" (maybe-non-negative-integer elogind-hibernate-delay-seconds))
-   ("SuspendEstimationSec" (maybe-non-negative-integer elogind-suspend-estimation-seconds))))
+   ("SuspendEstimationSec" (maybe-non-negative-integer elogind-suspend-estimation-seconds))
+   ("AllowPowerOffInterrupts" (yesno elogind-allow-power-off-interrupts?))
+   ("AllowSuspendInterrupts" (yesno elogind-allow-suspend-interrupts?))
+   ("BroadcastPowerOffInterrupts" (yesno elogind-broadcast-power-off-interrupts?))
+   ("BroadcastSuspendInterrupts" (yesno elogind-broadcast-suspend-interrupts?))))
+
+(define (elogind-activation config)
+  "Return the activation GEXP for CONFIG."
+
+  (with-imported-modules (source-module-closure '((guix build utils)))
+    #~(let ((sleep-dir "/etc/elogind/system-sleep/")
+            (shutdown-dir "/etc/elogind/system-shutdown/"))
+        (use-modules (guix build utils))
+
+        (define (install-script file dir)
+          "Copy FILE into DIR, giving executable (700) permissions."
+          (let ((dest (string-append dir "/" (basename file))))
+            (mkdir-p dir)
+            (copy-file file dest)
+            (chmod dest #o700)))
+
+        ;; Clear the sleep/shutdown directories
+        (for-each (lambda (d)
+                    (when (file-exists? d)
+                      (delete-file-recursively d)))
+                  (list sleep-dir shutdown-dir))
+
+        ;; Copy the files into them
+        (for-each
+         (lambda (f) (install-script f sleep-dir))
+         '#$(elogind-system-sleep-hook-files config))
+        (for-each
+         (lambda (f) (install-script f shutdown-dir))
+         '#$(elogind-system-shutdown-hook-files config)))))
 
 (define (elogind-dbus-service config)
   "Return a @file{org.freedesktop.login1.service} file that tells D-Bus how to
@@ -1294,6 +1340,10 @@ (define elogind-service-type
                        (service-extension pam-root-service-type
                                           pam-extension-procedure)
 
+                       ;; Install sleep/shutdown hook files.
+                       (service-extension activation-service-type
+                                          elogind-activation)
+
                        ;; We need /run/user, /run/systemd, etc.
                        (service-extension file-system-service-type
                                           (const %elogind-file-systems))))

base-commit: d916d3b1568a2def0dfb9089d61f2202db35beb7
-- 
2.46.0



[Message part 3 (message/rfc822, inline)]
From: Ludovic Courtès <ludo <at> gnu.org>
To: 45mg <45mg.writes <at> gmail.com>
Cc: Maxim Cournoyer <maxim.cournoyer <at> gmail.com>, 74819-done <at> debbugs.gnu.org
Subject: Re: [bug#74819] [PATCH v4] services: elogind: Support Hook Directories
Date: Mon, 30 Dec 2024 12:26:43 +0100
Hello,

45mg <45mg.writes <at> gmail.com> skribis:

> Allow the user to specify scripts to be added into Elogind's hook
> directories. These scripts will be run before/after
> suspend/hibernate/poweroff/reboot.
>
> Also allow setting the associated config options.
>
> * gnu/services/desktop.scm (elogind-configuration): add
> `system-sleep-hook-files`, `system-shutdown-hook-files`,
> and 4 new config options.
> (elogind-configuration-file): Add entries for the new config options
> under the `[Sleep]` section.
> (/etc/elogind): New function, to generate /etc/elogind directory.
> (elogind-service-type): Extend `etc-service-type` using `/etc/elogind`.
> * doc/guix.texi: Document the new options.
>
> Change-Id: I7e22cbaa9d031049b9d085ba0ce4cc8a8b4f16ff

I integrated the cosmetic changes Maxim proposed, tweaked the commit log
to better match our conventions, and applied it.

Thanks!

Ludo’.


This bug report was last modified 236 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.