mirror of
https://git.in.rschanz.org/ryan77627/guix.git
synced 2024-12-24 21:38:07 -05:00
services: herd: Report whether a service is transient.
* gnu/services/herd.scm (<live-service>)[transient?]: New field. (current-services): Check the value of 'transient?'. Call 'resolve-transients'. (resolve-transients): New procedure.
This commit is contained in:
parent
975966ba09
commit
a2c759c830
1 changed files with 42 additions and 6 deletions
|
@ -1,5 +1,5 @@
|
||||||
;;; GNU Guix --- Functional package management for GNU
|
;;; GNU Guix --- Functional package management for GNU
|
||||||
;;; Copyright © 2016, 2017, 2018, 2019 Ludovic Courtès <ludo@gnu.org>
|
;;; Copyright © 2016-2019, 2022 Ludovic Courtès <ludo@gnu.org>
|
||||||
;;; Copyright © 2017, 2020 Mathieu Othacehe <m.othacehe@gmail.com>
|
;;; Copyright © 2017, 2020 Mathieu Othacehe <m.othacehe@gmail.com>
|
||||||
;;;
|
;;;
|
||||||
;;; This file is part of GNU Guix.
|
;;; This file is part of GNU Guix.
|
||||||
|
@ -20,6 +20,7 @@
|
||||||
(define-module (gnu services herd)
|
(define-module (gnu services herd)
|
||||||
#:use-module (srfi srfi-1)
|
#:use-module (srfi srfi-1)
|
||||||
#:use-module (srfi srfi-9)
|
#:use-module (srfi srfi-9)
|
||||||
|
#:use-module (srfi srfi-9 gnu)
|
||||||
#:use-module (srfi srfi-11)
|
#:use-module (srfi srfi-11)
|
||||||
#:use-module (srfi srfi-34)
|
#:use-module (srfi srfi-34)
|
||||||
#:use-module (srfi srfi-35)
|
#:use-module (srfi srfi-35)
|
||||||
|
@ -46,6 +47,7 @@ (define-module (gnu services herd)
|
||||||
live-service-provision
|
live-service-provision
|
||||||
live-service-requirement
|
live-service-requirement
|
||||||
live-service-running
|
live-service-running
|
||||||
|
live-service-transient?
|
||||||
live-service-canonical-name
|
live-service-canonical-name
|
||||||
|
|
||||||
with-shepherd-action
|
with-shepherd-action
|
||||||
|
@ -194,10 +196,11 @@ (define-syntax alist-let*
|
||||||
|
|
||||||
;; Information about live Shepherd services.
|
;; Information about live Shepherd services.
|
||||||
(define-record-type <live-service>
|
(define-record-type <live-service>
|
||||||
(live-service provision requirement running)
|
(live-service provision requirement transient? running)
|
||||||
live-service?
|
live-service?
|
||||||
(provision live-service-provision) ;list of symbols
|
(provision live-service-provision) ;list of symbols
|
||||||
(requirement live-service-requirement) ;list of symbols
|
(requirement live-service-requirement) ;list of symbols
|
||||||
|
(transient? live-service-transient?) ;Boolean
|
||||||
(running live-service-running)) ;#f | object
|
(running live-service-running)) ;#f | object
|
||||||
|
|
||||||
(define (live-service-canonical-name service)
|
(define (live-service-canonical-name service)
|
||||||
|
@ -215,13 +218,46 @@ (define (current-services)
|
||||||
((services _ ...)
|
((services _ ...)
|
||||||
(match services
|
(match services
|
||||||
((('service ('version 0 _ ...) _ ...) ...)
|
((('service ('version 0 _ ...) _ ...) ...)
|
||||||
(map (lambda (service)
|
(resolve-transients
|
||||||
(alist-let* service (provides requires running)
|
(map (lambda (service)
|
||||||
(live-service provides requires running)))
|
(alist-let* service (provides requires running transient?)
|
||||||
services))
|
;; The Shepherd 0.9.0 would not provide 'transient?' in its
|
||||||
|
;; status sexp. Thus, when it's missing, query it via an
|
||||||
|
;; "eval" request.
|
||||||
|
(live-service provides requires
|
||||||
|
(if (sloppy-assq 'transient? service)
|
||||||
|
transient?
|
||||||
|
(and running *unspecified*))
|
||||||
|
running)))
|
||||||
|
services)))
|
||||||
(x
|
(x
|
||||||
#f))))))
|
#f))))))
|
||||||
|
|
||||||
|
(define (resolve-transients services)
|
||||||
|
"Resolve the subset of SERVICES whose 'transient?' field is undefined. This
|
||||||
|
is necessary to deal with Shepherd 0.9.0, which did not communicate whether a
|
||||||
|
service is transient."
|
||||||
|
;; All the fuss here is to make sure we make a single "eval root" request
|
||||||
|
;; for all of SERVICES.
|
||||||
|
(let* ((unresolved (filter (compose unspecified? live-service-transient?)
|
||||||
|
services))
|
||||||
|
(values (or (eval-there
|
||||||
|
`(and (defined? 'transient?) ;shepherd >= 0.9.0
|
||||||
|
(map (compose transient? lookup-running)
|
||||||
|
',(map (compose first
|
||||||
|
live-service-provision)
|
||||||
|
unresolved))))
|
||||||
|
(make-list (length unresolved) #f)))
|
||||||
|
(resolved (map (lambda (unresolved transient?)
|
||||||
|
(cons unresolved
|
||||||
|
(set-field unresolved
|
||||||
|
(live-service-transient?)
|
||||||
|
transient?)))
|
||||||
|
unresolved values)))
|
||||||
|
(map (lambda (service)
|
||||||
|
(or (assq-ref resolved service) service))
|
||||||
|
services)))
|
||||||
|
|
||||||
(define (unload-service service)
|
(define (unload-service service)
|
||||||
"Unload SERVICE, a symbol name; return #t on success."
|
"Unload SERVICE, a symbol name; return #t on success."
|
||||||
(with-shepherd-action 'root ('unload (symbol->string service)) result
|
(with-shepherd-action 'root ('unload (symbol->string service)) result
|
||||||
|
|
Loading…
Reference in a new issue