guix-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCHES] Add elogind service


From: Andy Wingo
Subject: [PATCHES] Add elogind service
Date: Tue, 01 Sep 2015 13:42:41 +0200
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.5 (gnu/linux)

Attached are two patches.  The first updates elogind to a current
release tarball.  The second adds a service.  These are the bottom two
patches in wip-pam-elogind.  If you run the service, you'll at least
have lid suspend support.  Some patches more patches to follow but these
are the only elogind ones.  OK to commit?

Andy

>From fdd8893f287696fb016e9e78fbcba04d03840ee6 Mon Sep 17 00:00:00 2001
From: Andy Wingo <address@hidden>
Date: Tue, 18 Aug 2015 10:05:24 +0200
Subject: [PATCH 1/7] gnu: elogind: Update to version 219.12.

* gnu/packages/freedesktop.scm (elogind): Update to 219.12.  Use a tarball
  instead of a git checkout.
---
 gnu/packages/freedesktop.scm | 104 ++++++++++++++++++++-----------------------
 1 file changed, 48 insertions(+), 56 deletions(-)

diff --git a/gnu/packages/freedesktop.scm b/gnu/packages/freedesktop.scm
index d477668..c085fe5 100644
--- a/gnu/packages/freedesktop.scm
+++ b/gnu/packages/freedesktop.scm
@@ -41,6 +41,7 @@
   #:use-module (gnu packages xdisorg)
   #:use-module (gnu packages xorg)
   #:use-module (gnu packages boost)
+  #:use-module (gnu packages m4)
   #:use-module (gnu packages compression)
   #:use-module (gnu packages doxygen)
   #:use-module (gnu packages libffi)
