mirror of
https://git.in.rschanz.org/ryan77627/guix.git
synced 2025-01-25 20:19:18 -05:00
services: Add dconf-service-type.
This allows the dconf profile directive "system-db:" to look up profiles by name from under /etc/dconf/db/. * gnu/services/xorg.scm (dconf-keyfile, dconf-profile): New procedures. (dconf-profiles?): New predicate. (dconf-configuration): New procedure. (dconf-profile->profile-file): Likewise. (dconf-profile->db-keyfile): Likewise. (dconf-profile->db-keyfile-dir): Likewise. (dconf-profile->db): Likewise. (dconf-profile->files): Likewise. (dconf-service-type): New service type.
This commit is contained in:
parent
0503b104d6
commit
7b896a26b8
1 changed files with 109 additions and 0 deletions
|
@ -12,6 +12,7 @@
|
||||||
;;; Copyright © 2021 Oleg Pykhalov <go.wigust@gmail.com>
|
;;; Copyright © 2021 Oleg Pykhalov <go.wigust@gmail.com>
|
||||||
;;; Copyright © 2021 Josselin Poiret <josselin.poiret@protonmail.ch>
|
;;; Copyright © 2021 Josselin Poiret <josselin.poiret@protonmail.ch>
|
||||||
;;; Copyright © 2022 Chris Marusich <cmmarusich@gmail.com>
|
;;; Copyright © 2022 Chris Marusich <cmmarusich@gmail.com>
|
||||||
|
;;; Copyright © 2022 Maxim Cournoyer <maxim.cournoyer@gmail.com>
|
||||||
;;;
|
;;;
|
||||||
;;; This file is part of GNU Guix.
|
;;; This file is part of GNU Guix.
|
||||||
;;;
|
;;;
|
||||||
|
@ -32,6 +33,7 @@ (define-module (gnu services xorg)
|
||||||
#:autoload (gnu services sddm) (sddm-service-type)
|
#:autoload (gnu services sddm) (sddm-service-type)
|
||||||
#:use-module (gnu artwork)
|
#:use-module (gnu artwork)
|
||||||
#:use-module (gnu services)
|
#:use-module (gnu services)
|
||||||
|
#:use-module (gnu services configuration)
|
||||||
#:use-module (gnu services shepherd)
|
#:use-module (gnu services shepherd)
|
||||||
#:use-module (gnu system pam)
|
#:use-module (gnu system pam)
|
||||||
#:use-module (gnu system setuid)
|
#:use-module (gnu system setuid)
|
||||||
|
@ -114,6 +116,13 @@ (define-module (gnu services xorg)
|
||||||
localed-configuration?
|
localed-configuration?
|
||||||
localed-service-type
|
localed-service-type
|
||||||
|
|
||||||
|
dconf-keyfile
|
||||||
|
dconf-profile
|
||||||
|
dconf-profile-name
|
||||||
|
dconf-profile-content
|
||||||
|
dconf-profile-keyfile
|
||||||
|
dconf-service-type
|
||||||
|
|
||||||
gdm-configuration
|
gdm-configuration
|
||||||
gdm-service-type
|
gdm-service-type
|
||||||
|
|
||||||
|
@ -803,6 +812,106 @@ (define localed-service-type
|
||||||
the GNOME desktop environment.")
|
the GNOME desktop environment.")
|
||||||
(default-value (localed-configuration)))))
|
(default-value (localed-configuration)))))
|
||||||
|
|
||||||
|
|
||||||
|
;;;
|
||||||
|
;;; Dconf.
|
||||||
|
;;;
|
||||||
|
|
||||||
|
(define-maybe text-config)
|
||||||
|
|
||||||
|
(define-configuration/no-serialization dconf-keyfile
|
||||||
|
(name string
|
||||||
|
"The file name of the associated keyfile, e.g. \"00-login-screen\".")
|
||||||
|
(content text-config "The content of the associated keyfile."))
|
||||||
|
|
||||||
|
(define-configuration/no-serialization dconf-profile
|
||||||
|
(name string "The file name of the dconf system profile, which should match
|
||||||
|
the name of a user for which the profile is to be used with. To have the
|
||||||
|
profile used, the environment variable \"DCONF_PROFILE\" should be set to the
|
||||||
|
profile file, e.g.:
|
||||||
|
@example
|
||||||
|
export DCONF_PROFILE=/etc/dconf/profile/gdm
|
||||||
|
@end example")
|
||||||
|
(content maybe-text-config "The content of the Dconf profile. Unless
|
||||||
|
provided, it defaults to include the user database (\"user-db:NAME\") as well
|
||||||
|
as the system database (\"system-db:NAME\"), which corresponds to the
|
||||||
|
generated database, @file{/etc/dconf/db/NAME}.")
|
||||||
|
(keyfile dconf-keyfile "The keyfile associated with the profile"))
|
||||||
|
|
||||||
|
(define dconf-profiles?
|
||||||
|
(list-of dconf-profile?))
|
||||||
|
|
||||||
|
(define-configuration/no-serialization dconf-configuration
|
||||||
|
(profiles dconf-profiles "The list of <dconf-profile> objects to populate."))
|
||||||
|
|
||||||
|
(define (dconf-profile->profile-file profile)
|
||||||
|
"Given PROFILE, a <dconf-profile> object, return a dconf profile file."
|
||||||
|
(let ((name (dconf-profile-name profile))
|
||||||
|
(content (dconf-profile-content profile)))
|
||||||
|
(apply mixed-text-file
|
||||||
|
name
|
||||||
|
(if (maybe-value-set? content)
|
||||||
|
(interpose content "\n" 'suffix)
|
||||||
|
(interpose (list (string-append "user-db:" name)
|
||||||
|
(string-append "system-db:" name))
|
||||||
|
"\n" 'suffix)))))
|
||||||
|
|
||||||
|
(define (dconf-profile->db-keyfile profile)
|
||||||
|
"Given PROFILE, a <dconf-profile> object, return a dconf profile file."
|
||||||
|
(let ((keyfile (dconf-profile-keyfile profile)))
|
||||||
|
(apply mixed-text-file (dconf-keyfile-name keyfile)
|
||||||
|
(interpose (dconf-keyfile-content keyfile) "\n" 'suffix))))
|
||||||
|
|
||||||
|
(define (dconf-profile->db-keyfile-dir profile)
|
||||||
|
"Wrap the keyfile in a directory, to satisfy 'dconf compile'."
|
||||||
|
(let ((name (dconf-profile-name profile))
|
||||||
|
(keyfile-name (dconf-keyfile-name (dconf-profile-keyfile profile))))
|
||||||
|
(computed-file name
|
||||||
|
#~(begin
|
||||||
|
(mkdir #$output)
|
||||||
|
(symlink #$(dconf-profile->db-keyfile profile)
|
||||||
|
(string-append #$output "/" #$keyfile-name))))))
|
||||||
|
|
||||||
|
(define (dconf-profile->db profile)
|
||||||
|
"Compile the a <dconf-profile> object into a GVariant Database file."
|
||||||
|
(let ((name (dconf-profile-name profile)))
|
||||||
|
(computed-file
|
||||||
|
name
|
||||||
|
(with-imported-modules '((guix build utils))
|
||||||
|
#~(begin
|
||||||
|
(use-modules (guix build utils))
|
||||||
|
(setenv "DCONF_PROFILE" #$(dconf-profile->profile-file profile))
|
||||||
|
(invoke #$(file-append dconf "/bin/dconf") "compile"
|
||||||
|
#$output #$(dconf-profile->db-keyfile-dir profile)))))))
|
||||||
|
|
||||||
|
(define (dconf-profile->files profile)
|
||||||
|
"Given PROFILE, a <dconf-profile> object, return a dconf directory
|
||||||
|
containing the associated profile, keyfile and database files to be assembled
|
||||||
|
under /etc."
|
||||||
|
(let ((name (dconf-profile-name profile))
|
||||||
|
(keyfile-name (dconf-keyfile-name (dconf-profile-keyfile profile))))
|
||||||
|
(list (list (string-append "dconf/profile/" name)
|
||||||
|
(dconf-profile->profile-file profile))
|
||||||
|
(list (string-append "dconf/db/" name ".d/" keyfile-name)
|
||||||
|
(dconf-profile->db-keyfile profile))
|
||||||
|
(list (string-append "dconf/db/" name)
|
||||||
|
(dconf-profile->db profile)))))
|
||||||
|
|
||||||
|
(define dconf-service-type
|
||||||
|
(service-type
|
||||||
|
(name 'dconf-profile)
|
||||||
|
(extensions
|
||||||
|
(list (service-extension etc-service-type
|
||||||
|
(lambda (dconf-profiles)
|
||||||
|
(append-map dconf-profile->files
|
||||||
|
dconf-profiles)))))
|
||||||
|
(compose concatenate)
|
||||||
|
(extend append)
|
||||||
|
(default-value '())
|
||||||
|
(description "Extend the @code{etc-service-type} to populate the file
|
||||||
|
hierarchy under @file{/etc/dconf} with the <dconf-profile> objects provided as
|
||||||
|
argument.")))
|
||||||
|
|
||||||
|
|
||||||
;;;
|
;;;
|
||||||
;;; GNOME Desktop Manager.
|
;;; GNOME Desktop Manager.
|
||||||
|
|
Loading…
Reference in a new issue