diff mbox series

[bug#63758] home-dicod-service-type gnu/service patch

Message ID 87edmzcaj1.fsf@librem.one
State New
Headers show
Series [bug#63758] home-dicod-service-type gnu/service patch | expand

Commit Message

Mitchell Schmeisser May 29, 2023, 5:28 p.m. UTC
Here is an alternate patch which modifies gnu/services/dict.scm to
provide home-dicod-service-type.

This seems better than the code in gnu/home/services/dict.scm which
makes use of a lot of ~(@@ (gnu services dict))~ accessors to parse the
configuration data. I think having home services defined along side
their system counter parts makes it more likely people studying the code
while writing new services will include a home implementation as well.

Comments

Ludovic Courtès Aug. 7, 2023, 9:48 a.m. UTC | #1
Hi Mitchell,

Mitchell Schmeisser <mitchellschmeisser@librem.one> skribis:

> Here is an alternate patch which modifies gnu/services/dict.scm to
> provide home-dicod-service-type.

Please check out <https://issues.guix.gnu.org/65119>, which is an
attempt to provide a consistent and simple way to “port” System services
to Home, including dicod.

Ludo’.
diff mbox series

Patch

From 45c8efc0dbf321cb4cd59ed7f509f241ae8034ce Mon Sep 17 00:00:00 2001
From: Mitchell Schmeisser <mitchellschmeisser@librem.one>
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 <iyzsong@gmail.com>
-;;; Copyright © 2016, 2017, 2018, 2020, 2022 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2016, 2017, 2018, 2020, 2022, 2023 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2017 Huang Ying <huang.ying.caritas@gmail.com>
 ;;;
 ;;; 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* <dicod-configuration>
   (handlers    dicod-configuration-handlers       ;list of <dicod-handler>
                (default '()))
   (databases   dicod-configuration-databases      ;list of <dicod-database>
-               (default (list %dicod-database:gcide))))
+               (default (list %dicod-database:gcide)))
+  (guix-home?  dicod-configuration-guix-home?
+               (default #f)))
 
 (define-record-type* <dicod-handler>
   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