@@ -130,65 +131,56 @@ the freedesktop.org XDG Base Directory specification.")
     (license license:expat)))
 
 (define-public elogind
-  (let ((commit "14405a9"))
-    (package
-      (name "elogind")
-      (version (string-append "219." commit))
-      (source (origin
-                (method git-fetch)
-                (uri (git-reference
-                      (url "http://git.elephly.net/software/elogind.git";)
-                      (commit commit)))
-                (sha256
-                 (base32
-                  "1wz5lxj95qg64x2q5hf4zcb35hpxlw3wfswx6sb2srvsg50y3y72"))
-                (file-name (string-append name "-checkout-" commit))
-                (modules '((guix build utils)))
-                (snippet
-                 '(begin
-                    (use-modules (guix build utils))
-                    (substitute* "Makefile.am"
-                      ;; Avoid validation against DTD because the DTDs for
-                      ;; both doctype 4.2 and 4.5 are needed.
-                      (("XSLTPROC_FLAGS = ") "XSLTPROC_FLAGS = --novalid"))))))
-      (build-system gnu-build-system)
-      (arguments
-       `(#:configure-flags
-         (list
-          ;; pam_elogind fails because of bus-error.c hackery
-          "--disable-pam"
-          (string-append "--with-rootprefix=" (assoc-ref %outputs "out")))
-         #:phases
-         (modify-phases %standard-phases
-           (add-after 'unpack 'autogen
-                      (lambda _
-                        (and (zero? (system* "intltoolize" "--force" 
"--automake"))
-                             (zero? (system* "autoreconf" "-vif"))))))))
-      (native-inputs
-       `(("intltool" ,intltool)
-         ("gettext" ,gnu-gettext)
-         ("docbook-xsl" ,docbook-xsl)
-         ("docbook-xml" ,docbook-xml)
-         ("xsltproc" ,libxslt)
-         ("libxml2" ,libxml2)                     ;for XML_CATALOG_FILES
-         ("pkg-config", pkg-config)
-         ("autoconf" ,autoconf)
-         ("automake" ,automake)
-         ("libtool" ,libtool)
-         ("gperf" ,gperf)))
-      (inputs
-       `(("linux-pam" ,linux-pam)
-         ("linux-libre-headers" ,linux-libre-headers)
-         ("libcap" ,libcap)
-         ("dbus" ,dbus)
-         ("eudev" ,eudev)))
-      (home-page "https://github.com/andywingo/elogind";)
-      (synopsis "User, seat, and session management service")
-      (description "Elogind is the systemd project's \"logind\" service,
+  (package
+    (name "elogind")
+    (version "219.12")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "https://wingolog.org/pub/"; name "/"
+                                  name "-" version ".tar.xz"))
+              (sha256
+               (base32
+                "13qc4f0dl7ynnfp1y565z2k0jjizly5w3dqhiqkdk7v6jr4pksb7"))
+              (modules '((guix build utils)))
+              (snippet
+               '(begin
+                  (use-modules (guix build utils))
+                  (substitute* "Makefile.am"
+                    ;; Avoid validation against DTD because the DTDs for
+                    ;; both doctype 4.2 and 4.5 are needed.
+                    (("XSLTPROC_FLAGS = ") "XSLTPROC_FLAGS = --novalid"))))))
+    (build-system gnu-build-system)
+    (arguments
+     `(#:configure-flags
+       (list (string-append "--with-libcap="
+                            (assoc-ref %build-inputs "libcap"))
+             (string-append "--with-udevrulesdir="
+                            (assoc-ref %outputs "out")
+                            "/lib/udev/rules.d"))
+       #:make-flags 
'("PKTTYAGENT=/run/current-system/profile/bin/pkttyagent")))
+    (native-inputs
+     `(("intltool" ,intltool)
+       ("gettext" ,gnu-gettext)
+       ("docbook-xsl" ,docbook-xsl)
+       ("docbook-xml" ,docbook-xml)
+       ("xsltproc" ,libxslt)
+       ("m4" ,m4)
+       ("libxml2" ,libxml2)                     ;for XML_CATALOG_FILES
+       ("pkg-config", pkg-config)
+       ("gperf" ,gperf)))
+    (inputs
+     `(("linux-pam" ,linux-pam)
+       ("linux-libre-headers" ,linux-libre-headers)
+       ("libcap" ,libcap)
+       ("dbus" ,dbus)
+       ("eudev" ,eudev)))
+    (home-page "https://github.com/andywingo/elogind";)
+    (synopsis "User, seat, and session management service")
+    (description "Elogind is the systemd project's \"logind\" service,
 extracted out as a separate project.  Elogind integrates with PAM to provide
 the org.freedesktop.login1 interface over the system bus, allowing other parts
 of a the system to know what users are logged in, and where.")
-      (license license:lgpl2.1+))))
+    (license license:lgpl2.1+)))
 
 (define-public python-pyxdg
   (package
-- 
2.4.3

>From 4f32d646cf14133a98899c448d588088c80d680d Mon Sep 17 00:00:00 2001
From: Andy Wingo <address@hidden>
Date: Tue, 18 Aug 2015 11:56:17 +0200
Subject: [PATCH 2/7] gnu: Add elogind service.

* gnu/services/desktop.scm (elogind-configuration-file, elogind-service): New
  functions.
  (%desktop-services): Add elogind-service.
---
 gnu/services/desktop.scm | 172 ++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 171 insertions(+), 1 deletion(-)

diff --git a/gnu/services/desktop.scm b/gnu/services/desktop.scm
index 4e4b49d..764954c 100644
--- a/gnu/services/desktop.scm
+++ b/gnu/services/desktop.scm
@@ -26,6 +26,7 @@
   #:use-module (gnu system shadow)
   #:use-module (gnu packages glib)
   #:use-module (gnu packages admin)
+  #:use-module (gnu packages freedesktop)
   #:use-module (gnu packages gnome)
   #:use-module (gnu packages avahi)
   #:use-module (gnu packages wicd)
@@ -39,6 +40,7 @@
             geoclue-application
             %standard-geoclue-applications
             geoclue-service
+            elogind-service
             %desktop-services))
 
 ;;; Commentary:
@@ -374,6 +376,173 @@ site} for more information."
 
 
 ;;;
