* [bug#74819] [PATCH] services: elogind: Support Hook Directories
@ 2024-12-12 11:33 45mg
2024-12-12 13:00 ` 45mg
2024-12-16 6:26 ` [bug#74819] [PATCH v2] " 45mg
0 siblings, 2 replies; 4+ 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] 4+ 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
1 sibling, 0 replies; 4+ 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] 4+ 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
1 sibling, 1 reply; 4+ 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] 4+ messages in thread
end of thread, other threads:[~2024-12-16 6:39 UTC | newest]
Thread overview: 4+ 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
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/guix.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.