GNU bug report logs - #50332
[PATCH] home-services: Add Shepherd.

Previous Next

Package: guix-patches;

Reported by: Andrew Tropin <andrew <at> trop.in>

Date: Thu, 2 Sep 2021 09:38:02 UTC

Severity: normal

Tags: patch

Done: Oleg Pykhalov <go.wigust <at> gmail.com>

Bug is archived. No further changes may be made.

To add a comment to this bug, you must first unarchive it, by sending
a message to control AT debbugs.gnu.org, with unarchive 50332 in the body.
You can then email your comments to 50332 AT debbugs.gnu.org in the normal way.

Toggle the display of automated, internal messages from the tracker.

View this report as an mbox folder, status mbox, maintainer mbox


Report forwarded to guix-patches <at> gnu.org:
bug#50332; Package guix-patches. (Thu, 02 Sep 2021 09:38:02 GMT) Full text and rfc822 format available.

Acknowledgement sent to Andrew Tropin <andrew <at> trop.in>:
New bug report received and forwarded. Copy sent to guix-patches <at> gnu.org. (Thu, 02 Sep 2021 09:38:02 GMT) Full text and rfc822 format available.

Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):

From: Andrew Tropin <andrew <at> trop.in>
To: guix-patches <at> gnu.org
Subject: [PATCH] home-services: Add Shepherd.
Date: Thu, 2 Sep 2021 12:33:36 +0300
[Message part 1 (text/plain, inline)]
* gnu/home-services/shepherd.scm: New file.
* doc/guix.texi: Add documentation about Shepherd Home Service.
---
 doc/guix.texi                  |  31 +++++++-
 gnu/home-services/shepherd.scm | 133 +++++++++++++++++++++++++++++++++
 2 files changed, 163 insertions(+), 1 deletion(-)
 create mode 100644 gnu/home-services/shepherd.scm

diff --git a/doc/guix.texi b/doc/guix.texi
index 622a973bdf..51a317e8a7 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -35538,7 +35538,36 @@ mcron info here
 
 @node Shepherd Home Service
 @subsection Managing User's Daemons
