unofficial mirror of guix-patches@gnu.org 
 help / color / mirror / code / Atom feed
* [bug#50332] [PATCH] home-services: Add Shepherd.
@ 2021-09-02  9:33 Andrew Tropin
  2021-09-02 14:59 ` Xinglu Chen
  0 siblings, 1 reply; 9+ messages in thread
From: Andrew Tropin @ 2021-09-02  9:33 UTC (permalink / raw)
  To: 50332

[-- Attachment #1: Type: text/plain, Size: 7378 bytes --]

* 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@trop.in>
+;;; Copyright © 2021 Xinglu Chen <public@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


[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 832 bytes --]

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [bug#50332] [PATCH] home-services: Add Shepherd.
  2021-09-02  9:33 [bug#50332] [PATCH] home-services: Add Shepherd Andrew Tropin
@ 2021-09-02 14:59 ` Xinglu Chen
  2021-09-03  7:44   ` [bug#50332] [PATCH v2] " Andrew Tropin
  2021-09-04  8:53   ` [bug#50332] [PATCH] " Maxime Devos
  0 siblings, 2 replies; 9+ messages in thread
From: Xinglu Chen @ 2021-09-02 14:59 UTC (permalink / raw)
  To: Andrew Tropin, 50332

[-- Attachment #1: Type: text/plain, Size: 8067 bytes --]

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@trop.in>
> +;;; Copyright © 2021 Xinglu Chen <public@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

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 861 bytes --]

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [bug#50332] [PATCH v2] home-services: Add Shepherd.
  2021-09-02 14:59 ` Xinglu Chen
@ 2021-09-03  7:44   ` Andrew Tropin
  2021-09-03 11:03     ` bug#50332: [PATCH] " Oleg Pykhalov
  2021-09-03 14:31     ` [bug#50332] [PATCH v2] " Xinglu Chen
  2021-09-04  8:53   ` [bug#50332] [PATCH] " Maxime Devos
  1 sibling, 2 replies; 9+ messages in thread
From: Andrew Tropin @ 2021-09-03  7:44 UTC (permalink / raw)
  To: Xinglu Chen, 50332


[-- Attachment #1.1: Type: text/plain, Size: 8733 bytes --]

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@trop.in>
>> +;;; Copyright © 2021 Xinglu Chen <public@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.


[-- Attachment #1.2: v2-0001-home-services-Add-Shepherd.patch --]
[-- Type: text/x-patch, Size: 7646 bytes --]

From c12b51bdbc86fa995c88f331b5d04b0b963087cf Mon Sep 17 00:00:00 2001
From: Andrew Tropin <andrew@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@trop.in>
+;;; Copyright © 2021 Xinglu Chen <public@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


[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 832 bytes --]

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* bug#50332: [PATCH] home-services: Add Shepherd.
  2021-09-03  7:44   ` [bug#50332] [PATCH v2] " Andrew Tropin
@ 2021-09-03 11:03     ` Oleg Pykhalov
  2021-09-06  8:57       ` [bug#50332] " Andrew Tropin
  2021-09-03 14:31     ` [bug#50332] [PATCH v2] " Xinglu Chen
  1 sibling, 1 reply; 9+ messages in thread
From: Oleg Pykhalov @ 2021-09-03 11:03 UTC (permalink / raw)
  To: Andrew Tropin; +Cc: Xinglu Chen, 50332-done

[-- Attachment #1: Type: text/plain, Size: 341 bytes --]

Andrew Tropin <andrew@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.

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 861 bytes --]

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [bug#50332] [PATCH v2] home-services: Add Shepherd.
  2021-09-03  7:44   ` [bug#50332] [PATCH v2] " Andrew Tropin
  2021-09-03 11:03     ` bug#50332: [PATCH] " Oleg Pykhalov
@ 2021-09-03 14:31     ` Xinglu Chen
  2021-09-06  9:03       ` Andrew Tropin
  1 sibling, 1 reply; 9+ messages in thread
From: Xinglu Chen @ 2021-09-03 14:31 UTC (permalink / raw)
  To: Andrew Tropin, 50332

[-- Attachment #1: Type: text/plain, Size: 8540 bytes --]

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@trop.in>
>>> +;;; Copyright © 2021 Xinglu Chen <public@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)))

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 861 bytes --]

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [bug#50332] [PATCH] home-services: Add Shepherd.
  2021-09-02 14:59 ` Xinglu Chen
  2021-09-03  7:44   ` [bug#50332] [PATCH v2] " Andrew Tropin
@ 2021-09-04  8:53   ` Maxime Devos
  1 sibling, 0 replies; 9+ messages in thread
From: Maxime Devos @ 2021-09-04  8:53 UTC (permalink / raw)
  To: Xinglu Chen, Andrew Tropin, 50332

[-- Attachment #1: Type: text/plain, Size: 1133 bytes --]

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.

[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 260 bytes --]

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [bug#50332] [PATCH] home-services: Add Shepherd.
  2021-09-03 11:03     ` bug#50332: [PATCH] " Oleg Pykhalov
@ 2021-09-06  8:57       ` Andrew Tropin
  2021-09-06 11:22         ` Oleg Pykhalov
  0 siblings, 1 reply; 9+ messages in thread
From: Andrew Tropin @ 2021-09-06  8:57 UTC (permalink / raw)
  To: Oleg Pykhalov; +Cc: Xinglu Chen, 50332-done


[-- Attachment #1.1: Type: text/plain, Size: 562 bytes --]

On 2021-09-03 14:03, Oleg Pykhalov wrote:

> Andrew Tropin <andrew@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:


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1.2: 0001-home-services-shepherd-Remove-G_-from-shepherd.conf-.patch --]
[-- Type: text/x-patch, Size: 1185 bytes --]

From 066d31f7a1cc69c84d2009cd67dfda8eca693b4c Mon Sep 17 00:00:00 2001
From: Andrew Tropin <andrew@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


[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 832 bytes --]

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [bug#50332] [PATCH v2] home-services: Add Shepherd.
  2021-09-03 14:31     ` [bug#50332] [PATCH v2] " Xinglu Chen
@ 2021-09-06  9:03       ` Andrew Tropin
  0 siblings, 0 replies; 9+ messages in thread
From: Andrew Tropin @ 2021-09-06  9:03 UTC (permalink / raw)
  To: Xinglu Chen, 50332

[-- Attachment #1: Type: text/plain, Size: 8852 bytes --]

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@trop.in>
>>>> +;;; Copyright © 2021 Xinglu Chen <public@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)

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 832 bytes --]

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [bug#50332] [PATCH] home-services: Add Shepherd.
  2021-09-06  8:57       ` [bug#50332] " Andrew Tropin
@ 2021-09-06 11:22         ` Oleg Pykhalov
  0 siblings, 0 replies; 9+ messages in thread
From: Oleg Pykhalov @ 2021-09-06 11:22 UTC (permalink / raw)
  To: Andrew Tropin; +Cc: Xinglu Chen, 50332-done

[-- Attachment #1: Type: text/plain, Size: 635 bytes --]

Andrew Tropin <andrew@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@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.

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 861 bytes --]

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2021-09-06 11:23 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-09-02  9:33 [bug#50332] [PATCH] home-services: Add Shepherd Andrew Tropin
2021-09-02 14:59 ` Xinglu Chen
2021-09-03  7:44   ` [bug#50332] [PATCH v2] " Andrew Tropin
2021-09-03 11:03     ` bug#50332: [PATCH] " Oleg Pykhalov
2021-09-06  8:57       ` [bug#50332] " Andrew Tropin
2021-09-06 11:22         ` Oleg Pykhalov
2021-09-03 14:31     ` [bug#50332] [PATCH v2] " Xinglu Chen
2021-09-06  9:03       ` Andrew Tropin
2021-09-04  8:53   ` [bug#50332] [PATCH] " Maxime Devos

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/guix.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).