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.
This commit is contained in:
David Craven 2016-07-20 13:17:48 +02:00
parent 15791fa535
commit 935644c01a
No known key found for this signature in database
GPG Key ID: C5E051C79C0BECDB
3 changed files with 422 additions and 0 deletions

View File

@ -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}] @

View File

@ -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 \

318
gnu/services/sddm.scm Normal file
View File

@ -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))