gnu: tzdata: Update source URI.
[jackhill/guix/guix.git] / gnu / services / sddm.scm
1 ;;; GNU Guix --- Functional package management for GNU
2 ;;; Copyright © 2016 David Craven <david@craven.ch>
3 ;;; Copyright © 2019 Ludovic Courtès <ludo@gnu.org>
4 ;;; Copyright © 2019 Jesse Gildersleve <jessejohngildersleve@protonmail.com>
5 ;;;
6 ;;; This file is part of GNU Guix.
7 ;;;
8 ;;; GNU Guix is free software; you can redistribute it and/or modify it
9 ;;; under the terms of the GNU General Public License as published by
10 ;;; the Free Software Foundation; either version 3 of the License, or (at
11 ;;; your option) any later version.
12 ;;;
13 ;;; GNU Guix is distributed in the hope that it will be useful, but
14 ;;; WITHOUT ANY WARRANTY; without even the implied warranty of
15 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 ;;; GNU General Public License for more details.
17 ;;;
18 ;;; You should have received a copy of the GNU General Public License
19 ;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
20
21 (define-module (gnu services sddm)
22 #:use-module (gnu packages admin)
23 #:use-module (gnu packages display-managers)
24 #:use-module (gnu packages freedesktop)
25 #:use-module (gnu packages xorg)
26 #:use-module (gnu services)
27 #:use-module (gnu services shepherd)
28 #:use-module (gnu services xorg)
29 #:use-module (gnu system pam)
30 #:use-module (gnu system shadow)
31 #:use-module (guix gexp)
32 #:use-module (guix records)
33 #:export (sddm-configuration
34 sddm-configuration?
35 sddm-service-type
36 sddm-service))
37
38 (define-record-type* <sddm-configuration>
39 sddm-configuration make-sddm-configuration
40 sddm-configuration?
41 (sddm sddm-configuration-sddm
42 (default sddm))
43
44 ;; [General]
45 ;; valid values are x11 and wayland
46 ;; currently doesn't do anything is enabled by wayland greeter PR
47 (display-server sddm-configuration-display-server
48 (default "x11"))
49 ;; valid values are on, off or none
50 (numlock sddm-configuration-numlock
51 (default "on"))
52 (halt-command sddm-configuration-halt-command
53 (default (file-append shepherd "/sbin/halt")))
54 (reboot-command sddm-configuration-reboot-command
55 (default (file-append shepherd "/sbin/reboot")))
56
57 ;; [Theme]
58 ;; valid values are elarun or maldives
59 (theme sddm-configuration-theme
60 (default "maldives"))
61 (themes-directory sddm-configuration-themes-directory
62 (default "/run/current-system/profile/share/sddm/themes"))
63 (faces-directory sddm-configuration-faces-directory
64 (default "/run/current-system/profile/share/sddm/faces"))
65
66 ;; [Users]
67 (default-path sddm-configuration-default-path
68 (default "/run/current-system/profile/bin"))
69 (minimum-uid sddm-configuration-minimum-uid
70 (default 1000))
71 (maximum-uid sddm-configuration-maximum-uid
72 (default 2000))
73 (remember-last-user? sddm-configuration-remember-last-user?
74 (default #t))
75 (remember-last-session? sddm-configuration-remember-last-session?
76 (default #t))
77 (hide-users sddm-configuration-hide-users
78 (default ""))
79 (hide-shells sddm-configuration-hide-shells
80 (default (file-append shadow "/sbin/nologin")))
81
82 ;; [Wayland]
83 (session-command sddm-configuration-session-command
84 (default (file-append sddm "/share/sddm/scripts/wayland-session")))
85 (sessions-directory sddm-configuration-sessions-directory
86 (default "/run/current-system/profile/share/wayland-sessions"))
87 ;; [X11]
88 (xorg-configuration sddm-configuration-xorg
89 (default (xorg-configuration)))
90 (xauth-path sddm-configuration-xauth-path
91 (default (file-append xauth "/bin/xauth")))
92 (xephyr-path sddm-configuration-xephyr-path
93 (default (file-append xorg-server "/bin/Xephyr")))
94 (xdisplay-start sddm-configuration-xdisplay-start
95 (default (file-append sddm "/share/sddm/scripts/Xsetup")))
96 (xdisplay-stop sddm-configuration-xdisplay-stop
97 (default (file-append sddm "/share/sddm/scripts/Xstop")))
98 (xsession-command sddm-configuration-xsession-command
99 (default (xinitrc)))
100 (xsessions-directory sddm-configuration-xsessions-directory
101 (default "/run/current-system/profile/share/xsessions"))
102 (minimum-vt sddm-configuration-minimum-vt
103 (default 7))
104
105 ;; [Autologin]
106 (auto-login-user sddm-configuration-auto-login-user
107 (default ""))
108 ;; valid values are xfce.desktop gnome.desktop weston.desktop hawaii.desktop
109 (auto-login-session sddm-configuration-auto-login-session
110 (default ""))
111 (relogin? sddm-configuration-relogin?
112 (default #f)))
113
114 (define (sddm-configuration-file config)
115 (mixed-text-file "sddm.conf" "
116 [General]
117 DisplayServer=" (sddm-configuration-display-server config) "
118 Numlock=" (sddm-configuration-numlock config) "
119 HaltCommand=" (sddm-configuration-halt-command config) "
120 RebootCommand=" (sddm-configuration-reboot-command config) "
121
122 [Users]
123 DefaultPath=" (sddm-configuration-default-path config) "
124 MinimumUid=" (number->string (sddm-configuration-minimum-uid config))"
125 MaximumUid=" (number->string (sddm-configuration-maximum-uid config))"
126 RememberLastUser=" (if (sddm-configuration-remember-last-user? config)
127 "true" "false") "
128 RememberLastSession=" (if (sddm-configuration-remember-last-session? config)
129 "true" "false") "
130 HideUsers=" (sddm-configuration-hide-users config) "
131 Hideshells=" (sddm-configuration-hide-shells config) "
132
133 [Theme]
134 Current=" (sddm-configuration-theme config) "
135 ThemeDir=" (sddm-configuration-themes-directory config) "
136 FacesDir=" (sddm-configuration-faces-directory config) "
137
138 [Wayland]
139 SessionCommand=" (sddm-configuration-session-command config) "
140 SessionDir=" (sddm-configuration-sessions-directory config) "
141
142 [X11]
143 ServerPath=" (xorg-start-command (sddm-configuration-xorg config)) "
144 XauthPath=" (sddm-configuration-xauth-path config) "
145 XephyrPath=" (sddm-configuration-xephyr-path config) "
146 DisplayCommand=" (sddm-configuration-xdisplay-start config) "
147 DisplayStopCommand=" (sddm-configuration-xdisplay-stop config) "
148 SessionCommand=" (sddm-configuration-xsession-command config) "
149 SessionDir=" (sddm-configuration-xsessions-directory config) "
150 MinimumVT=" (number->string (sddm-configuration-minimum-vt config)) "
151 ServerArguments=" (string-join
152 (xorg-configuration-server-arguments
153 (sddm-configuration-xorg config))) "
154
155 [Autologin]
156 User=" (sddm-configuration-auto-login-user config) "
157 Session=" (sddm-configuration-auto-login-session config) "
158 Relogin=" (if (sddm-configuration-relogin? config)
159 "true" "false") "
160 "))
161
162 (define (sddm-shepherd-service config)
163 "Return a <shepherd-service> for sddm with CONFIG."
164
165 (define sddm-command
166 #~(list (string-append #$(sddm-configuration-sddm config) "/bin/sddm")))
167
168 (list (shepherd-service
169 (documentation "SDDM display manager.")
170 (requirement '(user-processes))
171 (provision '(display-manager))
172 (start #~(make-forkexec-constructor #$sddm-command))
173 (stop #~(make-kill-destructor)))))
174
175 (define (sddm-etc-service config)
176 (list `("sddm.conf" ,(sddm-configuration-file config))))
177
178 (define (sddm-pam-service config)
179 "Return a PAM service for @command{sddm}."
180 (pam-service
181 (name "sddm")
182 (auth
183 (list
184 (pam-entry
185 (control "requisite")
186 (module "pam_nologin.so"))
187 (pam-entry
188 (control "required")
189 (module "pam_env.so"))
190 (pam-entry
191 (control "required")
192 (module "pam_succeed_if.so")
193 (arguments (list (string-append "uid >= "
194 (number->string (sddm-configuration-minimum-uid config)))
195 "quiet")))
196 ;; should be factored out into system-auth
197 (pam-entry
198 (control "required")
199 (module "pam_unix.so"))))
200 (account
201 (list
202 ;; should be factored out into system-account
203 (pam-entry
204 (control "required")
205 (module "pam_unix.so"))))
206 (password
207 (list
208 ;; should be factored out into system-password
209 (pam-entry
210 (control "required")
211 (module "pam_unix.so")
212 (arguments (list "sha512" "shadow" "try_first_pass")))))
213 (session
214 (list
215 ;; lfs has a required pam_limits.so
216 ;; should be factored out into system-session
217 (pam-entry
218 (control "required")
219 (module "pam_unix.so"))))))
220
221 (define (sddm-greeter-pam-service)
222 "Return a PAM service for @command{sddm-greeter}."
223 (pam-service
224 (name "sddm-greeter")
225 (auth
226 (list
227 ;; Load environment from /etc/environment and ~/.pam_environment
228 (pam-entry
229 (control "required")
230 (module "pam_env.so"))
231 ;; Always let the greeter start without authentication
232 (pam-entry
233 (control "required")
234 (module "pam_permit.so"))))
235 (account
236 (list
237 ;; No action required for account management
238 (pam-entry
239 (control "required")
240 (module "pam_permit.so"))))
241 (password
242 (list
243 ;; Can't change password
244 (pam-entry
245 (control "required")
246 (module "pam_deny.so"))))
247 (session
248 (list
249 ;; Setup session
250 (pam-entry
251 (control "required")
252 (module "pam_unix.so"))))))
253
254 (define (sddm-autologin-pam-service config)
255 "Return a PAM service for @command{sddm-autologin}"
256 (pam-service
257 (name "sddm-autologin")
258 (auth
259 (list
260 (pam-entry
261 (control "requisite")
262 (module "pam_nologin.so"))
263 (pam-entry
264 (control "required")
265 (module "pam_succeed_if.so")
266 (arguments (list (string-append "uid >= "
267 (number->string (sddm-configuration-minimum-uid config)))
268 "quiet")))
269 (pam-entry
270 (control "required")
271 (module "pam_permit.so"))))
272 (account
273 (list
274 (pam-entry
275 (control "include")
276 (module "sddm"))))
277 (password
278 (list
279 (pam-entry
280 (control "required")
281 (module "pam_deny.so"))))
282 (session
283 (list
284 (pam-entry
285 (control "include")
286 (module "sddm"))))))
287
288 (define (sddm-pam-services config)
289 (list (sddm-pam-service config)
290 (sddm-greeter-pam-service)
291 (sddm-autologin-pam-service config)))
292
293 (define %sddm-accounts
294 (list (user-group (name "sddm") (system? #t))
295 (user-account
296 (name "sddm")
297 (group "sddm")
298 (system? #t)
299 (comment "SDDM user")
300 (home-directory "/var/lib/sddm")
301 (shell (file-append shadow "/sbin/nologin")))))
302
303 ;; Add default themes to profile
304 (define sddm-profile-service
305 (compose list sddm-configuration-sddm))
306
307 (define sddm-service-type
308 (service-type (name 'sddm)
309 (extensions
310 (list (service-extension shepherd-root-service-type
311 sddm-shepherd-service)
312 (service-extension etc-service-type
313 sddm-etc-service)
314 (service-extension pam-root-service-type
315 sddm-pam-services)
316 (service-extension account-service-type
317 (const %sddm-accounts))
318 (service-extension profile-service-type
319 sddm-profile-service)))))
320
321 (define* (sddm-service #:optional (config (sddm-configuration)))
322 "Run the @uref{https://github.com/sddm/sddm,SSDM display manager}
323 with the given @var{config}, a @code{<sddm-configuration>} object."
324 (service sddm-service-type config))