;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2016 David Craven <david@craven.ch>
;;; Copyright © 2019 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2019 Jesse Gildersleve <jessejohngildersleve@protonmail.com>
;;; Copyright © 2020 Jakub Kądziołka <kuba@kadziolka.net>
;;; Copyright © 2023, 2024 Zheng Junjie <873216071@qq.com>
;;;
;;; 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)
#:use-module (guix deprecation)
#:use-module (guix utils)
#:use-module (guix packages)
#:export (sddm-configuration
sddm-configuration?
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 (file-append shepherd "/sbin/halt")))
(reboot-command sddm-configuration-reboot-command
(default (file-append shepherd "/sbin/reboot")))
;; [Theme]
;; valid values are elarun, maldives or maya
(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 (file-append shadow "/sbin/nologin")))
;; [Wayland]
(session-command sddm-configuration-session-command
(default (file-append sddm "/share/sddm/scripts/wayland-session")))
(sessions-directory sddm-configuration-sessions-directory
(default "/run/current-system/profile/share/wayland-sessions"))
;; [X11]
(xorg-configuration sddm-configuration-xorg
(default (xorg-configuration)))
(xauth-path sddm-configuration-xauth-path
(default (file-append xauth "/bin/xauth")))
(xephyr-path sddm-configuration-xephyr-path
(default (file-append xorg-server "/bin/Xephyr")))
(xdisplay-start sddm-configuration-xdisplay-start
(default (file-append sddm "/share/sddm/scripts/Xsetup")))
(xdisplay-stop sddm-configuration-xdisplay-stop
(default (file-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))
;; [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?2013-10-18 | build: Build the bootstrap-graph.{png,eps,pdf} under $(top_srcdir).... | Ludovic Courtès |
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=" (xorg-start-command (sddm-configuration-xorg 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=" (string-join
(xorg-configuration-server-arguments
(sddm-configuration-xorg 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 (sddm-configuration-sddm config))
(define qt6? (version-prefix?
"6"
(package-version (lookup-package-input sddm "qtbase"))))
(define sddm-command
#~(list (string-append #$sddm "/bin/sddm")))
(list (shepherd-service
(documentation "SDDM display manager.")
(requirement '(user-processes elogind pam))
(provision '(xorg-server display-manager))
(start #~(make-forkexec-constructor
#$sddm-command
;; some theme need icon,qml,data so add path to env.
#:environment-variables
(cons*
"XDG_DATA_DIRS=/run/current-system/profile/share"
"XDG_CONFIG_DIRS=/run/current-system/profile/etc/xdg"
#$(string-append "QT_PLUGIN_PATH=/run/current-system/profile/lib/qt"
(if qt6? "6" "5")
"/plugins")
#$(string-append "QML" (if qt6? "" "2")
"_IMPORT_PATH=/run/current-system/profile/lib/qt"
(if qt6? "6" "5") "/qml")
(default-environment-variables))))
(stop #~(make-kill-destructor)))))
(define (sddm-etc-service config)
(list `("sddm.conf" ,(sddm-configuration-file config))))
(define (sddm-pam-service config)
"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 (string-append "uid >= "
(number->string (sddm-configuration-minimum-uid config)))
"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 from /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 config)
"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 (string-append "uid >= "
(number->string (sddm-configuration-minimum-uid config)))
"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 config)
(sddm-greeter-pam-service)
(sddm-autologin-pam-service config)))
(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 (file-append shadow "/sbin/nologin")))))
;; Add default themes to profile
(define sddm-profile-service
(compose list sddm-configuration-sddm))
(define sddm-service-type
(handle-xorg-configuration sddm-configuration
(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)
(service-extension localed-service-type
(compose
xorg-configuration-keyboard-layout
sddm-configuration-xorg))))
(default-value (sddm-configuration))
(description
"Run SDDM, a display and log-in manager for X11 and
Wayland."))))