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
This commit is contained in:
		
							parent
							
								
									0fdac5f036
								
							
						
					
					
						commit
						0a220c1599
					
				
					 2 changed files with 47 additions and 4 deletions
				
			
		|  | @ -44088,7 +44088,7 @@ Services,,, shepherd, The GNU Shepherd Manual}, for details. | |||
| When true, this is the delay in seconds before restarting a failed | ||||
| service. | ||||
| 
 | ||||
| @item @code{start} | ||||
| @item @code{start} (default: @code{#~(const #t)}) | ||||
| @itemx @code{stop} (default: @code{#~(const #f)}) | ||||
| The @code{start} and @code{stop} fields refer to the Shepherd's | ||||
| 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{}] | ||||
| @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}) | ||||
| 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}. | ||||
|  |  | |||
|  | @ -60,6 +60,7 @@ | |||
|             shepherd-service-respawn? | ||||
|             shepherd-service-start | ||||
|             shepherd-service-stop | ||||
|             shepherd-service-free-form | ||||
|             shepherd-service-auto-start? | ||||
|             shepherd-service-modules | ||||
| 
 | ||||
|  | @ -217,7 +218,10 @@ DEFAULT is given, use it as the service's default value." | |||
|                  (default #f)) | ||||
|   (respawn-delay shepherd-service-respawn-delay | ||||
|                  (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) | ||||
|                  (default #~(const #f))) | ||||
|   (actions       shepherd-service-actions              ;list of <shepherd-action> | ||||
|  | @ -298,8 +302,8 @@ stored." | |||
|                                provisions) | ||||
|                    ".scm"))) | ||||
| 
 | ||||
| (define (shepherd-service-file service) | ||||
|   "Return a file defining SERVICE." | ||||
| (define (shepherd-service-file/regular service) | ||||
|   "Return a file defining SERVICE, a service whose 'free-form' field is #f." | ||||
|   (scheme-file (shepherd-service-file-name service) | ||||
|                (with-imported-modules %default-imported-modules | ||||
|                  #~(begin | ||||
|  | @ -332,6 +336,21 @@ stored." | |||
|                                    #~(#$name #$doc #$proc))) | ||||
|                                 (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) | ||||
|   "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." | ||||
|  |  | |||
		Reference in a new issue