+;;; Elogind login and seat management service.
+;;;
+
+(define (missing-keyword-argument name)
+  (error "missing keyword argument:" name))
+
+(define-syntax-rule (define-with-required-kwargs name (arg ...)
+                      body ...)
+  (define name (lambda* (#:key (arg (missing-keyword-argument 'arg)) ...)
+                 body ...)))
+
+(define-with-required-kwargs elogind-configuration-file
+  (kill-user-processes? kill-only-users kill-exclude-users
+   inhibit-delay-max-seconds
+   handle-power-key handle-suspend-key handle-hibernate-key
+   handle-lid-switch handle-lid-switch-docked
+   power-key-ignore-inhibited? suspend-key-ignore-inhibited?
+   hibernate-key-ignore-inhibited? lid-switch-ignore-inhibited?
+   holdoff-timeout-seconds
+   idle-action idle-action-seconds
+   runtime-directory-size-percent runtime-directory-size
+   remove-ipc?
+   suspend-state suspend-mode
+   hibernate-state hibernate-mode
+   hybrid-sleep-state hybrid-sleep-mode)
+  (define (yesno x)
+    (match x
+      (#t "yes")
+      (#f "no")
+      (_ (error "expected #t or #f, instead got:" x))))
+  (define char-set:user-name
+    (string->char-set "abcdefghijklmnopqrstuvwxyz0123456789_-"))
+  (define (valid-list? l pred)
+    (and-map (lambda (x) (string-every pred x)) l))
+  (define (user-name-list users)
+    (unless (valid-list? users char-set:user-name)
+      (error "invalid user list" users))
+    (string-join users " "))
+  (define (enum val allowed)
+    (unless (memq val allowed)
+      (error "invalid value" val allowed))
+    (symbol->string val))
+  (define (non-negative-integer x)
+    (unless (exact-integer? x) (error "not an integer" x))
+    (when (negative? x) (error "negative number not allowed" x))
+    (number->string x))
+  (define handle-actions
+    '(ignore poweroff reboot halt kexec suspend hibernate hybrid-sleep lock))
+  (define (handle-action x)
+    (enum x handle-actions))
+  (define (sleep-list tokens)
+    (unless (valid-list? tokens char-set:user-name)
+      (error "invalid sleep list" tokens))
+    (string-join tokens " "))
+  (text-file
+   "logind.conf"
+   (string-append
+    "[Login]\n"
+    "KillUserProcesses=" (yesno kill-user-processes?) "\n"
+    "KillOnlyUsers=" (user-name-list kill-only-users) "\n"
+    "KillExcludeUsers=" (user-name-list kill-exclude-users) "\n"
+    "InhibitDelayMaxSecs=" (non-negative-integer inhibit-delay-max-seconds) 
"\n"
+    "HandlePowerKey=" (handle-action handle-power-key) "\n"
+    "HandleSuspendKey=" (handle-action handle-suspend-key) "\n"
+    "HandleHibernateKey=" (handle-action handle-hibernate-key) "\n"
+    "HandleLidSwitch=" (handle-action handle-lid-switch) "\n"
+    "HandleLidSwitchDocked=" (handle-action handle-lid-switch-docked) "\n"
+    "PowerKeyIgnoreInhibited=" (yesno power-key-ignore-inhibited?) "\n"
+    "SuspendKeyIgnoreInhibited=" (yesno suspend-key-ignore-inhibited?) "\n"
+    "HibernateKeyIgnoreInhibited=" (yesno hibernate-key-ignore-inhibited?) "\n"
+    "LidSwitchIgnoreInhibited=" (yesno lid-switch-ignore-inhibited?) "\n"
+    "HoldoffTimeoutSecs=" (non-negative-integer holdoff-timeout-seconds) "\n"
+    "IdleAction=" (handle-action idle-action) "\n"
+    "IdleActionSeconds=" (non-negative-integer idle-action-seconds) "\n"
+    "RuntimeDirectorySize="
+    (if runtime-directory-size-percent
+        (string-append
+         (non-negative-integer runtime-directory-size-percent)
+         "%")
+        (non-negative-integer runtime-directory-size)) "\n"
+    "RemoveIpc=" (yesno remove-ipc?) "\n"
+
+    "[Sleep]\n"
+    "SuspendState=" (sleep-list suspend-state) "\n"
+    "SuspendMode=" (sleep-list suspend-mode) "\n"
+    "HibernateState=" (sleep-list hibernate-state) "\n"
+    "HibernateMode=" (sleep-list hibernate-mode) "\n"
+    "HybridSleepState=" (sleep-list hybrid-sleep-state) "\n"
+    "HybridSleepMode=" (sleep-list hybrid-sleep-mode) "\n")))
+
+(define* (elogind-service #:key (elogind elogind)
+                          (kill-user-processes? #f)
+                          (kill-only-users '()) (kill-exclude-users '("root"))
+                          (inhibit-delay-max-seconds 5)
+                          (handle-power-key 'poweroff)
+                          (handle-suspend-key 'suspend)
+                          (handle-hibernate-key 'hibernate)
+                          (handle-lid-switch 'suspend)
+                          (handle-lid-switch-docked 'ignore)
+                          (power-key-ignore-inhibited? #f)
+                          (suspend-key-ignore-inhibited? #f)
+                          (hibernate-key-ignore-inhibited? #f)
+                          (lid-switch-ignore-inhibited? #t)
+                          (holdoff-timeout-seconds 30)
+                          (idle-action 'ignore)
+                          (idle-action-seconds (* 30 60))
+                          (runtime-directory-size-percent 10)
+                          (runtime-directory-size #f)
+                          (remove-ipc? #t)
+
+                          (suspend-state '("mem" "standby" "freeze"))
+                          (suspend-mode '())
+                          (hibernate-state '("disk"))
+                          (hibernate-mode '("platform" "shutdown"))
+                          (hybrid-sleep-state '("disk"))
+                          (hybrid-sleep-mode '("suspend" "platform" 
"shutdown")))
+  "Return a service that runs the @command{elogind} login and seat management
+service.  The @command{elogind} service integrates with PAM to allow other
+system components to know the set of logged-in users as well as their session
+types (graphical, console, remote, etc.).  It can also clean up after users
+when they log out."
+  (mlet %store-monad
+      ((config
+        (elogind-configuration-file
+         #:kill-user-processes? kill-user-processes?
+         #:kill-only-users kill-only-users
+         #:kill-exclude-users kill-exclude-users
+         #:inhibit-delay-max-seconds inhibit-delay-max-seconds
+         #:handle-power-key handle-power-key
+         #:handle-suspend-key handle-suspend-key
+         #:handle-hibernate-key handle-hibernate-key
+         #:handle-lid-switch handle-lid-switch
+         #:handle-lid-switch-docked handle-lid-switch-docked
+         #:power-key-ignore-inhibited? power-key-ignore-inhibited?
+         #:suspend-key-ignore-inhibited? suspend-key-ignore-inhibited?
+         #:hibernate-key-ignore-inhibited? hibernate-key-ignore-inhibited?
+         #:power-key-ignore-inhibited? power-key-ignore-inhibited?
+         #:suspend-key-ignore-inhibited? suspend-key-ignore-inhibited?
+         #:hibernate-key-ignore-inhibited? hibernate-key-ignore-inhibited?
+         #:lid-switch-ignore-inhibited? lid-switch-ignore-inhibited?
+         #:holdoff-timeout-seconds holdoff-timeout-seconds
+         #:idle-action idle-action
+         #:idle-action-seconds idle-action-seconds
+         #:runtime-directory-size-percent runtime-directory-size-percent
+         #:runtime-directory-size runtime-directory-size
+         #:remove-ipc? remove-ipc?
+
+         #:suspend-state suspend-state
+         #:suspend-mode suspend-mode
+         #:hibernate-state hibernate-state
+         #:hibernate-mode hibernate-mode
+         #:hybrid-sleep-state hybrid-sleep-state
+         #:hybrid-sleep-mode hybrid-sleep-mode)))
+    (return
+     (service
+      (documentation "Run the elogind login and seat management service.")
+      (provision '(elogind))
+      (requirement '(dbus-system))
+
+      (start #~(make-forkexec-constructor
+                (list (string-append #$elogind "/libexec/elogind/elogind"))
+                #:environment-variables
+                (list (string-append "ELOGIND_CONF_FILE=" #$config))))
+      (stop #~(make-kill-destructor))))))
+
+
+;;;
 ;;; The default set of desktop services.
 ;;;
 (define %desktop-services
@@ -389,7 +558,8 @@ site} for more information."
          ;; time, so we currently add them to the set of default services.
          (colord-service)
          (geoclue-service)
-         (dbus-service (list avahi wicd upower colord geoclue))
+         (elogind-service)
+         (dbus-service (list avahi wicd upower colord geoclue elogind))
 
          (ntp-service)
 
-- 
2.4.3


reply via email to

[Prev in Thread] Current Thread [Next in Thread]