projects/guix·blob java-team · refs

354 lines · 14.1 KiB

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