sddm.scm 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336
  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. ;;; Copyright © 2020 Jakub Kądziołka <kuba@kadziolka.net>
  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. (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. #:use-module (guix deprecation)
  34. #:export (sddm-configuration
  35. sddm-configuration?
  36. sddm-service-type
  37. sddm-service))
  38. (define-record-type* <sddm-configuration>
  39. sddm-configuration make-sddm-configuration
  40. sddm-configuration?
  41. (sddm sddm-configuration-sddm
  42. (default sddm))
  43. ;; [General]
  44. ;; valid values are x11 and wayland
  45. ;; currently doesn't do anything is enabled by wayland greeter PR
  46. (display-server sddm-configuration-display-server
  47. (default "x11"))
  48. ;; valid values are on, off or none
  49. (numlock sddm-configuration-numlock
  50. (default "on"))
  51. (halt-command sddm-configuration-halt-command
  52. (default (file-append shepherd "/sbin/halt")))
  53. (reboot-command sddm-configuration-reboot-command
  54. (default (file-append shepherd "/sbin/reboot")))
  55. ;; [Theme]
  56. ;; valid values are elarun, maldives or maya
  57. (theme sddm-configuration-theme
  58. (default "maldives"))
  59. (themes-directory sddm-configuration-themes-directory
  60. (default "/run/current-system/profile/share/sddm/themes"))
  61. (faces-directory sddm-configuration-faces-directory
  62. (default "/run/current-system/profile/share/sddm/faces"))
  63. ;; [Users]
  64. (default-path sddm-configuration-default-path
  65. (default "/run/current-system/profile/bin"))
  66. (minimum-uid sddm-configuration-minimum-uid
  67. (default 1000))
  68. (maximum-uid sddm-configuration-maximum-uid
  69. (default 2000))
  70. (remember-last-user? sddm-configuration-remember-last-user?
  71. (default #t))
  72. (remember-last-session? sddm-configuration-remember-last-session?
  73. (default #t))
  74. (hide-users sddm-configuration-hide-users
  75. (default ""))
  76. (hide-shells sddm-configuration-hide-shells
  77. (default (file-append shadow "/sbin/nologin")))
  78. ;; [Wayland]
  79. (session-command sddm-configuration-session-command
  80. (default (file-append sddm "/share/sddm/scripts/wayland-session")))
  81. (sessions-directory sddm-configuration-sessions-directory
  82. (default "/run/current-system/profile/share/wayland-sessions"))
  83. ;; [X11]
  84. (xorg-configuration sddm-configuration-xorg
  85. (default (xorg-configuration)))
  86. (xauth-path sddm-configuration-xauth-path
  87. (default (file-append xauth "/bin/xauth")))
  88. (xephyr-path sddm-configuration-xephyr-path
  89. (default (file-append xorg-server "/bin/Xephyr")))
  90. (xdisplay-start sddm-configuration-xdisplay-start
  91. (default (file-append sddm "/share/sddm/scripts/Xsetup")))
  92. (xdisplay-stop sddm-configuration-xdisplay-stop
  93. (default (file-append sddm "/share/sddm/scripts/Xstop")))
  94. (xsession-command sddm-configuration-xsession-command
  95. (default (xinitrc)))
  96. (xsessions-directory sddm-configuration-xsessions-directory
  97. (default "/run/current-system/profile/share/xsessions"))
  98. (minimum-vt sddm-configuration-minimum-vt
  99. (default 7))
  100. ;; [Autologin]
  101. (auto-login-user sddm-configuration-auto-login-user
  102. (default ""))
  103. ;; valid values are xfce.desktop gnome.desktop weston.desktop hawaii.desktop
  104. (auto-login-session sddm-configuration-auto-login-session
  105. (default ""))
  106. (relogin? sddm-configuration-relogin?
  107. (default #f)))
  108. (define (sddm-configuration-file config)
  109. (mixed-text-file "sddm.conf" "
  110. [General]
  111. DisplayServer=" (sddm-configuration-display-server config) "
  112. Numlock=" (sddm-configuration-numlock config) "
  113. HaltCommand=" (sddm-configuration-halt-command config) "
  114. RebootCommand=" (sddm-configuration-reboot-command config) "
  115. [Users]
  116. DefaultPath=" (sddm-configuration-default-path config) "
  117. MinimumUid=" (number->string (sddm-configuration-minimum-uid config))"
  118. MaximumUid=" (number->string (sddm-configuration-maximum-uid config))"
  119. RememberLastUser=" (if (sddm-configuration-remember-last-user? config)
  120. "true" "false") "
  121. RememberLastSession=" (if (sddm-configuration-remember-last-session? config)
  122. "true" "false") "
  123. HideUsers=" (sddm-configuration-hide-users config) "
  124. Hideshells=" (sddm-configuration-hide-shells config) "
  125. [Theme]
  126. Current=" (sddm-configuration-theme config) "
  127. ThemeDir=" (sddm-configuration-themes-directory config) "
  128. FacesDir=" (sddm-configuration-faces-directory config) "
  129. [Wayland]
  130. SessionCommand=" (sddm-configuration-session-command config) "
  131. SessionDir=" (sddm-configuration-sessions-directory config) "
  132. [X11]
  133. ServerPath=" (xorg-start-command (sddm-configuration-xorg config)) "
  134. XauthPath=" (sddm-configuration-xauth-path config) "
  135. XephyrPath=" (sddm-configuration-xephyr-path config) "
  136. DisplayCommand=" (sddm-configuration-xdisplay-start config) "
  137. DisplayStopCommand=" (sddm-configuration-xdisplay-stop config) "
  138. SessionCommand=" (sddm-configuration-xsession-command config) "
  139. SessionDir=" (sddm-configuration-xsessions-directory config) "
  140. MinimumVT=" (number->string (sddm-configuration-minimum-vt config)) "
  141. ServerArguments=" (string-join
  142. (xorg-configuration-server-arguments
  143. (sddm-configuration-xorg config))) "
  144. [Autologin]
  145. User=" (sddm-configuration-auto-login-user config) "
  146. Session=" (sddm-configuration-auto-login-session config) "
  147. Relogin=" (if (sddm-configuration-relogin? config)
  148. "true" "false") "
  149. "))
  150. (define (sddm-shepherd-service config)
  151. "Return a <shepherd-service> for sddm with CONFIG."
  152. (define sddm-command
  153. #~(list (string-append #$(sddm-configuration-sddm config) "/bin/sddm")))
  154. (list (shepherd-service
  155. (documentation "SDDM display manager.")
  156. (requirement '(user-processes elogind pam))
  157. (provision '(xorg-server display-manager))
  158. (start #~(make-forkexec-constructor
  159. #$sddm-command
  160. ;; some theme need icon,qml,data so add path to env.
  161. #:environment-variables
  162. (cons*
  163. "XDG_DATA_DIRS=/run/current-system/profile/share"
  164. "XDG_CONFIG_DIRS=/run/current-system/profile/etc/xdg"
  165. "QT_PLUGIN_PATH=/run/current-system/profile/lib/qt5/plugins"
  166. "QML2_IMPORT_PATH=/run/current-system/profile/lib/qt5/qml"
  167. (default-environment-variables))))
  168. (stop #~(make-kill-destructor)))))
  169. (define (sddm-etc-service config)
  170. (list `("sddm.conf" ,(sddm-configuration-file config))))
  171. (define (sddm-pam-service config)
  172. "Return a PAM service for @command{sddm}."
  173. (pam-service
  174. (name "sddm")
  175. (auth
  176. (list
  177. (pam-entry
  178. (control "requisite")
  179. (module "pam_nologin.so"))
  180. (pam-entry
  181. (control "required")
  182. (module "pam_env.so"))
  183. (pam-entry
  184. (control "required")
  185. (module "pam_succeed_if.so")
  186. (arguments (list (string-append "uid >= "
  187. (number->string (sddm-configuration-minimum-uid config)))
  188. "quiet")))
  189. ;; should be factored out into system-auth
  190. (pam-entry
  191. (control "required")
  192. (module "pam_unix.so"))))
  193. (account
  194. (list
  195. ;; should be factored out into system-account
  196. (pam-entry
  197. (control "required")
  198. (module "pam_unix.so"))))
  199. (password
  200. (list
  201. ;; should be factored out into system-password
  202. (pam-entry
  203. (control "required")
  204. (module "pam_unix.so")
  205. (arguments (list "sha512" "shadow" "try_first_pass")))))
  206. (session
  207. (list
  208. ;; lfs has a required pam_limits.so
  209. ;; should be factored out into system-session
  210. (pam-entry
  211. (control "required")
  212. (module "pam_unix.so"))))))
  213. (define (sddm-greeter-pam-service)
  214. "Return a PAM service for @command{sddm-greeter}."
  215. (pam-service
  216. (name "sddm-greeter")
  217. (auth
  218. (list
  219. ;; Load environment from /etc/environment and ~/.pam_environment
  220. (pam-entry
  221. (control "required")
  222. (module "pam_env.so"))
  223. ;; Always let the greeter start without authentication
  224. (pam-entry
  225. (control "required")
  226. (module "pam_permit.so"))))
  227. (account
  228. (list
  229. ;; No action required for account management
  230. (pam-entry
  231. (control "required")
  232. (module "pam_permit.so"))))
  233. (password
  234. (list
  235. ;; Can't change password
  236. (pam-entry
  237. (control "required")
  238. (module "pam_deny.so"))))
  239. (session
  240. (list
  241. ;; Setup session
  242. (pam-entry
  243. (control "required")
  244. (module "pam_unix.so"))))))
  245. (define (sddm-autologin-pam-service config)
  246. "Return a PAM service for @command{sddm-autologin}"
  247. (pam-service
  248. (name "sddm-autologin")
  249. (auth
  250. (list
  251. (pam-entry
  252. (control "requisite")
  253. (module "pam_nologin.so"))
  254. (pam-entry
  255. (control "required")
  256. (module "pam_succeed_if.so")
  257. (arguments (list (string-append "uid >= "
  258. (number->string (sddm-configuration-minimum-uid config)))
  259. "quiet")))
  260. (pam-entry
  261. (control "required")
  262. (module "pam_permit.so"))))
  263. (account
  264. (list
  265. (pam-entry
  266. (control "include")
  267. (module "sddm"))))
  268. (password
  269. (list
  270. (pam-entry
  271. (control "required")
  272. (module "pam_deny.so"))))
  273. (session
  274. (list
  275. (pam-entry
  276. (control "include")
  277. (module "sddm"))))))
  278. (define (sddm-pam-services config)
  279. (list (sddm-pam-service config)
  280. (sddm-greeter-pam-service)
  281. (sddm-autologin-pam-service config)))
  282. (define %sddm-accounts
  283. (list (user-group (name "sddm") (system? #t))
  284. (user-account
  285. (name "sddm")
  286. (group "sddm")
  287. (system? #t)
  288. (comment "SDDM user")
  289. (home-directory "/var/lib/sddm")
  290. (shell (file-append shadow "/sbin/nologin")))))
  291. ;; Add default themes to profile
  292. (define sddm-profile-service
  293. (compose list sddm-configuration-sddm))
  294. (define sddm-service-type
  295. (handle-xorg-configuration sddm-configuration
  296. (service-type (name 'sddm)
  297. (extensions
  298. (list (service-extension shepherd-root-service-type
  299. sddm-shepherd-service)
  300. (service-extension etc-service-type
  301. sddm-etc-service)
  302. (service-extension pam-root-service-type
  303. sddm-pam-services)
  304. (service-extension account-service-type
  305. (const %sddm-accounts))
  306. (service-extension profile-service-type
  307. sddm-profile-service)))
  308. (default-value (sddm-configuration))
  309. (description
  310. "Run SDDM, a display and log-in manager for X11 and
  311. Wayland."))))