me
/
guix
Archived
1
0
Fork 0

services: shepherd: Support “free-form” services.

* gnu/services/shepherd.scm (<shepherd-service>)[free-form]: New field.
[start]: Add default value.
(shepherd-service-file): Rename to…
(shepherd-service-file/regular): … this.
(shepherd-service-file/free-form): New procedure.
(shepherd-service-file): Dispatch to one of the two procedures above.
* doc/guix.texi (Shepherd Services): Document the ‘free-form’ field.

Reviewed-by: Maxim Cournoyer <maxim.cournoyer@gmail.com>

Change-Id: I206374e950ef6d1e4a996c0f507fb5fcd9cadde3
master
Ludovic Courtès 2024-06-22 15:31:16 +02:00
parent 0fdac5f036
commit 0a220c1599
No known key found for this signature in database
GPG Key ID: 090B11993D9AEBB5
2 changed files with 47 additions and 4 deletions

View File

@ -44088,7 +44088,7 @@ Services,,, shepherd, The GNU Shepherd Manual}, for details.
When true, this is the delay in seconds before restarting a failed When true, this is the delay in seconds before restarting a failed
service. service.
@item @code{start} @item @code{start} (default: @code{#~(const #t)})
@itemx @code{stop} (default: @code{#~(const #f)}) @itemx @code{stop} (default: @code{#~(const #f)})
The @code{start} and @code{stop} fields refer to the Shepherd's The @code{start} and @code{stop} fields refer to the Shepherd's
facilities to start and stop processes (@pxref{Service De- and facilities to start and stop processes (@pxref{Service De- and
@ -44107,6 +44107,30 @@ This is a list of @code{shepherd-action} objects (see below) defining
herd @var{action} @var{service} [@var{arguments}@dots{}] herd @var{action} @var{service} [@var{arguments}@dots{}]
@end example @end example
@item @code{free-form} (default: @code{#f})
When set, this field replaces the @code{start}, @code{stop}, and
@code{actions} fields. It is meant to be used when the service
definition comes from some other source, typically the service
collection provided by the Shepherd proper (@pxref{Service Collection,,,
shepherd, The GNU Shepherd Manual}).
@cindex REPL service, for shepherd
For example, the snippet below defines a service for the Shepherd's
built-in @acronym{REPL, read-eval-print loop} service (@pxref{REPL
Service,,, shepherd, The GNU Shepherd Manual}):
@lisp
(shepherd-service
(provision '(repl))
(modules '((shepherd service repl)))
(free-form #~(repl-service)))
@end lisp
In this case, the service object is returned by the @code{repl-service}
procedure of the Shepherd, so all the @code{free-form} G-expression does
is call that procedure. Note that the @code{provision} field must be
consistent with the actual service provision.
@item @code{auto-start?} (default: @code{#t}) @item @code{auto-start?} (default: @code{#t})
Whether this service should be started automatically by the Shepherd. If it Whether this service should be started automatically by the Shepherd. If it
is @code{#f} the service has to be started manually with @code{herd start}. is @code{#f} the service has to be started manually with @code{herd start}.

View File

@ -60,6 +60,7 @@
shepherd-service-respawn? shepherd-service-respawn?
shepherd-service-start shepherd-service-start
shepherd-service-stop shepherd-service-stop
shepherd-service-free-form
shepherd-service-auto-start? shepherd-service-auto-start?
shepherd-service-modules shepherd-service-modules
@ -217,7 +218,10 @@ DEFAULT is given, use it as the service's default value."
(default #f)) (default #f))
(respawn-delay shepherd-service-respawn-delay (respawn-delay shepherd-service-respawn-delay
(default #f)) (default #f))
(start shepherd-service-start) ;g-expression (procedure) (free-form shepherd-service-free-form ;#f | g-expression (service)
(default #f))
(start shepherd-service-start ;g-expression (procedure)
(default #~(const #t)))
(stop shepherd-service-stop ;g-expression (procedure) (stop shepherd-service-stop ;g-expression (procedure)
(default #~(const #f))) (default #~(const #f)))
(actions shepherd-service-actions ;list of <shepherd-action> (actions shepherd-service-actions ;list of <shepherd-action>
@ -298,8 +302,8 @@ stored."
provisions) provisions)
".scm"))) ".scm")))
(define (shepherd-service-file service) (define (shepherd-service-file/regular service)
"Return a file defining SERVICE." "Return a file defining SERVICE, a service whose 'free-form' field is #f."
(scheme-file (shepherd-service-file-name service) (scheme-file (shepherd-service-file-name service)
(with-imported-modules %default-imported-modules (with-imported-modules %default-imported-modules
#~(begin #~(begin
@ -332,6 +336,21 @@ stored."
#~(#$name #$doc #$proc))) #~(#$name #$doc #$proc)))
(shepherd-service-actions service)))))))) (shepherd-service-actions service))))))))
(define (shepherd-service-file/free-form service)
"Return a file defining SERVICE, a service whose 'free-form' field is set."
(scheme-file (shepherd-service-file-name service)
(with-imported-modules %default-imported-modules
#~(begin
(use-modules #$@(shepherd-service-modules service))
#$(shepherd-service-free-form service)))))
(define (shepherd-service-file service)
"Return a file defining SERVICE."
(if (shepherd-service-free-form service)
(shepherd-service-file/free-form service)
(shepherd-service-file/regular service)))
(define (scm->go file shepherd) (define (scm->go file shepherd)
"Compile FILE, which contains code to be loaded by shepherd's config file, "Compile FILE, which contains code to be loaded by shepherd's config file,
and return the resulting '.go' file. SHEPHERD is used as shepherd package." and return the resulting '.go' file. SHEPHERD is used as shepherd package."