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 | 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 a new issue