unofficial mirror of guix-patches@gnu.org 
 help / color / mirror / code / Atom feed
* [bug#74819] [PATCH] services: elogind: Support Hook Directories
@ 2024-12-12 11:33 45mg
  2024-12-12 13:00 ` 45mg
                   ` (3 more replies)
  0 siblings, 4 replies; 8+ messages in thread
From: 45mg @ 2024-12-12 11:33 UTC (permalink / raw)
  To: 74819; +Cc: 45mg, Ludovic Courtès, Maxim Cournoyer

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@muradm.net>
 ;;; Copyright © 2023 Bruno Victal <mirai@makinata.eu>
 ;;; Copyright © 2023 Zheng Junjie <873216071@qq.com>
+;;; Copyright © 2024 45mg <45mg.writes@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





^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [bug#74819] [PATCH] services: elogind: Support Hook Directories
  2024-12-12 11:33 [bug#74819] [PATCH] services: elogind: Support Hook Directories 45mg
@ 2024-12-12 13:00 ` 45mg
  2024-12-16  6:26 ` [bug#74819] [PATCH v2] " 45mg
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 8+ messages in thread
From: 45mg @ 2024-12-12 13:00 UTC (permalink / raw)
  To: 74819

[-- Attachment #1: Type: text/plain, Size: 465 bytes --]


Here's how I tested these changes if anyone is interested:

- Add the files included here into a `testdir` directory
- Compile
  guix shell -D guix --pure -- make
- Test in a container (no loginctl sessions, but will catch obvious errors)
  sudo $(./pre-inst-env guix system container path/to/testdir/test-config.scm)
- Test in a VM (need --full-boot for the ability to suspend, etc)
  $(./pre-inst-env guix system vm --full-boot path/to/testdir/test-config.scm)


[-- Attachment #2: test-config.scm --]
[-- Type: application/octet-stream, Size: 1348 bytes --]

(use-modules (gnu)
             (gnu home)
             (gnu home services dotfiles))
(use-service-modules cups desktop networking ssh xorg)

(operating-system
  (locale "en_US.utf8")
  (timezone "America/New_York")
  (keyboard-layout (keyboard-layout "us"))
  (host-name "guix-test")

  (users (cons* (user-account
                  (name "user")
                  (comment "Non-root user")
                  (group "users")
                  (home-directory "/home/user")
                  (supplementary-groups '("wheel" "netdev" "audio" "video")))
                %base-user-accounts))

  (packages %base-packages)

  (services
   (append (list (service elogind-service-type
                          (elogind-configuration
                           (system-sleep-hook-files
                            (list
                             (local-file
                              "test-sleep-script"))))))
           %base-services))

  (bootloader (bootloader-configuration
                (bootloader grub-bootloader)
                (targets (list "/dev/sda"))
                (keyboard-layout keyboard-layout)))

  (file-systems (cons* (file-system
                         (mount-point "/")
                         (device (file-system-label "dummy"))
                         (type "ext4"))
                       %base-file-systems)))

[-- Attachment #3: test-sleep-script --]
[-- Type: application/octet-stream, Size: 52 bytes --]

#!/bin/sh
echo "$@" >> /root/elogind-test-sleep-log

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [bug#74819] [PATCH v2] services: elogind: Support Hook Directories
  2024-12-12 11:33 [bug#74819] [PATCH] services: elogind: Support Hook Directories 45mg
  2024-12-12 13:00 ` 45mg
@ 2024-12-16  6:26 ` 45mg
  2024-12-16  6:37   ` 45mg
  2024-12-18 12:18 ` [bug#74819] [PATCH v3] " 45mg
  2024-12-27 12:15 ` [bug#74819] [PATCH v4] " 45mg
  3 siblings, 1 reply; 8+ messages in thread
From: 45mg @ 2024-12-16  6:26 UTC (permalink / raw)
  To: 74819; +Cc: 45mg, Ludovic Courtès, Maxim Cournoyer

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
---
 doc/guix.texi            | 27 +++++++++++++++++++++
 gnu/services/desktop.scm | 51 ++++++++++++++++++++++++++++++++++++++--
 2 files changed, 76 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..9614ee8aea 100644
--- a/gnu/services/desktop.scm
+++ b/gnu/services/desktop.scm
@@ -17,6 +17,7 @@
 ;;; Copyright © 2021, 2022 muradm <mail@muradm.net>
 ;;; Copyright © 2023 Bruno Victal <mirai@makinata.eu>
 ;;; Copyright © 2023 Zheng Junjie <873216071@qq.com>
+;;; Copyright © 2024 45mg <45mg.writes@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,35 @@ (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 (/etc/elogind config)
+  "Return the /etc/elogind directory for CONFIG."
+  (with-imported-modules (source-module-closure '((guix build utils)))
+    (computed-file
+     "etc-elogind"
+
+     #~(let ((sleep-dir (string-append #$output "/system-sleep/"))
+             (shutdown-dir (string-append #$output "/system-shutdown/")))
+         (use-modules (guix build utils))
+
+         (define (copy-script file dir)
+           "Copy FILE into DIR, giving rx (500) permissions."
+           (let ((dest (string-append dir "/" (basename file))))
+             (mkdir-p dir)
+             (copy-file file dest)
+             (chmod dest #o500)))
+
+         (for-each
+          (lambda (f) (copy-script f sleep-dir))
+          '#$(elogind-system-sleep-hook-files config))
+         (for-each
+          (lambda (f) (copy-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 +1335,12 @@ (define elogind-service-type
                        (service-extension pam-root-service-type
                                           pam-extension-procedure)
 
+                       ;; Install sleep/shutdown hook files.
+                       (service-extension etc-service-type
+                                          (lambda (config)
+                                            `(("elogind" ,(/etc/elogind config)))))
+
+
                        ;; We need /run/user, /run/systemd, etc.
                        (service-extension file-system-service-type
                                           (const %elogind-file-systems))))

base-commit: d916d3b1568a2def0dfb9089d61f2202db35beb7
-- 
2.46.0





^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [bug#74819] [PATCH v2] services: elogind: Support Hook Directories
  2024-12-16  6:26 ` [bug#74819] [PATCH v2] " 45mg
@ 2024-12-16  6:37   ` 45mg
  0 siblings, 0 replies; 8+ messages in thread
From: 45mg @ 2024-12-16  6:37 UTC (permalink / raw)
  To: 45mg, 74819; +Cc: 45mg


This revision extends `etc-service-type` instead of
`activation-service-type`, which allows us to avoid duplicating the
functionality of the former.

(forgot to --annotate the revision, so I'm mentioning it here)




^ permalink raw reply	[flat|nested] 8+ messages in thread

* [bug#74819] [PATCH v3] services: elogind: Support Hook Directories
  2024-12-12 11:33 [bug#74819] [PATCH] services: elogind: Support Hook Directories 45mg
  2024-12-12 13:00 ` 45mg
  2024-12-16  6:26 ` [bug#74819] [PATCH v2] " 45mg
@ 2024-12-18 12:18 ` 45mg
  2024-12-23 18:00   ` Ludovic Courtès
  2024-12-27 12:15 ` [bug#74819] [PATCH v4] " 45mg
  3 siblings, 1 reply; 8+ messages in thread
From: 45mg @ 2024-12-18 12:18 UTC (permalink / raw)
  To: 74819; +Cc: 45mg

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
---
This revision fixes a typo in doc/guix.texi.

Also, I guess I should have CC'ed the mentors team from the start. Doing
that here.

 doc/guix.texi            | 27 +++++++++++++++++++++
 gnu/services/desktop.scm | 51 ++++++++++++++++++++++++++++++++++++++--
 2 files changed, 76 insertions(+), 2 deletions(-)

diff --git a/doc/guix.texi b/doc/guix.texi
index a2915de954..e6f1edadbf 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-sleep/} hook directory. For example:
+
+@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..9614ee8aea 100644
--- a/gnu/services/desktop.scm
+++ b/gnu/services/desktop.scm
@@ -17,6 +17,7 @@
 ;;; Copyright © 2021, 2022 muradm <mail@muradm.net>
 ;;; Copyright © 2023 Bruno Victal <mirai@makinata.eu>
 ;;; Copyright © 2023 Zheng Junjie <873216071@qq.com>
+;;; Copyright © 2024 45mg <45mg.writes@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,35 @@ (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 (/etc/elogind config)
+  "Return the /etc/elogind directory for CONFIG."
+  (with-imported-modules (source-module-closure '((guix build utils)))
+    (computed-file
+     "etc-elogind"
+
+     #~(let ((sleep-dir (string-append #$output "/system-sleep/"))
+             (shutdown-dir (string-append #$output "/system-shutdown/")))
+         (use-modules (guix build utils))
+
+         (define (copy-script file dir)
+           "Copy FILE into DIR, giving rx (500) permissions."
+           (let ((dest (string-append dir "/" (basename file))))
+             (mkdir-p dir)
+             (copy-file file dest)
+             (chmod dest #o500)))
+
+         (for-each
+          (lambda (f) (copy-script f sleep-dir))
+          '#$(elogind-system-sleep-hook-files config))
+         (for-each
+          (lambda (f) (copy-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 +1335,12 @@ (define elogind-service-type
                        (service-extension pam-root-service-type
                                           pam-extension-procedure)
 
+                       ;; Install sleep/shutdown hook files.
+                       (service-extension etc-service-type
+                                          (lambda (config)
+                                            `(("elogind" ,(/etc/elogind config)))))
+
+
                        ;; We need /run/user, /run/systemd, etc.
                        (service-extension file-system-service-type
                                           (const %elogind-file-systems))))

base-commit: d916d3b1568a2def0dfb9089d61f2202db35beb7
-- 
2.46.0





^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [bug#74819] [PATCH v3] services: elogind: Support Hook Directories
  2024-12-18 12:18 ` [bug#74819] [PATCH v3] " 45mg
@ 2024-12-23 18:00   ` Ludovic Courtès
  0 siblings, 0 replies; 8+ messages in thread
From: Ludovic Courtès @ 2024-12-23 18:00 UTC (permalink / raw)
  To: 45mg
  Cc: Simon Tournier, paren, Tobias Geerinckx-Rice, jgart, 74819,
	Mathieu Othacehe, Christopher Baines

Hi,

45mg <45mg.writes@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

Nice!


[...]

> +@item @code{allow-power-off-interrupts?} (default: @code{#f}) (type: boolean)
> +@item @code{allow-suspend-interrupts?} (default: @code{#f}) (type: boolean)

Write “@itemx” for the second line: both will show up next to one
another.

> +Whether the executables in Elogind's hook directories (see above) can

I believe “elogind” is usually spelled lower-case.

> +@item @code{broadcast-power-off-interrupts?} (default: @code{#t}) (type: boolean)
> +@item @code{broadcast-suspend-interrupts?} (default: @code{#t}) (type: boolean)

“@itemx” as well.

> +(define (/etc/elogind config)

By convention, I’d call it ‘elogind-etc-directory’.
> +     #~(let ((sleep-dir (string-append #$output "/system-sleep/"))
> +             (shutdown-dir (string-append #$output "/system-shutdown/")))
> +         (use-modules (guix build utils))

‘use-modules’ should always be used at the top level; it’s not
guaranteed to work otherwise (it wouldn’t work if the module exports
macros, for instance).

Also, please avoid abbreviations.

So that gives something like:

  #~(begin
      (use-modules (guix build utils))

      (define sleep-directory (string-append #$output "/system-sleep"))
      (define shutdown-directory (string-append #$output "/system-shutdown"))

      …)

Apart from these minor issues, the patch looks great to me.

Could you send an updated version?

Thanks!

Ludo’.




^ permalink raw reply	[flat|nested] 8+ messages in thread

* [bug#74819] [PATCH v4] services: elogind: Support Hook Directories
  2024-12-12 11:33 [bug#74819] [PATCH] services: elogind: Support Hook Directories 45mg
                   ` (2 preceding siblings ...)
  2024-12-18 12:18 ` [bug#74819] [PATCH v3] " 45mg
@ 2024-12-27 12:15 ` 45mg
  2024-12-28  5:46   ` Maxim Cournoyer
  3 siblings, 1 reply; 8+ messages in thread
From: 45mg @ 2024-12-27 12:15 UTC (permalink / raw)
  To: 74819; +Cc: 45mg, Ludovic Courtès, Maxim Cournoyer

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
---
 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 31deb5b003..5324a5f67a 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
@@ -25366,6 +25367,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-sleep/} hook directory. For example:
+
+@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)
+@itemx @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)
+@itemx @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 4f679485bc..da96b3bc47 100644
--- a/gnu/services/desktop.scm
+++ b/gnu/services/desktop.scm
@@ -17,6 +17,7 @@
 ;;; Copyright © 2021, 2022 muradm <mail@muradm.net>
 ;;; Copyright © 2023 Bruno Victal <mirai@makinata.eu>
 ;;; Copyright © 2023 Zheng Junjie <873216071@qq.com>
+;;; Copyright © 2024 45mg <45mg.writes@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,38 @@ (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-etc-directory config)
+  "Return the /etc/elogind directory for CONFIG."
+  (with-imported-modules (source-module-closure '((guix build utils)))
+    (computed-file
+     "etc-elogind"
+
+     #~(begin
+         (use-modules (guix build utils))
+
+         (define sleep-directory (string-append #$output "/system-sleep/"))
+         (define shutdown-directory (string-append #$output "/system-shutdown/"))
+
+         (define (copy-script file directory)
+           "Copy FILE into DIRECTORY, giving rx (500) permissions."
+           (let ((dest (string-append directory "/" (basename file))))
+             (mkdir-p directory)
+             (copy-file file dest)
+             (chmod dest #o500)))
+
+         (mkdir-p #$output) ; in case neither directory gets created
+         (for-each
+          (lambda (f) (copy-script f sleep-directory))
+          '#$(elogind-system-sleep-hook-files config))
+         (for-each
+          (lambda (f) (copy-script f shutdown-directory))
+          '#$(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 +1338,12 @@ (define elogind-service-type
                        (service-extension pam-root-service-type
                                           pam-extension-procedure)
 
+                       ;; Install sleep/shutdown hook files.
+                       (service-extension etc-service-type
+                                          (lambda (config)
+                                            `(("elogind"
+                                               ,(elogind-etc-directory config)))))
+
                        ;; We need /run/user, /run/systemd, etc.
                        (service-extension file-system-service-type
                                           (const %elogind-file-systems))))

base-commit: 3ada4796e9adcea6fce621e639ddbfb181ab6689
-- 
2.47.1





^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [bug#74819] [PATCH v4] services: elogind: Support Hook Directories
  2024-12-27 12:15 ` [bug#74819] [PATCH v4] " 45mg
@ 2024-12-28  5:46   ` Maxim Cournoyer
  0 siblings, 0 replies; 8+ messages in thread
From: Maxim Cournoyer @ 2024-12-28  5:46 UTC (permalink / raw)
  To: 45mg; +Cc: Ludovic Courtès, 74819

Hi,

45mg <45mg.writes@gmail.com> writes:

> 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.

Soods good.

[...]

> +(define (elogind-etc-directory config)
> +  "Return the /etc/elogind directory for CONFIG."
> +  (with-imported-modules (source-module-closure '((guix build utils)))
> +    (computed-file
> +     "etc-elogind"
> +
> +     #~(begin
> +         (use-modules (guix build utils))
> +
> +         (define sleep-directory (string-append #$output "/system-sleep/"))
> +         (define shutdown-directory (string-append #$output "/system-shutdown/"))
> +
> +         (define (copy-script file directory)
> +           "Copy FILE into DIRECTORY, giving rx (500) permissions."
> +           (let ((dest (string-append directory "/" (basename file))))
> +             (mkdir-p directory)
> +             (copy-file file dest)
> +             (chmod dest #o500)))
> +
> +         (mkdir-p #$output) ; in case neither directory gets created

Unimportant nitpick: please keep more than 2 spaces between the code and
a comment (I use M-; in Emacs to do so); also prefer to avoid the space
between ';' and the comment for in-line comment only (that's a 'may',
not a 'must' according to our referenced style guide [0] though).

[0]  https://mumble.net/~campbell/scheme/style.txt

> +         (for-each
> +          (lambda (f) (copy-script f sleep-directory))

I've move the copy-script on its own line under the lambda, which is
more conventional.

> +          '#$(elogind-system-sleep-hook-files config))j
> +         (for-each
> +          (lambda (f) (copy-script f shutdown-directory))

Likewise.

Other than these tiny cosmetic things, it LGTM:

Reviewed-by: Maxim Cournoyer <maxim.cournoyer@gmail>

-- 
Thanks,
Maxim




^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2024-12-28  5:48 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-12-12 11:33 [bug#74819] [PATCH] services: elogind: Support Hook Directories 45mg
2024-12-12 13:00 ` 45mg
2024-12-16  6:26 ` [bug#74819] [PATCH v2] " 45mg
2024-12-16  6:37   ` 45mg
2024-12-18 12:18 ` [bug#74819] [PATCH v3] " 45mg
2024-12-23 18:00   ` Ludovic Courtès
2024-12-27 12:15 ` [bug#74819] [PATCH v4] " 45mg
2024-12-28  5:46   ` Maxim Cournoyer

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/guix.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).