mirror of
https://git.in.rschanz.org/ryan77627/guix.git
synced 2024-12-24 21:38:07 -05:00
services: elogind: When started by dbus-daemon, wait for the Shepherd service.
Fixes <https://issues.guix.gnu.org/55444>. Previously shepherd and dbus-daemon would race to start elogind. In some cases (for instance if one logs in quickly enough on the tty), dbus-daemon would "win" and start elogind before shepherd has had a chance to do it. Consequently, shepherd would fail to start elogind and mark it as stopped and disabled, in turn preventing services that depend on it such as 'xorg-server' from starting. * gnu/services/desktop.scm (elogind-dbus-service): Rewrite to refer to a wrapper that waits for the 'elogind' Shepherd service.
This commit is contained in:
parent
b04ae71def
commit
f383838a09
1 changed files with 54 additions and 4 deletions
|
@ -1075,10 +1075,60 @@ (define-syntax-rule (ini-file config file clause ...)
|
||||||
("HybridSleepMode" (sleep-list elogind-hybrid-sleep-mode))))
|
("HybridSleepMode" (sleep-list elogind-hybrid-sleep-mode))))
|
||||||
|
|
||||||
(define (elogind-dbus-service config)
|
(define (elogind-dbus-service config)
|
||||||
(list (wrapped-dbus-service (elogind-package config)
|
"Return a @file{org.freedesktop.login1.service} file that tells D-Bus how to
|
||||||
"libexec/elogind/elogind"
|
\"start\" elogind. In practice though, our elogind is started when booting by
|
||||||
`(("ELOGIND_CONF_FILE"
|
shepherd. Thus, the @code{Exec} line of this @file{.service} file does not
|
||||||
,(elogind-configuration-file config))))))
|
explain how to start elogind; instead, it spawns a wrapper that waits for the
|
||||||
|
@code{elogind} shepherd service. This avoids a race condition where both
|
||||||
|
@command{shepherd} and @command{dbus-daemon} would attempt to start elogind."
|
||||||
|
;; For more info on the elogind startup race, see
|
||||||
|
;; <https://issues.guix.gnu.org/55444>.
|
||||||
|
|
||||||
|
(define elogind
|
||||||
|
(elogind-package config))
|
||||||
|
|
||||||
|
(define wrapper
|
||||||
|
(program-file "elogind-dbus-shepherd-sync"
|
||||||
|
(with-imported-modules '((gnu services herd))
|
||||||
|
#~(begin
|
||||||
|
(use-modules (gnu services herd)
|
||||||
|
(srfi srfi-34))
|
||||||
|
|
||||||
|
(guard (c ((service-not-found-error? c)
|
||||||
|
(format (current-error-port)
|
||||||
|
"no elogind shepherd service~%")
|
||||||
|
(exit 1))
|
||||||
|
((shepherd-error? c)
|
||||||
|
(format (current-error-port)
|
||||||
|
"elogind shepherd service not \
|
||||||
|
started~%")
|
||||||
|
(exit 2)))
|
||||||
|
(wait-for-service 'elogind))))))
|
||||||
|
|
||||||
|
(define build
|
||||||
|
(with-imported-modules '((guix build utils))
|
||||||
|
#~(begin
|
||||||
|
(use-modules (guix build utils)
|
||||||
|
(ice-9 match))
|
||||||
|
|
||||||
|
(define service-directory
|
||||||
|
"/share/dbus-1/system-services")
|
||||||
|
|
||||||
|
(mkdir-p (dirname (string-append #$output service-directory)))
|
||||||
|
(copy-recursively (string-append #$elogind service-directory)
|
||||||
|
(string-append #$output service-directory))
|
||||||
|
(symlink (string-append #$elogind "/etc") ;for etc/dbus-1
|
||||||
|
(string-append #$output "/etc"))
|
||||||
|
|
||||||
|
;; Replace the "Exec=" line of the 'org.freedesktop.login1.service'
|
||||||
|
;; file with one that refers to WRAPPER instead of elogind.
|
||||||
|
(match (find-files #$output "\\.service$")
|
||||||
|
((file)
|
||||||
|
(substitute* file
|
||||||
|
(("Exec[[:blank:]]*=.*" _)
|
||||||
|
(string-append "Exec=" #$wrapper "\n"))))))))
|
||||||
|
|
||||||
|
(list (computed-file "elogind-dbus-service-wrapper" build)))
|
||||||
|
|
||||||
(define (pam-extension-procedure config)
|
(define (pam-extension-procedure config)
|
||||||
"Return an extension for PAM-ROOT-SERVICE-TYPE that ensures that all the PAM
|
"Return an extension for PAM-ROOT-SERVICE-TYPE that ensures that all the PAM
|
||||||
|
|
Loading…
Reference in a new issue