From 45c8efc0dbf321cb4cd59ed7f509f241ae8034ce Mon Sep 17 00:00:00 2001 From: Mitchell Schmeisser Date: Mon, 29 May 2023 13:21:46 -0400 Subject: [PATCH] gnu/services/dict.scm: Add home-dicod-service-type --- gnu/services/dict.scm | 71 +++++++++++++++++++++++++++++++++---------- 1 file changed, 55 insertions(+), 16 deletions(-) diff --git a/gnu/services/dict.scm b/gnu/services/dict.scm index 5a61085..88493ae 100644 --- a/gnu/services/dict.scm +++ b/gnu/services/dict.scm @@ -1,6 +1,6 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2016 Sou Bunnbu -;;; Copyright © 2016, 2017, 2018, 2020, 2022 Ludovic Courtès +;;; Copyright © 2016, 2017, 2018, 2020, 2022, 2023 Ludovic Courtès ;;; Copyright © 2017 Huang Ying ;;; ;;; This file is part of GNU Guix. @@ -26,6 +26,8 @@ (define-module (gnu services dict) #:use-module (guix least-authority) #:use-module (gnu services) #:use-module (gnu services shepherd) + #:use-module (gnu home services) + #:use-module (gnu home services shepherd) #:use-module (gnu system shadow) #:use-module ((gnu packages admin) #:select (shadow)) #:use-module (gnu packages dico) @@ -37,10 +39,12 @@ (define-module (gnu services dict) #:use-module (ice-9 match) #:export (dicod-service ; deprecated dicod-service-type + home-dicod-service-type dicod-configuration dicod-handler dicod-database - %dicod-database:gcide)) + %dicod-database:gcide + %home-dicod-database:gcide)) ;;; @@ -56,7 +60,9 @@ (define-record-type* (handlers dicod-configuration-handlers ;list of (default '())) (databases dicod-configuration-databases ;list of - (default (list %dicod-database:gcide)))) + (default (list %dicod-database:gcide))) + (guix-home? dicod-configuration-guix-home? + (default #f))) (define-record-type* dicod-handler make-dicod-handler @@ -80,6 +86,13 @@ (define %dicod-database:gcide (options (list #~(string-append "dbdir=" #$gcide "/share/gcide") "idxdir=/var/run/dicod")))) +(define %home-dicod-database:gcide + (dicod-database + (name "gcide") + (handler "gcide") + (options (list #~(string-append "dbdir=" #$gcide "/share/gcide") + "idxdir=/tmp/dicod")))) + (define %dicod-accounts (list (user-group (name "dicod") @@ -137,23 +150,30 @@ (define configuration->text (apply mixed-text-file "dicod.conf" (configuration->text config))) -(define %dicod-activation +(define (dicod-activation config) #~(begin (use-modules (guix build utils)) - (let ((user (getpwnam "dicod")) - (rundir "/var/run/dicod")) + (let* ((guix-home? #$(dicod-configuration-guix-home? config)) + (user (if guix-home? + (getuid) (getpwnam "dicod"))) + (rundir (if guix-home? + "/tmp/dicod" + "/var/run/dicod"))) (mkdir-p rundir) - (chown rundir (passwd:uid user) (passwd:gid user))))) + (unless guix-home? + (chown rundir (passwd:uid user) (passwd:gid user)))))) -(define (dicod-shepherd-service config) - (let* ((dicod.conf (dicod-configuration-file config)) +(define* (dicod-shepherd-service config) + (let* ((guix-home? (dicod-configuration-guix-home? config)) + (rt-dir (if guix-home? "/tmp/dicod" "/var/run/dicod")) + (dicod.conf (dicod-configuration-file config)) (interfaces (dicod-configuration-interfaces config)) (dicod (least-authority-wrapper (file-append (dicod-configuration-dico config) "/bin/dicod") #:name "dicod" #:mappings (list (file-system-mapping - (source "/var/run/dicod") + (source rt-dir) (target source) (writable? #t)) (file-system-mapping @@ -165,21 +185,28 @@ (define (dicod-shepherd-service config) #:namespaces (delq 'net %namespaces)))) (list (shepherd-service (provision '(dicod)) - (requirement '(user-processes)) + (requirement (if guix-home? '() '(user-processes))) (documentation "Run the dicod daemon.") (start #~(if (and (defined? 'make-inetd-constructor) #$(= 1 (length interfaces))) ;XXX (make-inetd-constructor (list #$dicod "--inetd" "--foreground" (string-append "--config=" #$dicod.conf)) - (addrinfo:addr - (car (getaddrinfo #$(first interfaces) "dict"))) - #:user "dicod" #:group "dicod" + (list (endpoint + (addrinfo:addr + (car (getaddrinfo #$(first interfaces) + "dict"))))) + #:requirements '#$requirement + #$@(if guix-home? + '() + '(#:user "dicod" #:group "dicod")) #:service-name-stem "dicod") (make-forkexec-constructor (list #$dicod "--foreground" (string-append "--config=" #$dicod.conf)) - #:user "dicod" #:group "dicod"))) + #$@(if guix-home? + '() + '(#:user "dicod" #:group "dicod"))))) (stop #~(if (and (defined? 'make-inetd-destructor) #$(= 1 (length interfaces))) ;XXX (make-inetd-destructor) @@ -193,7 +220,7 @@ (define dicod-service-type (list (service-extension account-service-type (const %dicod-accounts)) (service-extension activation-service-type - (const %dicod-activation)) + dicod-activation) (service-extension shepherd-root-service-type dicod-shepherd-service))) (default-value (dicod-configuration)) @@ -203,6 +230,18 @@ (define dicod-service-type implements the standard DICT protocol supported by clients such as @command{dico} and GNOME Dictionary."))) +(define home-dicod-service-type + (service-type + (inherit dicod-service-type) + (extensions (list (service-extension home-shepherd-service-type + dicod-shepherd-service) + (service-extension home-activation-service-type + dicod-activation))) + (default-value (dicod-configuration + (guix-home? #t) + (databases (list %home-dicod-database:gcide)))))) + + (define-deprecated (dicod-service #:key (config (dicod-configuration))) dicod-service-type "Return a service that runs the @command{dicod} daemon, an implementation -- 2.39.1