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: I206374e950ef6d1e4a996c0f507fb5fcd9cadde3master
parent
0fdac5f036
commit
0a220c1599
|
@ -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}.
|
||||||
|
|
|
@ -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."
|
||||||
|
|
Reference in New Issue