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