guix-devel
[Top][All Lists]
Advanced

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

[PATCH] services: Add sddm service.


From: David Craven
Subject: [PATCH] services: Add sddm service.
Date: Sat, 27 Aug 2016 16:00:30 +0200

* gnu/services/sddm.scm: New file.
* gnu/local.mk (GNU_SYSTEM_MODULES): Add it.
---
 gnu/local.mk          |   1 +
 gnu/services/sddm.scm | 312 ++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 313 insertions(+)
 create mode 100644 gnu/services/sddm.scm

diff --git a/gnu/local.mk b/gnu/local.mk
index 8c2f6b4..89a4783 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -390,6 +390,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 0000000..e6e2828
--- /dev/null
+++ b/gnu/services/sddm.scm
@@ -0,0 +1,312 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2016 David Craven <address@hidden>
+;;;
+;;; 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 freedesktop)
+  #:use-module (gnu packages hawaii)
+  #: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))
+  (allow-empty-passwords? sddm-configuration-allow-empty-passwords?
+                          (default #t))
+
+  ;; [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 #~(string-append #$sddm 
"/share/sddm/themes")))
+  (faces-directory        sddm-configuration-faces-directory
+                          (default #~(string-append #$sddm 
"/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 ""))
+  (auto-login-session     sddm-configuration-auto-login-session
+                          (default ""))
+  (relogin?               sddm-configuration-relogin?
+                          (default #f)))
+
+(define (sddm-configuration-file config)
+  ;; [XDisplay] -> [X11] in sddm 0.14.0
+  ;; [WaylandDisplay] -> [Wayland] in sddm 0.14.0
+  (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)             
"
+
+[WaylandDisplay]
+SessionCommand="       (sddm-configuration-session-command config)             
"
+SessionDir="           (sddm-configuration-sessions-directory config)          
"
+
+[XDisplay]
+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-activation config)
+  "Return the activation gexp for CONFIG."
+  #~(begin
+      (open-output-file "/etc/pam_debug")
+      (symlink #$(sddm-configuration-file config) "/etc/sddm.conf")))
+
+(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-pam-service)
+  "Return a PAM service for @command{sddm}."
+  (pam-service
+   (name "sddm")
+   (auth
+    (list
+     (pam-entry
+      (control "include")
+      (module "other"))))
+   (account
+    (list
+     (pam-entry
+      (control "include")
+      (module "other"))))
+   (password
+    (list
+     (pam-entry
+      (control "include")
+      (module "other"))))
+   (session
+    (list
+     (pam-entry
+      (control "include")
+      (module "other"))))))
+
+(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"))
+     (pam-entry
+      (control "optional")
+      (module #~(string-append #$elogind "/lib/security/pam_elogind.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 "include")
+      (module "sddm"))))
+   (session
+    (list
+     (pam-entry
+      (control "include")
+      (module "sddm"))))))
+
+(define (startxfce4-pam-service)
+  (unix-pam-service "startxfce4" #:allow-empty-passwords? #t))
+
+(define (weston-pam-service)
+  (unix-pam-service "weston" #:allow-empty-passwords? #t))
+
+(define (sddm-pam-services config)
+  (list (sddm-pam-service)
+        (sddm-greeter-pam-service)
+        (sddm-autologin-pam-service)
+        (startxfce4-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")))))
+
+(define sddm-service-type
+  (service-type (name 'sddm)
+                (extensions
+                  (list (service-extension shepherd-root-service-type
+                                           sddm-shepherd-service)
+                        (service-extension activation-service-type
+                                           sddm-activation)
+                        (service-extension pam-root-service-type
+                                           sddm-pam-services)
+                        (service-extension account-service-type
+                                           (const %sddm-accounts))))))
+
+(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))
-- 
2.9.0



reply via email to

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