summary refs log tree commit diff
diff options
context:
space:
mode:
authorDavid Craven <david@craven.ch>2016-07-20 13:17:48 +0200
committerDavid Craven <david@craven.ch>2016-09-06 17:48:59 +0200
commit935644c01ade149f33e1eeea9ed8647f229aa4d6 (patch)
treece1d3fb91c9a9035694e206c02e542f19d1f0fee
parent15791fa53512b50796b36b9ca0fe780260262d9d (diff)
downloadguix-935644c01ade149f33e1eeea9ed8647f229aa4d6.tar.gz
services: Add sddm service.
* gnu/services/sddm.scm: New file.
* gnu/local.mk (GNU_SYSTEM_MODULES): Add it.
* doc/guix.texi (@deftp, @deffn): Add documentation.
-rw-r--r--doc/guix.texi103
-rw-r--r--gnu/local.mk1
-rw-r--r--gnu/services/sddm.scm318
3 files changed, 422 insertions, 0 deletions
diff --git a/doc/guix.texi b/doc/guix.texi
index 2abb7b231a..59bc5d8ee0 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -8226,6 +8226,109 @@ Xorg---is provided by the @code{(gnu services xorg)} module.  Note that
 there is no @code{xorg-service} procedure.  Instead, the X server is
 started by the @dfn{login manager}, currently SLiM.
 