-shepherd info here
+
+@cindex shepherd services
+
+@defvr {Scheme Variable} shepherd-home-service-type
+The service type for the userland Shepherd, which allows to manage
+long-running process or one-shot tasks.  Almost all the information
+described in (@pxref{Shepherd Services}) is applicable here too.
+
+This is the service type that extensions target when they want to create
+shepherd services (@pxref{Service Types and Services}, for an example).
+Each extension must pass a list of @code{<shepherd-service>}.  Its
+value must be a @code{shepherd-configuration}, as described below.
+@end defvr
+
+@deftp {Data Type} shepherd-configuration
+This data type represents the Shepherd's configuration.
+
+@table @code
+@item shepherd (default: @code{shepherd})
+The Shepherd package to use.
+
+@item auto-start? (default: @code{#t})
+Wether or not to start Shepherd on first login.
+
+@item services (default: @code{'()})
+A list of @code{<shepherd-service>} to start.
+You should probably use the service extension
+mechanism instead (@pxref{Shepherd Services}).
+@end table
+@end deftp
 
 @node Invoking guix home
 @section Invoking @code{guix home}
diff --git a/gnu/home-services/shepherd.scm b/gnu/home-services/shepherd.scm
new file mode 100644
index 0000000000..158b50bdb6
--- /dev/null
+++ b/gnu/home-services/shepherd.scm
@@ -0,0 +1,133 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2021 Andrew Tropin <andrew <at> trop.in>
+;;; Copyright © 2021 Xinglu Chen <public <at> yoctocell.xyz>
+;;;
+;;; This file is part of GNU Guix.
+;;;
+;;; GNU Guix is free software; you can redistribute it and/or modify it
+;;; under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 3 of the License, or (at
+;;; your option) any later version.
+;;;
+;;; GNU Guix is distributed in the hope that it will be useful, but
+;;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
+
+(define-module (gnu home-services shepherd)
+  #:use-module (gnu home-services)
+  #:use-module (gnu packages admin)
+  #:use-module (gnu services shepherd)
+  #:use-module (guix sets)
+  #:use-module (guix gexp)
+  #:use-module (guix i18n)
+  #:use-module (guix records)
+
+  #:use-module (srfi srfi-1)
+
+  #:re-export (shepherd-service
+               shepherd-action))
+
+(define-record-type* <home-shepherd-configuration>
+  home-shepherd-configuration make-home-shepherd-configuration
+  home-shepherd-configuration?
+  (shepherd home-shepherd-configuration-shepherd
+            (default shepherd)) ; package
+  (auto-start? home-shepherd-configuration-auto-start?
+               (default #t))
+  (services home-shepherd-configuration-services
+            (default '())))
+
+(define (home-shepherd-configuration-file services shepherd)
+  "Return the shepherd configuration file for SERVICES.  SHEPHERD is used
+as shepherd package."
+  (assert-valid-graph services)
+
+  (let ((files (map shepherd-service-file services))
+        ;; TODO: Add compilation of services, it can improve start
+        ;; time.
+        ;; (scm->go (cute scm->go <> shepherd))
+        )
+    (define config
+      #~(begin
+          (use-modules (srfi srfi-34)
+                       (system repl error-handling))
+          (apply
+           register-services
+           (map
+            (lambda (file) (load file))
+            '#$files))
+          (action 'root 'daemonize)
+          (format #t "Starting services...~%")
+          (for-each
+           (lambda (service) (start service))
+           '#$(append-map shepherd-service-provision
+                          (filter shepherd-service-auto-start?
+                                  services)))
+          (newline)))
+
+    (scheme-file "shepherd.conf" config)))
+
+(define (launch-shepherd-gexp config)
+  (let* ((shepherd (home-shepherd-configuration-shepherd config))
+         (services (home-shepherd-configuration-services config)))
+    (if (home-shepherd-configuration-auto-start? config)
+        (with-imported-modules '((guix build utils))
+          #~(let ((log-dir (or (getenv "XDG_LOG_HOME")
+                               (format #f "~a/.local/var/log" (getenv "HOME")))))
+              ((@ (guix build utils) mkdir-p) log-dir)
+              (system*
+               #$(file-append shepherd "/bin/shepherd")
+               "--logfile"
+               (string-append
+                log-dir
+                "/shepherd.log")
+               "--config"
+               #$(home-shepherd-configuration-file services shepherd))))
+        #~"")))
+
+(define (reload-configuration-gexp config)
+  (let* ((shepherd (home-shepherd-configuration-shepherd config))
+         (services (home-shepherd-configuration-services config)))
+    #~(system*
+       #$(file-append shepherd "/bin/herd")
+       "load" "root"
+       #$(home-shepherd-configuration-file services shepherd))))
+
+(define (ensure-shepherd-gexp config)
+  #~(if (file-exists?
+         (string-append
+          (or (getenv "XDG_RUNTIME_DIR")
+              (format #f "/run/user/~a" (getuid)))
+          "/shepherd/socket"))
+        #$(reload-configuration-gexp config)
+        #$(launch-shepherd-gexp config)))
+
+(define-public home-shepherd-service-type
+  (service-type (name 'home-shepherd)
+                (extensions
+                 (list (service-extension
+                        home-run-on-first-login-service-type
+                        launch-shepherd-gexp)
+                       (service-extension
+                        home-activation-service-type
+                        ensure-shepherd-gexp)
+                       (service-extension
+                        home-profile-service-type
+                        (lambda (config)
+                          `(,(home-shepherd-configuration-shepherd config))))))
+                (compose concatenate)
+                (extend
+                 (lambda (config extra-services)
+                   (home-shepherd-configuration
+                    (inherit config)
+                    (services
+                     (append (home-shepherd-configuration-services config)
+                             extra-services)))))
+                (default-value (home-shepherd-configuration))
+                (description "Configure and install userland Shepherd.")))
+
+
-- 
2.33.0

[signature.asc (application/pgp-signature, inline)]

Information forwarded to guix-patches <at> gnu.org:
bug#50332; Package guix-patches. (Thu, 02 Sep 2021 15:01:03 GMT) Full text and rfc822 format available.

Message #8 received at 50332 <at> debbugs.gnu.org (full text, mbox):

From: Xinglu Chen <public <at> yoctocell.xyz>
To: Andrew Tropin <andrew <at> trop.in>, 50332 <at> debbugs.gnu.org
Subject: Re: [bug#50332] [PATCH] home-services: Add Shepherd.
Date: Thu, 02 Sep 2021 16:59:49 +0200
[Message part 1 (text/plain, inline)]
On Thu, Sep 02 2021, Andrew Tropin wrote:

> * gnu/home-services/shepherd.scm: New file.
> * doc/guix.texi: Add documentation about Shepherd Home Service.
> ---
>  doc/guix.texi                  |  31 +++++++-
>  gnu/home-services/shepherd.scm | 133 +++++++++++++++++++++++++++++++++
>  2 files changed, 163 insertions(+), 1 deletion(-)
>  create mode 100644 gnu/home-services/shepherd.scm
>
> diff --git a/doc/guix.texi b/doc/guix.texi
> index 622a973bdf..51a317e8a7 100644
> --- a/doc/guix.texi
> +++ b/doc/guix.texi
> @@ -35538,7 +35538,36 @@ mcron info here
>  
>  @node Shepherd Home Service
>  @subsection Managing User's Daemons
> -shepherd info here
> +
> +@cindex shepherd services
> +
> +@defvr {Scheme Variable} shepherd-home-service-type
> +The service type for the userland Shepherd, which allows to manage

“allows one to manage”

> +long-running process or one-shot tasks.  Almost all the information

s/process/processes/

> +described in (@pxref{Shepherd Services}) is applicable here too.

What is not applicable?

> +This is the service type that extensions target when they want to create
> +shepherd services (@pxref{Service Types and Services}, for an example).
> +Each extension must pass a list of @code{<shepherd-service>}.  Its
> +value must be a @code{shepherd-configuration}, as described below.
> +@end defvr
> +
> +@deftp {Data Type} shepherd-configuration
> +This data type represents the Shepherd's configuration.
> +
> +@table @code
> +@item shepherd (default: @code{shepherd})
> +The Shepherd package to use.
> +
> +@item auto-start? (default: @code{#t})
> +Wether or not to start Shepherd on first login.

s/Wether/Whether/

> +@item services (default: @code{'()})
> +A list of @code{<shepherd-service>} to start.
> +You should probably use the service extension
> +mechanism instead (@pxref{Shepherd Services}).
> +@end table
> +@end deftp
>  
>  @node Invoking guix home
>  @section Invoking @code{guix home}
> diff --git a/gnu/home-services/shepherd.scm b/gnu/home-services/shepherd.scm
> new file mode 100644
> index 0000000000..158b50bdb6
> --- /dev/null
> +++ b/gnu/home-services/shepherd.scm
> @@ -0,0 +1,133 @@
> +;;; GNU Guix --- Functional package management for GNU
> +;;; Copyright © 2021 Andrew Tropin <andrew <at> trop.in>
> +;;; Copyright © 2021 Xinglu Chen <public <at> yoctocell.xyz>
> +;;;
> +;;; This file is part of GNU Guix.
> +;;;
> +;;; GNU Guix is free software; you can redistribute it and/or modify it
> +;;; under the terms of the GNU General Public License as published by
> +;;; the Free Software Foundation; either version 3 of the License, or (at
> +;;; your option) any later version.
> +;;;
> +;;; GNU Guix is distributed in the hope that it will be useful, but
> +;;; WITHOUT ANY WARRANTY; without even the implied warranty of
> +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> +;;; GNU General Public License for more details.
> +;;;
> +;;; You should have received a copy of the GNU General Public License
> +;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
> +
> +(define-module (gnu home-services shepherd)
> +  #:use-module (gnu home-services)
> +  #:use-module (gnu packages admin)
> +  #:use-module (gnu services shepherd)
> +  #:use-module (guix sets)
> +  #:use-module (guix gexp)
> +  #:use-module (guix i18n)
> +  #:use-module (guix records)
> +
> +  #:use-module (srfi srfi-1)
> +
> +  #:re-export (shepherd-service
> +               shepherd-action))
> +
> +(define-record-type* <home-shepherd-configuration>
> +  home-shepherd-configuration make-home-shepherd-configuration
> +  home-shepherd-configuration?
> +  (shepherd home-shepherd-configuration-shepherd
> +            (default shepherd)) ; package
> +  (auto-start? home-shepherd-configuration-auto-start?
> +               (default #t))
> +  (services home-shepherd-configuration-services
> +            (default '())))
> +
> +(define (home-shepherd-configuration-file services shepherd)
> +  "Return the shepherd configuration file for SERVICES.  SHEPHERD is used
> +as shepherd package."
> +  (assert-valid-graph services)
> +
> +  (let ((files (map shepherd-service-file services))
> +        ;; TODO: Add compilation of services, it can improve start
> +        ;; time.
> +        ;; (scm->go (cute scm->go <> shepherd))
> +        )
> +    (define config
> +      #~(begin
> +          (use-modules (srfi srfi-34)
> +                       (system repl error-handling))
> +          (apply
> +           register-services
> +           (map
> +            (lambda (file) (load file))
> +            '#$files))
> +          (action 'root 'daemonize)
> +          (format #t "Starting services...~%")

Maybe (G_ ...) should be used to make strings translatable?

> +          (for-each
> +           (lambda (service) (start service))
> +           '#$(append-map shepherd-service-provision
> +                          (filter shepherd-service-auto-start?
> +                                  services)))
> +          (newline)))

Is ‘newline’ necessary?

> +    (scheme-file "shepherd.conf" config)))
> +
> +(define (launch-shepherd-gexp config)
> +  (let* ((shepherd (home-shepherd-configuration-shepherd config))
> +         (services (home-shepherd-configuration-services config)))
> +    (if (home-shepherd-configuration-auto-start? config)
> +        (with-imported-modules '((guix build utils))
> +          #~(let ((log-dir (or (getenv "XDG_LOG_HOME")
> +                               (format #f "~a/.local/var/log" (getenv "HOME")))))
> +              ((@ (guix build utils) mkdir-p) log-dir)
> +              (system*
> +               #$(file-append shepherd "/bin/shepherd")
> +               "--logfile"
> +               (string-append
> +                log-dir
> +                "/shepherd.log")
> +               "--config"
> +               #$(home-shepherd-configuration-file services shepherd))))
> +        #~"")))
> +
> +(define (reload-configuration-gexp config)
> +  (let* ((shepherd (home-shepherd-configuration-shepherd config))
> +         (services (home-shepherd-configuration-services config)))
> +    #~(system*
> +       #$(file-append shepherd "/bin/herd")
> +       "load" "root"
> +       #$(home-shepherd-configuration-file services shepherd))))
> +
> +(define (ensure-shepherd-gexp config)
> +  #~(if (file-exists?
> +         (string-append
> +          (or (getenv "XDG_RUNTIME_DIR")
> +              (format #f "/run/user/~a" (getuid)))
> +          "/shepherd/socket"))
> +        #$(reload-configuration-gexp config)
> +        #$(launch-shepherd-gexp config)))
> +
> +(define-public home-shepherd-service-type
> +  (service-type (name 'home-shepherd)
> +                (extensions
> +                 (list (service-extension
> +                        home-run-on-first-login-service-type
> +                        launch-shepherd-gexp)
> +                       (service-extension
> +                        home-activation-service-type
> +                        ensure-shepherd-gexp)
> +                       (service-extension
> +                        home-profile-service-type
> +                        (lambda (config)
> +                          `(,(home-shepherd-configuration-shepherd config))))))

Nit: I would use ‘list’ instead of quasiquoting and unquoting.

> +                (compose concatenate)
> +                (extend
> +                 (lambda (config extra-services)
> +                   (home-shepherd-configuration
> +                    (inherit config)
> +                    (services
> +                     (append (home-shepherd-configuration-services config)
> +                             extra-services)))))
> +                (default-value (home-shepherd-configuration))
> +                (description "Configure and install userland Shepherd.")))
> +
> +
> -- 
> 2.33.0
[signature.asc (application/pgp-signature, inline)]

Information forwarded to guix-patches <at> gnu.org:
bug#50332; Package guix-patches. (Fri, 03 Sep 2021 07:45:02 GMT) Full text and rfc822 format available.

Message #11 received at 50332 <at> debbugs.gnu.org (full text, mbox):

From: Andrew Tropin <andrew <at> trop.in>
To: Xinglu Chen <public <at> yoctocell.xyz>, 50332 <at> debbugs.gnu.org
Subject: [PATCH v2] home-services: Add Shepherd.
Date: Fri, 03 Sep 2021 10:44:22 +0300
[Message part 1 (text/plain, inline)]
On 2021-09-02 16:59, Xinglu Chen wrote:

> On Thu, Sep 02 2021, Andrew Tropin wrote:
>
>> * gnu/home-services/shepherd.scm: New file.
>> * doc/guix.texi: Add documentation about Shepherd Home Service.
>> ---
>>  doc/guix.texi                  |  31 +++++++-
>>  gnu/home-services/shepherd.scm | 133 +++++++++++++++++++++++++++++++++
>>  2 files changed, 163 insertions(+), 1 deletion(-)
>>  create mode 100644 gnu/home-services/shepherd.scm
>>
>> diff --git a/doc/guix.texi b/doc/guix.texi
>> index 622a973bdf..51a317e8a7 100644
>> --- a/doc/guix.texi
>> +++ b/doc/guix.texi
>> @@ -35538,7 +35538,36 @@ mcron info here
>>  
>>  @node Shepherd Home Service
>>  @subsection Managing User's Daemons
>> -shepherd info here
>> +
>> +@cindex shepherd services
>> +
>> +@defvr {Scheme Variable} shepherd-home-service-type
>> +The service type for the userland Shepherd, which allows to manage
>
> “allows one to manage”
>
>> +long-running process or one-shot tasks.  Almost all the information
>
> s/process/processes/
>
>> +described in (@pxref{Shepherd Services}) is applicable here too.
>
> What is not applicable?
>

Clarified.

>
>> +This is the service type that extensions target when they want to create
>> +shepherd services (@pxref{Service Types and Services}, for an example).
>> +Each extension must pass a list of @code{<shepherd-service>}.  Its
>> +value must be a @code{shepherd-configuration}, as described below.
>> +@end defvr
>> +
>> +@deftp {Data Type} shepherd-configuration
>> +This data type represents the Shepherd's configuration.
>> +
>> +@table @code
>> +@item shepherd (default: @code{shepherd})
>> +The Shepherd package to use.
>> +
>> +@item auto-start? (default: @code{#t})
>> +Wether or not to start Shepherd on first login.
>
> s/Wether/Whether/
>
>> +@item services (default: @code{'()})
>> +A list of @code{<shepherd-service>} to start.
>> +You should probably use the service extension
>> +mechanism instead (@pxref{Shepherd Services}).
>> +@end table
>> +@end deftp
>>  
>>  @node Invoking guix home
>>  @section Invoking @code{guix home}
>> diff --git a/gnu/home-services/shepherd.scm b/gnu/home-services/shepherd.scm
>> new file mode 100644
>> index 0000000000..158b50bdb6
>> --- /dev/null
>> +++ b/gnu/home-services/shepherd.scm
>> @@ -0,0 +1,133 @@
>> +;;; GNU Guix --- Functional package management for GNU
>> +;;; Copyright © 2021 Andrew Tropin <andrew <at> trop.in>
>> +;;; Copyright © 2021 Xinglu Chen <public <at> yoctocell.xyz>
>> +;;;
>> +;;; This file is part of GNU Guix.
>> +;;;
>> +;;; GNU Guix is free software; you can redistribute it and/or modify it
>> +;;; under the terms of the GNU General Public License as published by
>> +;;; the Free Software Foundation; either version 3 of the License, or (at
>> +;;; your option) any later version.
>> +;;;
>> +;;; GNU Guix is distributed in the hope that it will be useful, but
>> +;;; WITHOUT ANY WARRANTY; without even the implied warranty of
>> +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>> +;;; GNU General Public License for more details.
>> +;;;
>> +;;; You should have received a copy of the GNU General Public License
>> +;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
>> +
>> +(define-module (gnu home-services shepherd)
>> +  #:use-module (gnu home-services)
>> +  #:use-module (gnu packages admin)
>> +  #:use-module (gnu services shepherd)
>> +  #:use-module (guix sets)
>> +  #:use-module (guix gexp)
>> +  #:use-module (guix i18n)
>> +  #:use-module (guix records)
>> +
>> +  #:use-module (srfi srfi-1)
>> +
>> +  #:re-export (shepherd-service
>> +               shepherd-action))
>> +
>> +(define-record-type* <home-shepherd-configuration>
>> +  home-shepherd-configuration make-home-shepherd-configuration
>> +  home-shepherd-configuration?
>> +  (shepherd home-shepherd-configuration-shepherd
>> +            (default shepherd)) ; package
>> +  (auto-start? home-shepherd-configuration-auto-start?
>> +               (default #t))
>> +  (services home-shepherd-configuration-services
>> +            (default '())))
>> +
>> +(define (home-shepherd-configuration-file services shepherd)
>> +  "Return the shepherd configuration file for SERVICES.  SHEPHERD is used
>> +as shepherd package."
>> +  (assert-valid-graph services)
>> +
>> +  (let ((files (map shepherd-service-file services))
>> +        ;; TODO: Add compilation of services, it can improve start
>> +        ;; time.
>> +        ;; (scm->go (cute scm->go <> shepherd))
>> +        )
>> +    (define config
>> +      #~(begin
>> +          (use-modules (srfi srfi-34)
>> +                       (system repl error-handling))
>> +          (apply
>> +           register-services
>> +           (map
>> +            (lambda (file) (load file))
>> +            '#$files))
>> +          (action 'root 'daemonize)
>> +          (format #t "Starting services...~%")
>
> Maybe (G_ ...) should be used to make strings translatable?
>
>
>> +          (for-each
>> +           (lambda (service) (start service))
>> +           '#$(append-map shepherd-service-provision
>> +                          (filter shepherd-service-auto-start?
>> +                                  services)))
>> +          (newline)))
>
> Is ‘newline’ necessary?
>

Not necessary, but nice to have for better separation of different
processes launched during activation.  It could newline at the beginning
of each activation subscript, but it is what it is)

>
>> +    (scheme-file "shepherd.conf" config)))
>> +
>> +(define (launch-shepherd-gexp config)
>> +  (let* ((shepherd (home-shepherd-configuration-shepherd config))
>> +         (services (home-shepherd-configuration-services config)))
>> +    (if (home-shepherd-configuration-auto-start? config)
>> +        (with-imported-modules '((guix build utils))
>> +          #~(let ((log-dir (or (getenv "XDG_LOG_HOME")
>> +                               (format #f "~a/.local/var/log" (getenv "HOME")))))
>> +              ((@ (guix build utils) mkdir-p) log-dir)
>> +              (system*
>> +               #$(file-append shepherd "/bin/shepherd")
>> +               "--logfile"
>> +               (string-append
>> +                log-dir
>> +                "/shepherd.log")
>> +               "--config"
>> +               #$(home-shepherd-configuration-file services shepherd))))
>> +        #~"")))
>> +
>> +(define (reload-configuration-gexp config)
>> +  (let* ((shepherd (home-shepherd-configuration-shepherd config))
>> +         (services (home-shepherd-configuration-services config)))
>> +    #~(system*
>> +       #$(file-append shepherd "/bin/herd")
>> +       "load" "root"
>> +       #$(home-shepherd-configuration-file services shepherd))))
>> +
>> +(define (ensure-shepherd-gexp config)
>> +  #~(if (file-exists?
>> +         (string-append
>> +          (or (getenv "XDG_RUNTIME_DIR")
>> +              (format #f "/run/user/~a" (getuid)))
>> +          "/shepherd/socket"))
>> +        #$(reload-configuration-gexp config)
>> +        #$(launch-shepherd-gexp config)))
>> +
>> +(define-public home-shepherd-service-type
>> +  (service-type (name 'home-shepherd)
>> +                (extensions
>> +                 (list (service-extension
>> +                        home-run-on-first-login-service-type
>> +                        launch-shepherd-gexp)
>> +                       (service-extension
>> +                        home-activation-service-type
>> +                        ensure-shepherd-gexp)
>> +                       (service-extension
>> +                        home-profile-service-type
>> +                        (lambda (config)
>> +                          `(,(home-shepherd-configuration-shepherd config))))))
>
> Nit: I would use ‘list’ instead of quasiquoting and unquoting.
>

It's probably done this way to keep the line under 80 characters long,
but I agree, using list would be a little more cleaner.

>
>> +                (compose concatenate)
>> +                (extend
>> +                 (lambda (config extra-services)
>> +                   (home-shepherd-configuration
>> +                    (inherit config)
>> +                    (services
>> +                     (append (home-shepherd-configuration-services config)
>> +                             extra-services)))))
>> +                (default-value (home-shepherd-configuration))
>> +                (description "Configure and install userland Shepherd.")))
>> +
>> +
>> -- 
>> 2.33.0

Replied or addressed all the comments.

[v2-0001-home-services-Add-Shepherd.patch (text/x-patch, inline)]
From c12b51bdbc86fa995c88f331b5d04b0b963087cf Mon Sep 17 00:00:00 2001
From: Andrew Tropin <andrew <at> trop.in>
Date: Thu, 2 Sep 2021 12:33:36 +0300
Subject: [PATCH v2] home-services: Add Shepherd.

* gnu/home-services/shepherd.scm: New file.
* doc/guix.texi: Add documentation about Shepherd Home Service.
---
 doc/guix.texi                  |  32 +++++++-
 gnu/home-services/shepherd.scm | 133 +++++++++++++++++++++++++++++++++
 2 files changed, 164 insertions(+), 1 deletion(-)
 create mode 100644 gnu/home-services/shepherd.scm

diff --git a/doc/guix.texi b/doc/guix.texi
index 622a973bdf..0591848f7e 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -35538,7 +35538,37 @@ mcron info here
 
 @node Shepherd Home Service
 @subsection Managing User's Daemons
-shepherd info here
+
+@cindex shepherd services
+
+@defvr {Scheme Variable} home-shepherd-service-type
+The service type for the userland Shepherd, which allows one to manage
+long-running processes or one-shot tasks.  User's Shepherd is not an
+init process (PID 1), but almost all other information described in
+(@pxref{Shepherd Services}) is applicable here too.
+
+This is the service type that extensions target when they want to create
+shepherd services (@pxref{Service Types and Services}, for an example).
+Each extension must pass a list of @code{<shepherd-service>}.  Its
+value must be a @code{shepherd-configuration}, as described below.
+@end defvr
+
+@deftp {Data Type} shepherd-configuration
+This data type represents the Shepherd's configuration.
+
+@table @code
+@item shepherd (default: @code{shepherd})
+The Shepherd package to use.
+
+@item auto-start? (default: @code{#t})
+Whether or not to start Shepherd on first login.
+
+@item services (default: @code{'()})
+A list of @code{<shepherd-service>} to start.
+You should probably use the service extension
+mechanism instead (@pxref{Shepherd Services}).
+@end table
+@end deftp
 
 @node Invoking guix home
 @section Invoking @code{guix home}
diff --git a/gnu/home-services/shepherd.scm b/gnu/home-services/shepherd.scm
new file mode 100644
index 0000000000..04366f4b81
--- /dev/null
+++ b/gnu/home-services/shepherd.scm
@@ -0,0 +1,133 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2021 Andrew Tropin <andrew <at> trop.in>
+;;; Copyright © 2021 Xinglu Chen <public <at> yoctocell.xyz>
+;;;
+;;; This file is part of GNU Guix.
+;;;
+;;; GNU Guix is free software; you can redistribute it and/or modify it
+;;; under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 3 of the License, or (at
+;;; your option) any later version.
+;;;
+;;; GNU Guix is distributed in the hope that it will be useful, but
+;;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
+
+(define-module (gnu home-services shepherd)
+  #:use-module (gnu home-services)
+  #:use-module (gnu packages admin)
+  #:use-module (gnu services shepherd)
+  #:use-module (guix sets)
+  #:use-module (guix gexp)
+  #:use-module (guix i18n)
+  #:use-module (guix records)
+
+  #:use-module (srfi srfi-1)
+
+  #:re-export (shepherd-service
+               shepherd-action))
+
+(define-record-type* <home-shepherd-configuration>
+  home-shepherd-configuration make-home-shepherd-configuration
+  home-shepherd-configuration?
+  (shepherd home-shepherd-configuration-shepherd
+            (default shepherd)) ; package
+  (auto-start? home-shepherd-configuration-auto-start?
+               (default #t))
+  (services home-shepherd-configuration-services
+            (default '())))
+
+(define (home-shepherd-configuration-file services shepherd)
+  "Return the shepherd configuration file for SERVICES.  SHEPHERD is used
+as shepherd package."
+  (assert-valid-graph services)
+
+  (let ((files (map shepherd-service-file services))
+        ;; TODO: Add compilation of services, it can improve start
+        ;; time.
+        ;; (scm->go (cute scm->go <> shepherd))
+        )
+    (define config
+      #~(begin
+          (use-modules (srfi srfi-34)
+                       (system repl error-handling))
+          (apply
+           register-services
+           (map
+            (lambda (file) (load file))
+            '#$files))
+          (action 'root 'daemonize)
+          (format #t (G_ "Starting services...~%"))
+          (for-each
+           (lambda (service) (start service))
+           '#$(append-map shepherd-service-provision
+                          (filter shepherd-service-auto-start?
+                                  services)))
+          (newline)))
+
+    (scheme-file "shepherd.conf" config)))
+
+(define (launch-shepherd-gexp config)
+  (let* ((shepherd (home-shepherd-configuration-shepherd config))
+         (services (home-shepherd-configuration-services config)))
+    (if (home-shepherd-configuration-auto-start? config)
+        (with-imported-modules '((guix build utils))
+          #~(let ((log-dir (or (getenv "XDG_LOG_HOME")
+                               (format #f "~a/.local/var/log" (getenv "HOME")))))
+              ((@ (guix build utils) mkdir-p) log-dir)
+              (system*
+               #$(file-append shepherd "/bin/shepherd")
+               "--logfile"
+               (string-append
+                log-dir
+                "/shepherd.log")
+               "--config"
+               #$(home-shepherd-configuration-file services shepherd))))
+        #~"")))
+
+(define (reload-configuration-gexp config)
+  (let* ((shepherd (home-shepherd-configuration-shepherd config))
+         (services (home-shepherd-configuration-services config)))
+    #~(system*
+       #$(file-append shepherd "/bin/herd")
+       "load" "root"
+       #$(home-shepherd-configuration-file services shepherd))))
+
+(define (ensure-shepherd-gexp config)
+  #~(if (file-exists?
+         (string-append
+          (or (getenv "XDG_RUNTIME_DIR")
+              (format #f "/run/user/~a" (getuid)))
+          "/shepherd/socket"))
+        #$(reload-configuration-gexp config)
+        #$(launch-shepherd-gexp config)))
+
+(define-public home-shepherd-service-type
+  (service-type (name 'home-shepherd)
+                (extensions
+                 (list (service-extension
+                        home-run-on-first-login-service-type
+                        launch-shepherd-gexp)
+                       (service-extension
+                        home-activation-service-type
+                        ensure-shepherd-gexp)
+                       (service-extension
+                        home-profile-service-type
+                        (lambda (config)
+                          `(,(home-shepherd-configuration-shepherd config))))))
+                (compose concatenate)
+                (extend
+                 (lambda (config extra-services)
+                   (home-shepherd-configuration
+                    (inherit config)
+                    (services
+                     (append (home-shepherd-configuration-services config)
+                             extra-services)))))
+                (default-value (home-shepherd-configuration))
+                (description "Configure and install userland Shepherd.")))
+
+
-- 
2.33.0

[signature.asc (application/pgp-signature, inline)]

Reply sent to Oleg Pykhalov <go.wigust <at> gmail.com>:
You have taken responsibility. (Fri, 03 Sep 2021 11:04:03 GMT) Full text and rfc822 format available.

Notification sent to Andrew Tropin <andrew <at> trop.in>:
bug acknowledged by developer. (Fri, 03 Sep 2021 11:04:03 GMT) Full text and rfc822 format available.

Message #16 received at 50332-done <at> debbugs.gnu.org (full text, mbox):

From: Oleg Pykhalov <go.wigust <at> gmail.com>
To: Andrew Tropin <andrew <at> trop.in>
Cc: Xinglu Chen <public <at> yoctocell.xyz>, 50332-done <at> debbugs.gnu.org
Subject: Re: bug#50332: [PATCH] home-services: Add Shepherd.
Date: Fri, 03 Sep 2021 14:03:19 +0300
[Message part 1 (text/plain, inline)]
Andrew Tropin <andrew <at> trop.in> writes:

>>> * gnu/home-services/shepherd.scm: New file.
>>> * doc/guix.texi: Add documentation about Shepherd Home Service.
>>> ---
>>>  doc/guix.texi                  |  31 +++++++-
>>>  gnu/home-services/shepherd.scm | 133 +++++++++++++++++++++++++++++++++

Added to gnu/local.mk.

Pushed to wip-guix-home.
[signature.asc (application/pgp-signature, inline)]

Information forwarded to guix-patches <at> gnu.org:
bug#50332; Package guix-patches. (Fri, 03 Sep 2021 14:33:02 GMT) Full text and rfc822 format available.

Message #19 received at 50332 <at> debbugs.gnu.org (full text, mbox):

From: Xinglu Chen <public <at> yoctocell.xyz>
To: Andrew Tropin <andrew <at> trop.in>, 50332 <at> debbugs.gnu.org
Subject: Re: [bug#50332] [PATCH v2] home-services: Add Shepherd.
Date: Fri, 03 Sep 2021 16:31:48 +0200
[Message part 1 (text/plain, inline)]
On Fri, Sep 03 2021, Andrew Tropin wrote:

> On 2021-09-02 16:59, Xinglu Chen wrote:
>
>> On Thu, Sep 02 2021, Andrew Tropin wrote:
>>
>>> * gnu/home-services/shepherd.scm: New file.
>>> * doc/guix.texi: Add documentation about Shepherd Home Service.
>>> ---
>>>  doc/guix.texi                  |  31 +++++++-
>>>  gnu/home-services/shepherd.scm | 133 +++++++++++++++++++++++++++++++++
>>>  2 files changed, 163 insertions(+), 1 deletion(-)
>>>  create mode 100644 gnu/home-services/shepherd.scm
>>>
>>> diff --git a/doc/guix.texi b/doc/guix.texi
>>> index 622a973bdf..51a317e8a7 100644
>>> --- a/doc/guix.texi
>>> +++ b/doc/guix.texi
>>> @@ -35538,7 +35538,36 @@ mcron info here
>>>  
>>>  @node Shepherd Home Service
>>>  @subsection Managing User's Daemons
>>> -shepherd info here
>>> +
>>> +@cindex shepherd services
>>> +
>>> +@defvr {Scheme Variable} shepherd-home-service-type
>>> +The service type for the userland Shepherd, which allows to manage
>>
>> “allows one to manage”
>>
>>> +long-running process or one-shot tasks.  Almost all the information
>>
>> s/process/processes/
>>
>>> +described in (@pxref{Shepherd Services}) is applicable here too.
>>
>> What is not applicable?
>>
>
> Clarified.
>
>>
>>> +This is the service type that extensions target when they want to create
>>> +shepherd services (@pxref{Service Types and Services}, for an example).
>>> +Each extension must pass a list of @code{<shepherd-service>}.  Its
>>> +value must be a @code{shepherd-configuration}, as described below.
>>> +@end defvr
>>> +
>>> +@deftp {Data Type} shepherd-configuration
>>> +This data type represents the Shepherd's configuration.
>>> +
>>> +@table @code
>>> +@item shepherd (default: @code{shepherd})
>>> +The Shepherd package to use.
>>> +
>>> +@item auto-start? (default: @code{#t})
>>> +Wether or not to start Shepherd on first login.
>>
>> s/Wether/Whether/
>>
>>> +@item services (default: @code{'()})
>>> +A list of @code{<shepherd-service>} to start.
>>> +You should probably use the service extension
>>> +mechanism instead (@pxref{Shepherd Services}).
>>> +@end table
>>> +@end deftp
>>>  
>>>  @node Invoking guix home
>>>  @section Invoking @code{guix home}
>>> diff --git a/gnu/home-services/shepherd.scm b/gnu/home-services/shepherd.scm
>>> new file mode 100644
>>> index 0000000000..158b50bdb6
>>> --- /dev/null
>>> +++ b/gnu/home-services/shepherd.scm
>>> @@ -0,0 +1,133 @@
>>> +;;; GNU Guix --- Functional package management for GNU
>>> +;;; Copyright © 2021 Andrew Tropin <andrew <at> trop.in>
>>> +;;; Copyright © 2021 Xinglu Chen <public <at> yoctocell.xyz>
>>> +;;;
>>> +;;; This file is part of GNU Guix.
>>> +;;;
>>> +;;; GNU Guix is free software; you can redistribute it and/or modify it
>>> +;;; under the terms of the GNU General Public License as published by
>>> +;;; the Free Software Foundation; either version 3 of the License, or (at
>>> +;;; your option) any later version.
>>> +;;;
>>> +;;; GNU Guix is distributed in the hope that it will be useful, but
>>> +;;; WITHOUT ANY WARRANTY; without even the implied warranty of
>>> +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>>> +;;; GNU General Public License for more details.
>>> +;;;
>>> +;;; You should have received a copy of the GNU General Public License
>>> +;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
>>> +
>>> +(define-module (gnu home-services shepherd)
>>> +  #:use-module (gnu home-services)
>>> +  #:use-module (gnu packages admin)
>>> +  #:use-module (gnu services shepherd)
>>> +  #:use-module (guix sets)
>>> +  #:use-module (guix gexp)
>>> +  #:use-module (guix i18n)
>>> +  #:use-module (guix records)
>>> +
>>> +  #:use-module (srfi srfi-1)
>>> +
>>> +  #:re-export (shepherd-service
>>> +               shepherd-action))
>>> +
>>> +(define-record-type* <home-shepherd-configuration>
>>> +  home-shepherd-configuration make-home-shepherd-configuration
>>> +  home-shepherd-configuration?
>>> +  (shepherd home-shepherd-configuration-shepherd
>>> +            (default shepherd)) ; package
>>> +  (auto-start? home-shepherd-configuration-auto-start?
>>> +               (default #t))
>>> +  (services home-shepherd-configuration-services
>>> +            (default '())))
>>> +
>>> +(define (home-shepherd-configuration-file services shepherd)
>>> +  "Return the shepherd configuration file for SERVICES.  SHEPHERD is used
>>> +as shepherd package."
>>> +  (assert-valid-graph services)
>>> +
>>> +  (let ((files (map shepherd-service-file services))
>>> +        ;; TODO: Add compilation of services, it can improve start
>>> +        ;; time.
>>> +        ;; (scm->go (cute scm->go <> shepherd))
>>> +        )
>>> +    (define config
>>> +      #~(begin
>>> +          (use-modules (srfi srfi-34)
>>> +                       (system repl error-handling))
>>> +          (apply
>>> +           register-services
>>> +           (map
>>> +            (lambda (file) (load file))
>>> +            '#$files))
>>> +          (action 'root 'daemonize)
>>> +          (format #t "Starting services...~%")
>>
>> Maybe (G_ ...) should be used to make strings translatable?
>>
>>
>>> +          (for-each
>>> +           (lambda (service) (start service))
>>> +           '#$(append-map shepherd-service-provision
>>> +                          (filter shepherd-service-auto-start?
>>> +                                  services)))
>>> +          (newline)))
>>
>> Is ‘newline’ necessary?
>>
>
> Not necessary, but nice to have for better separation of different
> processes launched during activation.  It could newline at the beginning
> of each activation subscript, but it is what it is)
>
>>
>>> +    (scheme-file "shepherd.conf" config)))
>>> +
>>> +(define (launch-shepherd-gexp config)
>>> +  (let* ((shepherd (home-shepherd-configuration-shepherd config))
>>> +         (services (home-shepherd-configuration-services config)))
>>> +    (if (home-shepherd-configuration-auto-start? config)
>>> +        (with-imported-modules '((guix build utils))
>>> +          #~(let ((log-dir (or (getenv "XDG_LOG_HOME")
>>> +                               (format #f "~a/.local/var/log" (getenv "HOME")))))
>>> +              ((@ (guix build utils) mkdir-p) log-dir)
>>> +              (system*
>>> +               #$(file-append shepherd "/bin/shepherd")
>>> +               "--logfile"
>>> +               (string-append
>>> +                log-dir
>>> +                "/shepherd.log")
>>> +               "--config"
>>> +               #$(home-shepherd-configuration-file services shepherd))))
>>> +        #~"")))
>>> +
>>> +(define (reload-configuration-gexp config)
>>> +  (let* ((shepherd (home-shepherd-configuration-shepherd config))
>>> +         (services (home-shepherd-configuration-services config)))
>>> +    #~(system*
>>> +       #$(file-append shepherd "/bin/herd")
>>> +       "load" "root"
>>> +       #$(home-shepherd-configuration-file services shepherd))))
>>> +
>>> +(define (ensure-shepherd-gexp config)
>>> +  #~(if (file-exists?
>>> +         (string-append
>>> +          (or (getenv "XDG_RUNTIME_DIR")
>>> +              (format #f "/run/user/~a" (getuid)))
>>> +          "/shepherd/socket"))
>>> +        #$(reload-configuration-gexp config)
>>> +        #$(launch-shepherd-gexp config)))
>>> +
>>> +(define-public home-shepherd-service-type
>>> +  (service-type (name 'home-shepherd)
>>> +                (extensions
>>> +                 (list (service-extension
>>> +                        home-run-on-first-login-service-type
>>> +                        launch-shepherd-gexp)
>>> +                       (service-extension
>>> +                        home-activation-service-type
>>> +                        ensure-shepherd-gexp)
>>> +                       (service-extension
>>> +                        home-profile-service-type
>>> +                        (lambda (config)
>>> +                          `(,(home-shepherd-configuration-shepherd config))))))
>>
>> Nit: I would use ‘list’ instead of quasiquoting and unquoting.
>>
>
> It's probably done this way to keep the line under 80 characters long,
> but I agree, using list would be a little more cleaner.

Using ‘match-lambda’ would keep line line length shorter  :-)

  (match-lambda
   (($ <home-shepherd-configuration> shepherd)
    (list shepherd)))
[signature.asc (application/pgp-signature, inline)]

Information forwarded to guix-patches <at> gnu.org:
bug#50332; Package guix-patches. (Sat, 04 Sep 2021 08:55:02 GMT) Full text and rfc822 format available.

Message #22 received at 50332 <at> debbugs.gnu.org (full text, mbox):

From: Maxime Devos <maximedevos <at> telenet.be>
To: Xinglu Chen <public <at> yoctocell.xyz>, Andrew Tropin <andrew <at> trop.in>, 
 50332 <at> debbugs.gnu.org
Subject: Re: [bug#50332] [PATCH] home-services: Add Shepherd.
Date: Sat, 04 Sep 2021 10:53:53 +0200
[Message part 1 (text/plain, inline)]
Xinglu Chen schreef op do 02-09-2021 om 16:59 [+0200]:
> On Thu, Sep 02 2021, Andrew Tropin wrote:
> [...]
> > +    (define config
> > +      #~(begin
> > +          (use-modules (srfi srfi-34)
> > +                       (system repl error-handling))
> > +          (apply
> > +           register-services
> > +           (map
> > +            (lambda (file) (load file))
> > +            '#$files))
> > +          (action 'root 'daemonize)
> > +          (format #t "Starting services...~%")
> 
> Maybe (G_ ...) should be used to make strings translatable?

AFAIK (G_ ...) cannot be used from within a G-exp.
However, you could do:

     #~(begin
          ...
          (format #t #$(G_ "Starting services...~%")))

but that would make "shepherd.conf" depend on the locale
that was active when "guix home ..." (*) was run,
which may or may not be acceptable.

(*) not sure what the exact command is.

Alternatively, it might be possible to build the .mo from the .po
translations and use bindtextdomain from the G-exp, in which case
the G_ should be usable from the G-exp.

Greetings,
Maxime.
[signature.asc (application/pgp-signature, inline)]

Information forwarded to guix-patches <at> gnu.org:
bug#50332; Package guix-patches. (Mon, 06 Sep 2021 08:58:01 GMT) Full text and rfc822 format available.

Message #25 received at 50332-done <at> debbugs.gnu.org (full text, mbox):

From: Andrew Tropin <andrew <at> trop.in>
To: Oleg Pykhalov <go.wigust <at> gmail.com>
Cc: Xinglu Chen <public <at> yoctocell.xyz>, 50332-done <at> debbugs.gnu.org
Subject: Re: bug#50332: [PATCH] home-services: Add Shepherd.
Date: Mon, 06 Sep 2021 11:57:33 +0300
[Message part 1 (text/plain, inline)]
On 2021-09-03 14:03, Oleg Pykhalov wrote:

> Andrew Tropin <andrew <at> trop.in> writes:
>
>>>> * gnu/home-services/shepherd.scm: New file.
>>>> * doc/guix.texi: Add documentation about Shepherd Home Service.
>>>> ---
>>>>  doc/guix.texi                  |  31 +++++++-
>>>>  gnu/home-services/shepherd.scm | 133 +++++++++++++++++++++++++++++++++
>
> Added to gnu/local.mk.
>
> Pushed to wip-guix-home.

Thank you!

After Maxime's message, I decided to remove G_ from G-expression, which
get serialized to shepherd.conf, please, add this patch to wip-guix-home
too:

[0001-home-services-shepherd-Remove-G_-from-shepherd.conf-.patch (text/x-patch, inline)]
From 066d31f7a1cc69c84d2009cd67dfda8eca693b4c Mon Sep 17 00:00:00 2001
From: Andrew Tropin <andrew <at> trop.in>
Date: Mon, 6 Sep 2021 11:50:57 +0300
Subject: [PATCH] home-services: shepherd: Remove G_ from shepherd.conf's G-exp

* gnu/home-services/shepherd.scm: Remove G_ from shepherd.conf.
---
 gnu/home-services/shepherd.scm | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/gnu/home-services/shepherd.scm b/gnu/home-services/shepherd.scm
index 04366f4b81..b9fd3c367b 100644
--- a/gnu/home-services/shepherd.scm
+++ b/gnu/home-services/shepherd.scm
@@ -23,7 +23,6 @@
   #:use-module (gnu services shepherd)
   #:use-module (guix sets)
   #:use-module (guix gexp)
-  #:use-module (guix i18n)
   #:use-module (guix records)
 
   #:use-module (srfi srfi-1)
@@ -61,7 +60,7 @@ as shepherd package."
             (lambda (file) (load file))
             '#$files))
           (action 'root 'daemonize)
-          (format #t (G_ "Starting services...~%"))
+          (format #t "Starting services...~%")
           (for-each
            (lambda (service) (start service))
            '#$(append-map shepherd-service-provision
-- 
2.33.0

[signature.asc (application/pgp-signature, inline)]

Information forwarded to guix-patches <at> gnu.org:
bug#50332; Package guix-patches. (Mon, 06 Sep 2021 09:04:02 GMT) Full text and rfc822 format available.

Message #28 received at 50332 <at> debbugs.gnu.org (full text, mbox):

From: Andrew Tropin <andrew <at> trop.in>
To: Xinglu Chen <public <at> yoctocell.xyz>, 50332 <at> debbugs.gnu.org
Subject: Re: [bug#50332] [PATCH v2] home-services: Add Shepherd.
Date: Mon, 06 Sep 2021 12:03:23 +0300
[Message part 1 (text/plain, inline)]
On 2021-09-03 16:31, Xinglu Chen wrote:

> On Fri, Sep 03 2021, Andrew Tropin wrote:
>
>> On 2021-09-02 16:59, Xinglu Chen wrote:
>>
>>> On Thu, Sep 02 2021, Andrew Tropin wrote:
>>>
>>>> * gnu/home-services/shepherd.scm: New file.
>>>> * doc/guix.texi: Add documentation about Shepherd Home Service.
>>>> ---
>>>>  doc/guix.texi                  |  31 +++++++-
>>>>  gnu/home-services/shepherd.scm | 133 +++++++++++++++++++++++++++++++++
>>>>  2 files changed, 163 insertions(+), 1 deletion(-)
>>>>  create mode 100644 gnu/home-services/shepherd.scm
>>>>
>>>> diff --git a/doc/guix.texi b/doc/guix.texi
>>>> index 622a973bdf..51a317e8a7 100644
>>>> --- a/doc/guix.texi
>>>> +++ b/doc/guix.texi
>>>> @@ -35538,7 +35538,36 @@ mcron info here
>>>>  
>>>>  @node Shepherd Home Service
>>>>  @subsection Managing User's Daemons
>>>> -shepherd info here
>>>> +
>>>> +@cindex shepherd services
>>>> +
>>>> +@defvr {Scheme Variable} shepherd-home-service-type
>>>> +The service type for the userland Shepherd, which allows to manage
>>>
>>> “allows one to manage”
>>>
>>>> +long-running process or one-shot tasks.  Almost all the information
>>>
>>> s/process/processes/
>>>
>>>> +described in (@pxref{Shepherd Services}) is applicable here too.
>>>
>>> What is not applicable?
>>>
>>
>> Clarified.
>>
>>>
>>>> +This is the service type that extensions target when they want to create
>>>> +shepherd services (@pxref{Service Types and Services}, for an example).
>>>> +Each extension must pass a list of @code{<shepherd-service>}.  Its
>>>> +value must be a @code{shepherd-configuration}, as described below.
>>>> +@end defvr
>>>> +
>>>> +@deftp {Data Type} shepherd-configuration
>>>> +This data type represents the Shepherd's configuration.
>>>> +
>>>> +@table @code
>>>> +@item shepherd (default: @code{shepherd})
>>>> +The Shepherd package to use.
>>>> +
>>>> +@item auto-start? (default: @code{#t})
>>>> +Wether or not to start Shepherd on first login.
>>>
>>> s/Wether/Whether/
>>>
>>>> +@item services (default: @code{'()})
>>>> +A list of @code{<shepherd-service>} to start.
>>>> +You should probably use the service extension
>>>> +mechanism instead (@pxref{Shepherd Services}).
>>>> +@end table
>>>> +@end deftp
>>>>  
>>>>  @node Invoking guix home
>>>>  @section Invoking @code{guix home}
>>>> diff --git a/gnu/home-services/shepherd.scm b/gnu/home-services/shepherd.scm
>>>> new file mode 100644
>>>> index 0000000000..158b50bdb6
>>>> --- /dev/null
>>>> +++ b/gnu/home-services/shepherd.scm
>>>> @@ -0,0 +1,133 @@
>>>> +;;; GNU Guix --- Functional package management for GNU
>>>> +;;; Copyright © 2021 Andrew Tropin <andrew <at> trop.in>
>>>> +;;; Copyright © 2021 Xinglu Chen <public <at> yoctocell.xyz>
>>>> +;;;
>>>> +;;; This file is part of GNU Guix.
>>>> +;;;
>>>> +;;; GNU Guix is free software; you can redistribute it and/or modify it
>>>> +;;; under the terms of the GNU General Public License as published by
>>>> +;;; the Free Software Foundation; either version 3 of the License, or (at
>>>> +;;; your option) any later version.
>>>> +;;;
>>>> +;;; GNU Guix is distributed in the hope that it will be useful, but
>>>> +;;; WITHOUT ANY WARRANTY; without even the implied warranty of
>>>> +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>>>> +;;; GNU General Public License for more details.
>>>> +;;;
>>>> +;;; You should have received a copy of the GNU General Public License
>>>> +;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
>>>> +
>>>> +(define-module (gnu home-services shepherd)
>>>> +  #:use-module (gnu home-services)
>>>> +  #:use-module (gnu packages admin)
>>>> +  #:use-module (gnu services shepherd)
>>>> +  #:use-module (guix sets)
>>>> +  #:use-module (guix gexp)
>>>> +  #:use-module (guix i18n)
>>>> +  #:use-module (guix records)
>>>> +
>>>> +  #:use-module (srfi srfi-1)
>>>> +
>>>> +  #:re-export (shepherd-service
>>>> +               shepherd-action))
>>>> +
>>>> +(define-record-type* <home-shepherd-configuration>
>>>> +  home-shepherd-configuration make-home-shepherd-configuration
>>>> +  home-shepherd-configuration?
>>>> +  (shepherd home-shepherd-configuration-shepherd
>>>> +            (default shepherd)) ; package
>>>> +  (auto-start? home-shepherd-configuration-auto-start?
>>>> +               (default #t))
>>>> +  (services home-shepherd-configuration-services
>>>> +            (default '())))
>>>> +
>>>> +(define (home-shepherd-configuration-file services shepherd)
>>>> +  "Return the shepherd configuration file for SERVICES.  SHEPHERD is used
>>>> +as shepherd package."
>>>> +  (assert-valid-graph services)
>>>> +
>>>> +  (let ((files (map shepherd-service-file services))
>>>> +        ;; TODO: Add compilation of services, it can improve start
>>>> +        ;; time.
>>>> +        ;; (scm->go (cute scm->go <> shepherd))
>>>> +        )
>>>> +    (define config
>>>> +      #~(begin
>>>> +          (use-modules (srfi srfi-34)
>>>> +                       (system repl error-handling))
>>>> +          (apply
>>>> +           register-services
>>>> +           (map
>>>> +            (lambda (file) (load file))
>>>> +            '#$files))
>>>> +          (action 'root 'daemonize)
>>>> +          (format #t "Starting services...~%")
>>>
>>> Maybe (G_ ...) should be used to make strings translatable?
>>>
>>>
>>>> +          (for-each
>>>> +           (lambda (service) (start service))
>>>> +           '#$(append-map shepherd-service-provision
>>>> +                          (filter shepherd-service-auto-start?
>>>> +                                  services)))
>>>> +          (newline)))
>>>
>>> Is ‘newline’ necessary?
>>>
>>
>> Not necessary, but nice to have for better separation of different
>> processes launched during activation.  It could newline at the beginning
>> of each activation subscript, but it is what it is)
>>
>>>
>>>> +    (scheme-file "shepherd.conf" config)))
>>>> +
>>>> +(define (launch-shepherd-gexp config)
>>>> +  (let* ((shepherd (home-shepherd-configuration-shepherd config))
>>>> +         (services (home-shepherd-configuration-services config)))
>>>> +    (if (home-shepherd-configuration-auto-start? config)
>>>> +        (with-imported-modules '((guix build utils))
>>>> +          #~(let ((log-dir (or (getenv "XDG_LOG_HOME")
>>>> +                               (format #f "~a/.local/var/log" (getenv "HOME")))))
>>>> +              ((@ (guix build utils) mkdir-p) log-dir)
>>>> +              (system*
>>>> +               #$(file-append shepherd "/bin/shepherd")
>>>> +               "--logfile"
>>>> +               (string-append
>>>> +                log-dir
>>>> +                "/shepherd.log")
>>>> +               "--config"
>>>> +               #$(home-shepherd-configuration-file services shepherd))))
>>>> +        #~"")))
>>>> +
>>>> +(define (reload-configuration-gexp config)
>>>> +  (let* ((shepherd (home-shepherd-configuration-shepherd config))
>>>> +         (services (home-shepherd-configuration-services config)))
>>>> +    #~(system*
>>>> +       #$(file-append shepherd "/bin/herd")
>>>> +       "load" "root"
>>>> +       #$(home-shepherd-configuration-file services shepherd))))
>>>> +
>>>> +(define (ensure-shepherd-gexp config)
>>>> +  #~(if (file-exists?
>>>> +         (string-append
>>>> +          (or (getenv "XDG_RUNTIME_DIR")
>>>> +              (format #f "/run/user/~a" (getuid)))
>>>> +          "/shepherd/socket"))
>>>> +        #$(reload-configuration-gexp config)
>>>> +        #$(launch-shepherd-gexp config)))
>>>> +
>>>> +(define-public home-shepherd-service-type
>>>> +  (service-type (name 'home-shepherd)
>>>> +                (extensions
>>>> +                 (list (service-extension
>>>> +                        home-run-on-first-login-service-type
>>>> +                        launch-shepherd-gexp)
>>>> +                       (service-extension
>>>> +                        home-activation-service-type
>>>> +                        ensure-shepherd-gexp)
>>>> +                       (service-extension
>>>> +                        home-profile-service-type
>>>> +                        (lambda (config)
>>>> +                          `(,(home-shepherd-configuration-shepherd config))))))
>>>
>>> Nit: I would use ‘list’ instead of quasiquoting and unquoting.
>>>
>>
>> It's probably done this way to keep the line under 80 characters long,
>> but I agree, using list would be a little more cleaner.
>
> Using ‘match-lambda’ would keep line line length shorter  :-)
>
>   (match-lambda
>    (($ <home-shepherd-configuration> shepherd)
>     (list shepherd)))

Good idea, maybe will use it next time)
[signature.asc (application/pgp-signature, inline)]

Information forwarded to guix-patches <at> gnu.org:
bug#50332; Package guix-patches. (Mon, 06 Sep 2021 11:23:02 GMT) Full text and rfc822 format available.

Message #31 received at 50332-done <at> debbugs.gnu.org (full text, mbox):

From: Oleg Pykhalov <go.wigust <at> gmail.com>
To: Andrew Tropin <andrew <at> trop.in>
Cc: Xinglu Chen <public <at> yoctocell.xyz>, 50332-done <at> debbugs.gnu.org
Subject: Re: bug#50332: [PATCH] home-services: Add Shepherd.
Date: Mon, 06 Sep 2021 14:22:40 +0300
[Message part 1 (text/plain, inline)]
Andrew Tropin <andrew <at> trop.in> writes:

[…]

> After Maxime's message, I decided to remove G_ from G-expression, which
> get serialized to shepherd.conf, please, add this patch to wip-guix-home
> too:
>
> From 066d31f7a1cc69c84d2009cd67dfda8eca693b4c Mon Sep 17 00:00:00 2001
> From: Andrew Tropin <andrew <at> trop.in>
> Date: Mon, 6 Sep 2021 11:50:57 +0300
> Subject: [PATCH] home-services: shepherd: Remove G_ from shepherd.conf's G-exp
>
> * gnu/home-services/shepherd.scm: Remove G_ from shepherd.conf.
> ---
>  gnu/home-services/shepherd.scm | 3 +--
>  1 file changed, 1 insertion(+), 2 deletions(-)

OK, Pushed.
[signature.asc (application/pgp-signature, inline)]

bug archived. Request was from Debbugs Internal Request <help-debbugs <at> gnu.org> to internal_control <at> debbugs.gnu.org. (Mon, 04 Oct 2021 11:24:08 GMT) Full text and rfc822 format available.

This bug report was last modified 2 years and 202 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.