+@deftp {Data Type} sddm-configuration
+This is the data type representing the sddm service configuration.
+
+@table @asis
+@item @code{display-server} (default: "x11")
+Select display server to use for the greeter. Valid values are "x11"
+or "wayland".
+
+@item @code{numlock} (default: "on")
+Valid values are "on", "off" or "none".
+
+@item @code{halt-command} (default @code{#~(string-apppend #$shepherd "/sbin/halt")})
+Command to run when halting.
+
+@item @code{reboot-command} (default @code{#~(string-append #$shepherd "/sbin/reboot")})
+Command to run when rebooting.
+
+@item @code{theme} (default "maldives")
+Theme to use. Default themes provided by SDDM are "elarun" or "maldives".
+
+@item @code{themes-directory} (default "/run/current-system/profile/share/sddm/themes")
+Directory to look for themes.
+
+@item @code{faces-directory} (default "/run/current-system/profile/share/sddm/faces")
+Directory to look for faces.
+
+@item @code{default-path} (default "/run/current-system/profile/bin")
+Default PATH to use.
+
+@item @code{minimum-uid} (default 1000)
+Minimum UID to display in SDDM.
+
+@item @code{maximum-uid} (default 2000)
+Maximum UID to display in SDDM
+
+@item @code{remember-last-user?} (default #t)
+Remember last user.
+
+@item @code{remember-last-session?} (default #t)
+Remember last session.
+
+@item @code{hide-users} (default "")
+Usernames to hide from SDDM greeter.
+
+@item @code{hide-shells} (default @code{#~(string-append #$shadow "/sbin/nologin")})
+Users with shells listed will be hidden from the SDDM greeter.
+
+@item @code{session-command} (default @code{#~(string-append #$sddm "/share/sddm/scripts/wayland-session")})
+Script to run before starting a wayland session.
+
+@item @code{sessions-directory} (default "/run/current-system/profile/share/wayland-sessions")
+Directory to look for desktop files starting wayland sessions.
+
+@item @code{xorg-server-path} (default @code{xorg-start-command})
+Path to xorg-server.
+
+@item @code{xauth-path} (default @code{#~(string-append #$xauth "/bin/xauth")})
+Path to xauth.
+
+@item @code{xephyr-path} (default @code{#~(string-append #$xorg-server "/bin/Xephyr")})
+Path to Xephyr.
+
+@item @code{xdisplay-start} (default @code{#~(string-append #$sddm "/share/sddm/scripts/Xsetup")})
+Script to run after starting xorg-server.
+
+@item @code{xdisplay-stop} (default @code{#~(string-append #$sddm "/share/sddm/scripts/Xstop")})
+Script to run before stopping xorg-server.
+
+@item @code{xsession-command} (default: @code{xinitr })
+Script to run before starting a X session.
+
+@item @code{xsessions-directory} (default: "/run/current-system/profile/share/xsessions")
+Directory to look for desktop files starting X sessions.
+
+@item @code{minimum-vt} (default: 7)
+Minimum VT to use.
+
+@item @code{xserver-arguments} (default "-nolisten tcp")
+Arguments to pass to xorg-server.
+
+@item @code{auto-login-user} (default "")
+User to use for auto-login.
+
+@item @code{auto-login-session} (default "")
+Desktop file to use for auto-login.
+
+@item @code{relogin?} (default #f)
+Relogin after logout.
+
+@end table
+@end deftp
+
+@deffn {Scheme Procedure} sddm-service config
+Return a service that spawns the SDDM graphical login manager for config of
+type @code{<sddm-configuration>}.
+
+@example
+  (sddm-service (sddm-configuration
+                 (auto-login-user "Alice")
+                 (auto-login-session "xfce.desktop")))
+@end example
+@end deffn
+
 @deffn {Scheme Procedure} slim-service [#:allow-empty-passwords? #f] @
   [#:auto-login? #f] [#:default-user ""] [#:startx] @
   [#:theme @var{%default-slim-theme}] @
diff --git a/gnu/local.mk b/gnu/local.mk
index 50363ef026..0a9b831aa1 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -391,6 +391,7 @@ GNU_SYSTEM_MODULES =				\
   %D%/services/networking.scm			\
   %D%/services/shepherd.scm			\
   %D%/services/herd.scm				\
+  %D%/services/sddm.scm				\
   %D%/services/spice.scm				\
   %D%/services/ssh.scm				\
   %D%/services/web.scm				\
diff --git a/gnu/services/sddm.scm b/gnu/services/sddm.scm
new file mode 100644
index 0000000000..ab6672b0e5
--- /dev/null
+++ b/gnu/services/sddm.scm
@@ -0,0 +1,318 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2016 David Craven <david@craven.ch>
+;;;
+;;; This file is part of GNU Guix.
+;;;
+;;; GNU Guix is free software; you can redistribute it and/or modify it
+;;; under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 3 of the License, or (at
+;;; your option) any later version.
+;;;
+;;; GNU Guix is distributed in the hope that it will be useful, but
+;;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
+
+(define-module (gnu services sddm)
+  #:use-module (gnu packages admin)
+  #:use-module (gnu packages display-managers)
+  #:use-module (gnu packages freedesktop)
+  #:use-module (gnu packages xorg)
+  #:use-module (gnu services)
+  #:use-module (gnu services shepherd)
+  #:use-module (gnu services xorg)
+  #:use-module (gnu system pam)
+  #:use-module (gnu system shadow)
+  #:use-module (guix gexp)
+  #:use-module (guix records)
+  #:export (sddm-configuration
+            sddm-confiugration?
+            sddm-service-type
+            sddm-service))
+
+(define-record-type* <sddm-configuration>
+  sddm-configuration      make-sddm-configuration
+  sddm-configuration?
+  (sddm                   sddm-configuration-sddm
+                          (default sddm))
+
+  ;; [General]
+  ;; valid values are x11 and wayland
+  ;; currently doesn't do anything is enabled by wayland greeter PR
+  (display-server         sddm-configuration-display-server
+                          (default "x11"))
+  ;; valid values are on, off or none
+  (numlock                sddm-configuration-numlock
+                          (default "on"))
+  (halt-command           sddm-configuration-halt-command
+                          (default #~(string-append #$shepherd "/sbin/halt")))
+  (reboot-command         sddm-configuration-reboot-command
+                          (default #~(string-append #$shepherd "/sbin/reboot")))
+
+  ;; [Theme]
+  ;; valid values are elarun or maldives
+  (theme                  sddm-configuration-theme
+                          (default "maldives"))
+  (themes-directory       sddm-configuration-themes-directory
+                          (default "/run/current-system/profile/share/sddm/themes"))
+  (faces-directory        sddm-configuration-faces-directory
+                          (default "/run/current-system/profile/share/sddm/faces"))
+
+  ;; [Users]
+  (default-path           sddm-configuration-default-path
+                          (default "/run/current-system/profile/bin"))
+  (minimum-uid            sddm-configuration-minimum-uid
+                          (default 1000))
+  (maximum-uid            sddm-configuration-maximum-uid
+                          (default 2000))
+  (remember-last-user?    sddm-configuration-remember-last-user?
+                          (default #t))
+  (remember-last-session? sddm-configuration-remember-last-session?
+                          (default #t))
+  (hide-users             sddm-configuration-hide-users
+                          (default ""))
+  (hide-shells            sddm-configuration-hide-shells
+                          (default #~(string-append #$shadow "/sbin/nologin")))
+
+  ;; [Wayland]
+  (session-command        sddm-configuration-session-command
+                          (default #~(string-append #$sddm "/share/sddm/scripts/wayland-session")))
+  (sessions-directory     sddm-configuration-sessions-directory
+                          (default "/run/current-system/profile/share/wayland-sessions"))
+  ;; [X11]
+  (xorg-server-path       sddm-configuration-xorg-server-path
+                          (default (xorg-start-command)))
+  (xauth-path             sddm-configuration-xauth-path
+                          (default #~(string-append #$xauth "/bin/xauth")))
+  (xephyr-path            sddm-configuration-xephyr-path
+                          (default #~(string-append #$xorg-server "/bin/Xephyr")))
+  (xdisplay-start         sddm-configuration-xdisplay-start
+                          (default #~(string-append #$sddm "/share/sddm/scripts/Xsetup")))
+  (xdisplay-stop          sddm-configuration-xdisplay-stop
+                          (default #~(string-append #$sddm "/share/sddm/scripts/Xstop")))
+  (xsession-command       sddm-configuration-xsession-command
+                          (default (xinitrc)))
+  (xsessions-directory    sddm-configuration-xsessions-directory
+                          (default "/run/current-system/profile/share/xsessions"))
+  (minimum-vt             sddm-configuration-minimum-vt
+                          (default 7))
+  (xserver-arguments      sddm-configuration-xserver-arguments
+                          (default "-nolisten tcp"))
+
+  ;; [Autologin]
+  (auto-login-user        sddm-configuration-auto-login-user
+                          (default ""))
+  ;; valid values are xfce.desktop gnome.desktop weston.desktop hawaii.desktop
+  (auto-login-session     sddm-configuration-auto-login-session
+                          (default ""))
+  (relogin?               sddm-configuration-relogin?
+                          (default #f)))
+
+(define (sddm-configuration-file config)
+  (mixed-text-file "sddm.conf" "
+[General]
+DisplayServer="        (sddm-configuration-display-server config)              "
+Numlock="              (sddm-configuration-numlock config)                     "
+HaltCommand="          (sddm-configuration-halt-command config)                "
+RebootCommand="        (sddm-configuration-reboot-command config)              "
+
+[Users]
+DefaultPath="          (sddm-configuration-default-path config)                "
+MinimumUid="           (number->string (sddm-configuration-minimum-uid config))"
+MaximumUid="           (number->string (sddm-configuration-maximum-uid config))"
+RememberLastUser="     (if (sddm-configuration-remember-last-user? config)
+                           "true" "false")                                     "
+RememberLastSession="  (if (sddm-configuration-remember-last-session? config)
+                           "true" "false")                                     "
+HideUsers="            (sddm-configuration-hide-users config)                  "
+Hideshells="           (sddm-configuration-hide-shells config)                 "
+
+[Theme]
+Current="              (sddm-configuration-theme config)                       "
+ThemeDir="             (sddm-configuration-themes-directory config)            "
+FacesDir="             (sddm-configuration-faces-directory config)             "
+
+[Wayland]
+SessionCommand="       (sddm-configuration-session-command config)             "
+SessionDir="           (sddm-configuration-sessions-directory config)          "
+
+[X11]
+ServerPath="           (sddm-configuration-xorg-server-path config)            "
+XauthPath="            (sddm-configuration-xauth-path config)                  "
+XephyrPath="           (sddm-configuration-xephyr-path config)                 "
+DisplayCommand="       (sddm-configuration-xdisplay-start config)              "
+DisplayStopCommand="   (sddm-configuration-xdisplay-stop config)               "
+SessionCommand="       (sddm-configuration-xsession-command config)            "
+SessionDir="           (sddm-configuration-xsessions-directory config)         "
+MinimumVT="            (number->string (sddm-configuration-minimum-vt config)) "
+ServerArguments="      (sddm-configuration-xserver-arguments config)           "
+
+[Autologin]
+User="                 (sddm-configuration-auto-login-user config)             "
+Session="              (sddm-configuration-auto-login-session config)          "
+Relogin="              (if (sddm-configuration-relogin? config)
+                           "true" "false")                                     "
+"))
+
+(define (sddm-shepherd-service config)
+  "Return a <shepherd-service> for sddm with CONFIG."
+
+  (define sddm-command
+    #~(list (string-append #$(sddm-configuration-sddm config) "/bin/sddm")))
+
+  (list (shepherd-service
+         (documentation "SDDM display manager.")
+         (requirement '(user-processes))
+         (provision '(display-manager))
+         (start #~(make-forkexec-constructor #$sddm-command))
+         (stop #~(make-kill-destructor)))))
+
+(define (sddm-etc-service config)
+  (list `("sddm.conf" ,(sddm-configuration-file config))))
+
+(define (sddm-pam-service)
+  "Return a PAM service for @command{sddm}."
+  (pam-service
+   (name "sddm")
+   (auth
+    (list
+     (pam-entry
+      (control "requisite")
+      (module "pam_nologin.so"))
+     (pam-entry
+      (control "required")
+      (module "pam_env.so"))
+     (pam-entry
+      (control "required")
+      (module "pam_succeed_if.so")
+      (arguments (list "uid >= 1000" "quiet")))
+     ;; should be factored out into system-auth
+     (pam-entry
+      (control "required")
+      (module "pam_unix.so"))))
+   (account
+    (list
+     ;; should be factored out into system-account
+     (pam-entry
+      (control "required")
+      (module "pam_unix.so"))))
+   (password
+    (list
+     ;; should be factored out into system-password
+     (pam-entry
+      (control "required")
+      (module "pam_unix.so")
+      (arguments (list "sha512" "shadow" "try_first_pass")))))
+   (session
+    (list
+     ;; lfs has a required pam_limits.so
+     ;; should be factored out into system-session
+     (pam-entry
+      (control "required")
+      (module "pam_unix.so"))))))
+
+(define (sddm-greeter-pam-service)
+  "Return a PAM service for @command{sddm-greeter}."
+  (pam-service
+   (name "sddm-greeter")
+   (auth
+    (list
+     ;; Load environment form /etc/environment and ~/.pam_environment
+     (pam-entry
+      (control "required")
+      (module "pam_env.so"))
+     ;; Always let the greeter start without authentication
+     (pam-entry
+      (control "required")
+      (module "pam_permit.so"))))
+   (account
+    (list
+     ;; No action required for account management
+     (pam-entry
+      (control "required")
+      (module "pam_permit.so"))))
+   (password
+    (list
+     ;; Can't change password
+     (pam-entry
+      (control "required")
+      (module "pam_deny.so"))))
+   (session
+    (list
+     ;; Setup session
+     (pam-entry
+      (control "required")
+      (module "pam_unix.so"))))))
+
+(define (sddm-autologin-pam-service)
+  "Return a PAM service for @command{sddm-autologin}"
+  (pam-service
+   (name "sddm-autologin")
+   (auth
+    (list
+     (pam-entry
+      (control "requisite")
+      (module "pam_nologin.so"))
+     (pam-entry
+      (control "required")
+      (module "pam_succeed_if.so")
+      (arguments (list "uid >= 1000" "quiet")))
+     (pam-entry
+      (control "required")
+      (module "pam_permit.so"))))
+   (account
+    (list
+     (pam-entry
+      (control "include")
+      (module "sddm"))))
+   (password
+    (list
+     (pam-entry
+      (control "required")
+      (module "pam_deny.so"))))
+   (session
+    (list
+     (pam-entry
+      (control "include")
+      (module "sddm"))))))
+
+(define (sddm-pam-services config)
+  (list (sddm-pam-service)
+        (sddm-greeter-pam-service)
+        (sddm-autologin-pam-service)))
+
+(define %sddm-accounts
+  (list (user-group (name "sddm") (system? #t))
+        (user-account
+         (name "sddm")
+         (group "sddm")
+         (system? #t)
+         (comment "SDDM user")
+         (home-directory "/var/lib/sddm")
+         (shell #~(string-append #$shadow "/sbin/nologin")))))
+
+;; Add default themes to profile
+(define sddm-profile-service
+  (compose list sddm-configuration-sddm))
+
+(define sddm-service-type
+  (service-type (name 'sddm)
+                (extensions
+                  (list (service-extension shepherd-root-service-type
+                                           sddm-shepherd-service)
+                        (service-extension etc-service-type
+                                           sddm-etc-service)
+                        (service-extension pam-root-service-type
+                                           sddm-pam-services)
+                        (service-extension account-service-type
+                                           (const %sddm-accounts))
+                        (service-extension profile-service-type
+                                           sddm-profile-service)))))
+
+(define* (sddm-service #:optional (config (sddm-configuration)))
+  "Run the @uref{https://github.com/sddm/sddm,SSDM display manager}
+with the given @var{config}, a @code{<sddm-configuration>} object."
+  (service sddm-service-type config))