* [SHEPHERD] [PATCH 0/5] Replace 'dmd' service with 'root/shepherd'. @ 2016-01-24 15:33 Alex Kost 2016-01-24 15:33 ` [PATCH 1/5] service: Rename 'services' variable to '%services' Alex Kost ` (5 more replies) 0 siblings, 6 replies; 14+ messages in thread From: Alex Kost @ 2016-01-24 15:33 UTC (permalink / raw) To: guix-devel As discussed in a parallel thread, this patchset is for renaming 'dmd' service to 'root' service (which also provides 'shepherd' name). Actually, patches 1, 2 and 4 are not related, I just made some changes that I noticed and I believe should be made :-) Patches: [PATCH 1/5] service: Rename 'services' variable to '%services'. [PATCH 2/5] service: Improve style of 'for-each-service'. [PATCH 3/5] service: 'service-list' returns unique services. Without this change, if the root service provides 2 names, 'herd status' would display: Started: (root root) Stopped: () [PATCH 4/5] service: Add docstring to 'lookup-services'. [PATCH 5/5] Rename 'dmd' service to 'root'. ^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH 1/5] service: Rename 'services' variable to '%services'. 2016-01-24 15:33 [SHEPHERD] [PATCH 0/5] Replace 'dmd' service with 'root/shepherd' Alex Kost @ 2016-01-24 15:33 ` Alex Kost 2016-01-24 15:33 ` [PATCH 2/5] service: Improve style of 'for-each-service' Alex Kost ` (4 subsequent siblings) 5 siblings, 0 replies; 14+ messages in thread From: Alex Kost @ 2016-01-24 15:33 UTC (permalink / raw) To: guix-devel * modules/shepherd/service.scm (services): Rename to... (%services): ... this. (for-each-service, service-list, find-service, lookup-services, register-services, deregister-service): Adjust accordingly. --- modules/shepherd/service.scm | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/modules/shepherd/service.scm b/modules/shepherd/service.scm index 64d56ef..808372c 100644 --- a/modules/shepherd/service.scm +++ b/modules/shepherd/service.scm @@ -806,7 +806,7 @@ given USER and/or GROUP to run COMMAND." ;;; Registered services. ;; All registered services. -(define services (make-hash-table 75)) +(define %services (make-hash-table 75)) ;;; Perform actions with services: @@ -816,14 +816,14 @@ given USER and/or GROUP to run COMMAND." (and (eq? key (canonical-name (car value))) (proc (car value)))) #f ;; Unused - services)) + %services)) (define (service-list) "Return the list of services currently defined." (hash-fold (lambda (key services result) (append services result)) '() - services)) + %services)) (define (find-service pred) "Return the first service that matches PRED, or #f if none was found." @@ -833,13 +833,13 @@ given USER and/or GROUP to run COMMAND." (and=> (find pred services) return)) #f - services) + %services) #f))) ;; Lookup the services that provide NAME. Returns a (possibly empty) ;; list of those. (define (lookup-services name) - (hashq-ref services name '())) + (hashq-ref %services name '())) (define waitpid* (let ((waitpid (EINTR-safe waitpid))) @@ -931,7 +931,7 @@ otherwise by updating its state." (for-each (lambda (name) (let ((old (lookup-services name))) ;; Actually add the new service now. - (hashq-set! services name (cons new old)))) + (hashq-set! %services name (cons new old)))) (provided-by new))) (for-each register-single-service new-services)) @@ -953,9 +953,9 @@ requested to be removed." (let ((old (lookup-services name))) (if (= 1 (length old)) ;; Only service provides this service; remove it. - (hashq-remove! services name) + (hashq-remove! %services name) ;; ELSE: remove service from providing services. - (hashq-set! services name + (hashq-set! %services name (remove (lambda (lk-service) (eq? (canonical-name service) @@ -973,7 +973,7 @@ requested to be removed." (not (eq? key 'dmd)) (cons key service))) (_ #f))) ; all other cases: #f. - services))) + %services))) (let ((name (string->symbol service-name))) (cond ((eq? name 'all) -- 2.6.3 ^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 2/5] service: Improve style of 'for-each-service'. 2016-01-24 15:33 [SHEPHERD] [PATCH 0/5] Replace 'dmd' service with 'root/shepherd' Alex Kost 2016-01-24 15:33 ` [PATCH 1/5] service: Rename 'services' variable to '%services' Alex Kost @ 2016-01-24 15:33 ` Alex Kost 2016-01-24 15:33 ` [PATCH 3/5] service: 'service-list' returns unique services Alex Kost ` (3 subsequent siblings) 5 siblings, 0 replies; 14+ messages in thread From: Alex Kost @ 2016-01-24 15:33 UTC (permalink / raw) To: guix-devel * modules/shepherd/service.scm (lookup-canonical-service): New procedure. (for-each-service): Use it. Use 'hash-for-each' instead of 'hash-fold'. --- modules/shepherd/service.scm | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/modules/shepherd/service.scm b/modules/shepherd/service.scm index 808372c..7cf557f 100644 --- a/modules/shepherd/service.scm +++ b/modules/shepherd/service.scm @@ -2,6 +2,7 @@ ;; Copyright (C) 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org> ;; Copyright (C) 2002, 2003 Wolfgang Järling <wolfgang@pro-linux.de> ;; Copyright (C) 2014 Alex Sassmannshausen <alex.sassmannshausen@gmail.com> +;; Copyright (C) 2016 Alex Kost <alezost@gmail.com> ;; ;; This file is part of the GNU Shepherd. ;; @@ -810,13 +811,19 @@ given USER and/or GROUP to run COMMAND." ;;; Perform actions with services: -;; Call PROC once for each registered service. +(define (lookup-canonical-service name services) + "Return service with canonical NAME from SERVICES list. +Return #f if service is not found." + (find (lambda (service) + (eq? name (canonical-name service))) + services)) + (define (for-each-service proc) - (hash-fold (lambda (key value unused) - (and (eq? key (canonical-name (car value))) - (proc (car value)))) - #f ;; Unused - %services)) + "Call PROC for each registered service." + (hash-for-each (lambda (name services) + (and=> (lookup-canonical-service name services) + proc)) + %services)) (define (service-list) "Return the list of services currently defined." -- 2.6.3 ^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 3/5] service: 'service-list' returns unique services. 2016-01-24 15:33 [SHEPHERD] [PATCH 0/5] Replace 'dmd' service with 'root/shepherd' Alex Kost 2016-01-24 15:33 ` [PATCH 1/5] service: Rename 'services' variable to '%services' Alex Kost 2016-01-24 15:33 ` [PATCH 2/5] service: Improve style of 'for-each-service' Alex Kost @ 2016-01-24 15:33 ` Alex Kost 2016-01-24 15:33 ` [PATCH 4/5] service: Add docstring to 'lookup-services' Alex Kost ` (2 subsequent siblings) 5 siblings, 0 replies; 14+ messages in thread From: Alex Kost @ 2016-01-24 15:33 UTC (permalink / raw) To: guix-devel * modules/shepherd/service.scm (service-list): Remove duplicates from the final list. --- modules/shepherd/service.scm | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/modules/shepherd/service.scm b/modules/shepherd/service.scm index 7cf557f..0a13626 100644 --- a/modules/shepherd/service.scm +++ b/modules/shepherd/service.scm @@ -827,10 +827,12 @@ Return #f if service is not found." (define (service-list) "Return the list of services currently defined." - (hash-fold (lambda (key services result) - (append services result)) - '() - %services)) + (delete-duplicates + (hash-fold (lambda (key services result) + (append services result)) + '() + %services) + eq?)) (define (find-service pred) "Return the first service that matches PRED, or #f if none was found." -- 2.6.3 ^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 4/5] service: Add docstring to 'lookup-services'. 2016-01-24 15:33 [SHEPHERD] [PATCH 0/5] Replace 'dmd' service with 'root/shepherd' Alex Kost ` (2 preceding siblings ...) 2016-01-24 15:33 ` [PATCH 3/5] service: 'service-list' returns unique services Alex Kost @ 2016-01-24 15:33 ` Alex Kost 2016-01-24 15:33 ` [PATCH 5/5] Rename 'dmd' service to 'root' Alex Kost 2016-01-24 21:20 ` [SHEPHERD] [PATCH 0/5] Replace 'dmd' service with 'root/shepherd' Ludovic Courtès 5 siblings, 0 replies; 14+ messages in thread From: Alex Kost @ 2016-01-24 15:33 UTC (permalink / raw) To: guix-devel * modules/shepherd/service.scm (lookup-services): Use docstring instead of a comment. --- modules/shepherd/service.scm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/shepherd/service.scm b/modules/shepherd/service.scm index 0a13626..fd9c7e2 100644 --- a/modules/shepherd/service.scm +++ b/modules/shepherd/service.scm @@ -845,9 +845,8 @@ Return #f if service is not found." %services) #f))) -;; Lookup the services that provide NAME. Returns a (possibly empty) -;; list of those. (define (lookup-services name) + "Return a (possibly empty) list of services that provide NAME." (hashq-ref %services name '())) (define waitpid* -- 2.6.3 ^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 5/5] Rename 'dmd' service to 'root'. 2016-01-24 15:33 [SHEPHERD] [PATCH 0/5] Replace 'dmd' service with 'root/shepherd' Alex Kost ` (3 preceding siblings ...) 2016-01-24 15:33 ` [PATCH 4/5] service: Add docstring to 'lookup-services' Alex Kost @ 2016-01-24 15:33 ` Alex Kost 2016-01-25 8:55 ` Alex Kost 2016-01-24 21:20 ` [SHEPHERD] [PATCH 0/5] Replace 'dmd' service with 'root/shepherd' Ludovic Courtès 5 siblings, 1 reply; 14+ messages in thread From: Alex Kost @ 2016-01-24 15:33 UTC (permalink / raw) To: guix-devel * modules/shepherd/service.scm (dmd-service): Rename to... (shepherd-service): ... this. Provide both 'root' and 'shepherd' names. Adjust the rest file accordingly. * modules/shepherd.scm: Likewise. * modules/herd.scm: Likewise. * modules/halt.scm: Likewise. * modules/reboot.scm: Likewise. * modules/shepherd/support.scm (make-bare-init-file): Likewise. * shepherd.texi: Likewise. * tests/basic.sh: Likewise. * tests/no-home.sh: Likewise. * tests/status-sexp.sh: Likewise. --- modules/herd.scm | 12 ++++++---- modules/shepherd.scm | 10 ++++---- modules/shepherd/service.scm | 46 +++++++++++++++++------------------ modules/shepherd/support.scm | 4 ++-- shepherd.texi | 57 ++++++++++++++++++++++---------------------- tests/basic.sh | 28 +++++++++++----------- tests/no-home.sh | 4 ++-- tests/respawn.sh | 2 +- tests/status-sexp.sh | 19 ++++++++------- 9 files changed, 93 insertions(+), 89 deletions(-) diff --git a/modules/herd.scm b/modules/herd.scm index c2cca85..a5e6c16 100644 --- a/modules/herd.scm +++ b/modules/herd.scm @@ -88,7 +88,8 @@ of pairs." the daemon via SOCKET-FILE." (with-system-error-handling (let ((sock (open-connection socket-file)) - (action* (if (and (eq? service 'dmd) (eq? action 'detailed-status)) + (action* (if (and (eq? action 'detailed-status) + (memq service '(root shepherd))) 'status action))) ;; Send the command. @@ -110,9 +111,9 @@ the daemon via SOCKET-FILE." ;; Then interpret the result (match (list action service) - (('status 'dmd) + (('status (or 'root 'shepherd)) (display-status-summary (first result))) - (('detailed-status 'dmd) + (('detailed-status (or 'root 'shepherd)) (display-detailed-status (first result))) (('status _) ;; We get a list of statuses, in case several services have the @@ -135,7 +136,8 @@ the daemon via SOCKET-FILE." ((? eof-object?) ;; When stopping shepherd, we may get an EOF in lieu of a real reply, ;; and that's fine. In other cases, a premature EOF is an error. - (unless (and (eq? action 'stop) (eq? service 'dmd)) + (unless (and (eq? action 'stop) + (memq service '(root shepherd))) (report-error (l10n "premature end-of-file while \ talking to shepherd")) (exit 1)))) @@ -167,7 +169,7 @@ talking to shepherd")) (match (reverse command-args) (((and action (or "status" "detailed-status"))) ;one argument - (run-command socket-file (string->symbol action) 'dmd '())) + (run-command socket-file (string->symbol action) 'root '())) ((action service args ...) (run-command socket-file (string->symbol action) diff --git a/modules/shepherd.scm b/modules/shepherd.scm index ce24513..5e26b4f 100644 --- a/modules/shepherd.scm +++ b/modules/shepherd.scm @@ -140,8 +140,8 @@ ;; Send output to log and clients. (set-current-output-port shepherd-output-port) - ;; Start the dmd service. - (start dmd-service) + ;; Start the 'root' service. + (start root-service) ;; This _must_ succeed. (We could also put the `catch' around ;; `main', but it is often useful to get the backtrace, and ;; `caught-error' does not do this yet.) @@ -175,7 +175,7 @@ ;; ctrlaltdel(8). (sigaction SIGINT (lambda _ - (stop dmd-service))) + (stop root-service))) ;; Ignore SIGPIPE so that we don't die if a client closes the connection ;; prematurely. @@ -267,7 +267,7 @@ port)))) (lambda (key) ;; Most likely we're receiving 'quit' from the 'stop' method of - ;; DMD-SERVICE. So, if we're running as 'root', just reboot. + ;; ROOT-SERVICE. So, if we're running as 'root', just reboot. (if (zero? (getuid)) (begin (local-output "Rebooting...") @@ -283,7 +283,7 @@ would write them on the 'herd' command line." (if (eof-object? line) ;; Exit on `C-d'. - (stop dmd-service) + (stop root-service) (begin (match (string-tokenize line) diff --git a/modules/shepherd/service.scm b/modules/shepherd/service.scm index fd9c7e2..1c280aa 100644 --- a/modules/shepherd/service.scm +++ b/modules/shepherd/service.scm @@ -70,7 +70,7 @@ make-system-destructor make-init.d-service - dmd-service + root-service make-actions &service-error @@ -344,8 +344,8 @@ wire." (slot-ref obj 'running) args)) (lambda (key . args) - ;; Special case: `dmd' may quit. - (and (eq? dmd-service obj) + ;; Special case: 'root' may quit. + (and (eq? root-service obj) (eq? key 'quit) (apply quit args)) (caught-error key args))) @@ -405,8 +405,8 @@ wire." (lambda () (apply proc (slot-ref obj 'running) args)) (lambda (key . args) - ;; Special case: `dmd' may quit. - (and (eq? dmd-service obj) + ;; Special case: 'root' may quit. + (and (eq? root-service obj) (eq? key 'quit) (apply quit args)) (report-exception the-action obj key args))))))) @@ -441,7 +441,7 @@ wire." (action-list obj))) (else ;; FIXME: Implement doc-help. - (local-output "Unknown keyword. Try `doc dmd help'."))))) + (local-output "Unknown keyword. Try 'doc root help'."))))) ;; Return a list of canonical names of the services that conflict with ;; OBJ. @@ -947,7 +947,7 @@ otherwise by updating its state." (define (deregister-service service-name) "For each string in SERVICE-NAME, stop the associated service if necessary and remove it from the services table. If SERVICE-NAME is -the special string 'all', remove all services except for dmd. +the special string 'all', remove all services except of 'root'. This will remove a service either if it is identified by its canonical name, or if it is the only service providing the service that is @@ -978,7 +978,7 @@ requested to be removed." (match value ((service) ; only one service associated with KEY (and (eq? key (canonical-name service)) - (not (eq? key 'dmd)) + (not (memq key '(root shepherd))) (cons key service))) (_ #f))) ; all other cases: #f. %services))) @@ -1029,7 +1029,7 @@ requested to be removed." \f -;; The `dmd' service. +;; The 'root' service. (define (shutdown-services) "Shut down all the currently running services; update the persistent state @@ -1049,10 +1049,10 @@ file when persistence is enabled." (lambda (p) (format p "~{~a ~}~%" running-services)))))) -(define dmd-service +(define root-service (make <service> - #:docstring "The dmd service is used to operate on dmd itself." - #:provides '(dmd) + #:docstring "The root service is used to operate on shepherd itself." + #:provides '(root shepherd) #:requires '() #:respawn #f #:start (lambda args @@ -1060,9 +1060,9 @@ file when persistence is enabled." (display-version)) #t) #:stop (lambda (unused . args) - (local-output "Exiting dmd...") + (local-output "Exiting shepherd...") ;; Prevent that we try to stop ourself again. - (slot-set! dmd-service 'running #f) + (slot-set! root-service 'running #f) (shutdown-services) (quit)) ;; All actions here need to take care that they do not invoke any @@ -1082,7 +1082,7 @@ Clients such as 'herd' can read it and format it in a human-readable way." "Halt the system." (lambda (running) (catch 'quit - (cut stop dmd-service) + (cut stop root-service) (lambda (key) (local-output "Halting...") (halt))))) @@ -1091,25 +1091,25 @@ Clients such as 'herd' can read it and format it in a human-readable way." "Halt the system and turn it off." (lambda (running) (catch 'quit - (cut stop dmd-service) + (cut stop root-service) (lambda (key) (local-output "Shutting down...") (power-off))))) ;; Load a configuration file. (load - "Load the Scheme code from FILE into dmd. This is potentially + "Load the Scheme code from FILE into shepherd. This is potentially dangerous. You have been warned." (lambda (running file-name) (load-config file-name))) ;; Unload a service (unload "Unload the service identified by SERVICE-NAME or all services -except for dmd if SERVICE-NAME is 'all'. Stop services before +except for 'root' if SERVICE-NAME is 'all'. Stop services before removing them if needed." (lambda (running service-name) (deregister-service service-name))) (reload - "Unload all services, then load from FILE-NAME into dmd. This + "Unload all services, then load from FILE-NAME into shepherd. This is potentialy dangerous. You have been warned." (lambda (running file-name) (and (deregister-service "all") ; unload all services @@ -1117,7 +1117,7 @@ is potentialy dangerous. You have been warned." ;; Go into the background. (daemonize "Go into the background. Be careful, this means that a new -process will be created, so dmd will not get SIGCHLD signals anymore +process will be created, so shepherd will not get SIGCHLD signals anymore if previously spawned childs terminate. Therefore, this action should usually only be used (if at all) *before* childs get spawned for which we want to receive these signals." @@ -1143,7 +1143,7 @@ name as argument that will be used to store the status." (lambda (running) (set! persistency #f))) (cd - "Change the working directory of dmd. This only makes sense + "Change the working directory of shepherd. This only makes sense when in interactive mode, i.e. with `--socket=none'." (lambda (running dir) (chdir dir))) @@ -1151,8 +1151,8 @@ when in interactive mode, i.e. with `--socket=none'." ;; we're better off by implementing it due to the ;; default action. (restart - "This does not work for dmd." + "This does not work for the 'root' service." (lambda (running) (local-output "You must be kidding.")))))) -(register-services dmd-service) +(register-services root-service) diff --git a/modules/shepherd/support.scm b/modules/shepherd/support.scm index fbc7b3a..9bfb050 100644 --- a/modules/shepherd/support.scm +++ b/modules/shepherd/support.scm @@ -247,8 +247,8 @@ TARGET should be a string representing a filepath + name." ;; providing them as arguments to 'register-services'. ""(register-services) -;; Send dmd into the background -""(action 'dmd 'daemonize) +;; Send shepherd into the background +""(action 'shepherd 'daemonize) ;; Services to start when dmd starts: ;; Add the name of each service that should be started to the list diff --git a/shepherd.texi b/shepherd.texi index 105155f..ef1d9da 100644 --- a/shepherd.texi +++ b/shepherd.texi @@ -278,19 +278,19 @@ of the additional actions a service provides; obviously, it can also be called when the service is not running. Services cannot provide their own implementation of @code{list-actions}. -A special service is @code{dmd}, which is used for controlling the Shepherd -itself. It implements various actions. For example, the -@code{status} action displays which services are started and which -ones are stopped, whereas @code{detailed-status} has the effect of -applying the default implementation of @code{status} to all services -one after another. The @code{load} -action is unusual insofar as it shows a feature that is actually -available to all services, but which we have not seen yet: It takes an -additional argument. You can use @code{load} to load arbitrary code -into the Shepherd at runtime, like this: +A special service is @code{root}, which is used for controlling the +Shepherd itself. You can also reference to this service as +@code{shepherd}. It implements various actions. For example, the +@code{status} action displays which services are started and which ones +are stopped, whereas @code{detailed-status} has the effect of applying +the default implementation of @code{status} to all services one after +another. The @code{load} action is unusual insofar as it shows a +feature that is actually available to all services, but which we have +not seen yet: It takes an additional argument. You can use @code{load} +to load arbitrary code into the Shepherd at runtime, like this: @example -herd load dmd ~/additional-services.scm +herd load shepherd ~/additional-services.scm @end example This is enough now about the @command{herd} and @command{shepherd} programs, we @@ -322,7 +322,8 @@ You can display the status of a service, even if the service does not provide a specific implementation for this action. The same is true for restarting. @item -The @code{dmd} service is used to control @command{shepherd} itself. +The @code{root}/@code{shepherd} service is used to control +@command{shepherd} itself. @end itemize @c @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@ -446,11 +447,11 @@ herd [@var{option}@dots{}] @var{action} [@var{service} [@var{arg}@dots{}]] It causes the @var{action} of the @var{service} to be invoked. When @var{service} is omitted and @var{action} is @code{status} or -@code{detailed-status}, the @code{dmd} service is used@footnote{This +@code{detailed-status}, the @code{root} service is used@footnote{This shorthand does not work for other actions such as @code{stop}, because inadvertently typing @code{herd stop} would stop all the services, which -could be pretty annoying.} (@pxref{The dmd and unknown services}, for -more information on the @code{dmd} service.) +could be pretty annoying.} (@pxref{The root and unknown services}, for +more information on the @code{root} service.) For each action, you should pass the appropriate @var{arg}s. Actions that are available for every service are @code{start}, @code{stop}, @@ -492,8 +493,8 @@ reboot the system. It has the following synopsis: reboot [@var{option}@dots{}] @end example -It is equivalent to running @command{herd stop dmd}. The @code{reboot} -command understands the following option: +It is equivalent to running @command{herd stop shepherd}. The +@code{reboot} command understands the following option: @table @samp @@ -518,8 +519,8 @@ off the system. It has the following synopsis: halt [@var{option}@dots{}] @end example -It is equivalent to running @command{herd power-off dmd}. As usual, the -@code{halt} command understands the following option: +It is equivalent to running @command{herd power-off shepherd}. As +usual, the @code{halt} command understands the following option: @table @samp @@ -555,7 +556,7 @@ defined in the @code{(shepherd service)} module. * Service De- and Constructors:: Commonly used ways of starting and stopping services. * Service Examples:: Examples that show how services are used. -* The dmd and unknown services:: Special services in the Shepherd. +* The root and unknown services:: Special services in the Shepherd. @end menu @c @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@ -749,7 +750,7 @@ terminates. Display status information about @var{obj}. This method is called when the user performs the action @code{status} on @var{obj}, but there is no specific implementation given for it. It is also called -when @code{detailed-status} is applied on @code{dmd}. +when @code{detailed-status} is applied on the @code{root} service. @end deffn @c @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@ -917,15 +918,15 @@ also specifies some more initial values for the slots: @c @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@node The dmd and unknown services -@section The @code{dmd} and @code{unknown} services +@node The root and unknown services +@section The @code{root} and @code{unknown} services -@cindex dmd service +@cindex root service @cindex special services -The service @code{dmd} is special, because it is used to control the Shepherd -itself. It provides the following actions (in addition to -@code{enable}, @code{disable} and @code{restart} which do not make -sense here). +The service @code{root} is special, because it is used to control the +Shepherd itself. It has an alias @code{shepherd}. It provides the +following actions (in addition to @code{enable}, @code{disable} and +@code{restart} which do not make sense here). @table @code @item status diff --git a/tests/basic.sh b/tests/basic.sh index 462f8ad..a20e9dc 100644 --- a/tests/basic.sh +++ b/tests/basic.sh @@ -67,8 +67,8 @@ dmd_pid="`cat $pid`" kill -0 $dmd_pid test -S "$socket" -pristine_status=`$herd status dmd` # Prep for 'reload' test. -echo $pristine_status | grep -E '(Start.*dmd|Stop.*test)' +pristine_status=`$herd status root` # Prep for 'reload' test. +echo $pristine_status | grep -E '(Start.*root|Stop.*test)' $herd start test test -f "$stamp" @@ -97,35 +97,35 @@ do $herd $action does-not-exist 2>&1 | grep "does-not-exist.*not.*found" done -if $herd an-action-that-does-not-exist dmd +if $herd an-action-that-does-not-exist root then false; else true; fi # Wrong number of arguments for an action. -if $herd status dmd foo bar baz; +if $herd status root foo bar baz; then false; else true; fi # Asking for the doc of specific actions. -$herd doc dmd action status -if $herd doc dmd action an-action-that-does-not-exist +$herd doc root action status +if $herd doc root action an-action-that-does-not-exist then false; else true; fi # Loading nonexistent file. -if $herd load dmd /does/not/exist.scm; +if $herd load root /does/not/exist.scm; then false; else true; fi # Unload one service, make sure the other it still around. -$herd unload dmd test +$herd unload root test $herd status | grep "Stopped: (test-2)" -$herd reload dmd "$conf" +$herd reload root "$conf" test "`$herd status`" == "$pristine_status" -# Unload everything and make sure only 'dmd' is left. -$herd unload dmd all +# Unload everything and make sure only 'root' is left. +$herd unload root all $herd status | grep "Stopped: ()" -$herd status | grep "Started: (dmd)" +$herd status | grep "Started: (root)" -$herd stop dmd +$herd stop root ! kill -0 $dmd_pid test -f "$log" @@ -154,7 +154,7 @@ $herd stop test dmd_pid="`cat $pid`" -$herd stop dmd +$herd stop root ! kill -0 $dmd_pid rm -rf $confdir diff --git a/tests/no-home.sh b/tests/no-home.sh index 5f8d752..5af51e6 100644 --- a/tests/no-home.sh +++ b/tests/no-home.sh @@ -43,8 +43,8 @@ dmd_pid="$!" while ! test -f "$pid" ; do kill -0 "$dmd_pid" ; sleep 0.3 ; done kill -0 `cat "$pid"` -$herd status dmd -$herd stop dmd +$herd status root +$herd stop root if kill `cat "$pid"` then diff --git a/tests/respawn.sh b/tests/respawn.sh index 695d536..057c3ea 100644 --- a/tests/respawn.sh +++ b/tests/respawn.sh @@ -122,4 +122,4 @@ $herd status test1 | grep stopped ! kill -0 "$pid" cat $service2_pid -$herd stop dmd +$herd stop root diff --git a/tests/status-sexp.sh b/tests/status-sexp.sh index 02bba3d..3452a15 100644 --- a/tests/status-sexp.sh +++ b/tests/status-sexp.sh @@ -62,14 +62,15 @@ test -S "$socket" # Code to fetch service status info. fetch_status=" (let ((sock (open-connection \"$socket\"))) - (write-command (shepherd-command 'status 'dmd) sock) + (write-command (shepherd-command 'status 'root) sock) (read sock))" -dmd_service_sexp=" +root_service_sexp=" (service (version 0) - (provides (dmd)) (requires ()) + (provides (root shepherd)) + (requires ()) (respawn? #f) - (docstring \"The dmd service is used to operate on dmd itself.\") + (docstring \"The root service is used to operate on shepherd itself.\") (enabled? #t) (running #t) (last-respawns ()))" "$GUILE" -c " @@ -80,7 +81,7 @@ dmd_service_sexp=" (('reply _ ('result (services)) ('error #f) ('messages ())) (lset= equal? services - '($dmd_service_sexp + '($root_service_sexp (service (version 0) (provides (foo)) (requires ()) (respawn? #t) (docstring \"Foo!\") @@ -108,8 +109,8 @@ dmd_service_sexp=" (pk 'wrong x) (exit 1)))" -# Unload everything and make sure only 'dmd' is left. -$herd unload dmd all +# Unload everything and make sure only 'root' is left. +$herd unload root all "$GUILE" -c " (use-modules (shepherd comm)) @@ -118,10 +119,10 @@ $herd unload dmd all (equal? $fetch_status '(reply (version 0) - (result (($dmd_service_sexp))) + (result (($root_service_sexp))) (error #f) (messages ()))))" -$herd stop dmd +$herd stop root ! kill -0 $dmd_pid test -f "$log" -- 2.6.3 ^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: [PATCH 5/5] Rename 'dmd' service to 'root'. 2016-01-24 15:33 ` [PATCH 5/5] Rename 'dmd' service to 'root' Alex Kost @ 2016-01-25 8:55 ` Alex Kost 0 siblings, 0 replies; 14+ messages in thread From: Alex Kost @ 2016-01-25 8:55 UTC (permalink / raw) To: guix-devel Alex Kost (2016-01-24 18:33 +0300) wrote: > * modules/shepherd/service.scm (dmd-service): Rename to... > (shepherd-service): ... this. Provide both 'root' and 'shepherd' names. > Adjust the rest file accordingly. > * modules/shepherd.scm: Likewise. > * modules/herd.scm: Likewise. > * modules/halt.scm: Likewise. > * modules/reboot.scm: Likewise. > * modules/shepherd/support.scm (make-bare-init-file): Likewise. > * shepherd.texi: Likewise. > * tests/basic.sh: Likewise. > * tests/no-home.sh: Likewise. > * tests/status-sexp.sh: Likewise. Somehow I missed to adjust "halt.scm" and "reboot.scm", sorry :) Fixed in commit c3c4487. -- Alex ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [SHEPHERD] [PATCH 0/5] Replace 'dmd' service with 'root/shepherd'. 2016-01-24 15:33 [SHEPHERD] [PATCH 0/5] Replace 'dmd' service with 'root/shepherd' Alex Kost ` (4 preceding siblings ...) 2016-01-24 15:33 ` [PATCH 5/5] Rename 'dmd' service to 'root' Alex Kost @ 2016-01-24 21:20 ` Ludovic Courtès 2016-01-24 21:45 ` Mathieu Lirzin 2016-01-25 8:39 ` [SHEPHERD] [PATCH] service: Improve 'service-list' Alex Kost 5 siblings, 2 replies; 14+ messages in thread From: Ludovic Courtès @ 2016-01-24 21:20 UTC (permalink / raw) To: Alex Kost; +Cc: guix-devel Alex Kost <alezost@gmail.com> skribis: > As discussed in a parallel thread, this patchset is for renaming 'dmd' > service to 'root' service (which also provides 'shepherd' name). > > Actually, patches 1, 2 and 4 are not related, I just made some changes > that I noticed and I believe should be made :-) Indeed, there are occasionally stylistic issues. :-) > Patches: > > [PATCH 1/5] service: Rename 'services' variable to '%services'. > [PATCH 2/5] service: Improve style of 'for-each-service'. > > [PATCH 3/5] service: 'service-list' returns unique services. > > Without this change, if the root service provides 2 names, 'herd status' > would display: > > Started: (root root) > Stopped: () > > [PATCH 4/5] service: Add docstring to 'lookup-services'. > [PATCH 5/5] Rename 'dmd' service to 'root'. Excellent! I’ve pushed all 5 patches. While I was at it, I’ve added Mathieu and you as committers. Thanks! Ludo’. ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [SHEPHERD] [PATCH 0/5] Replace 'dmd' service with 'root/shepherd'. 2016-01-24 21:20 ` [SHEPHERD] [PATCH 0/5] Replace 'dmd' service with 'root/shepherd' Ludovic Courtès @ 2016-01-24 21:45 ` Mathieu Lirzin 2016-01-25 8:39 ` [SHEPHERD] [PATCH] service: Improve 'service-list' Alex Kost 1 sibling, 0 replies; 14+ messages in thread From: Mathieu Lirzin @ 2016-01-24 21:45 UTC (permalink / raw) To: Ludovic Courtès; +Cc: guix-devel, Alex Kost ludo@gnu.org (Ludovic Courtès) writes: > Excellent! I’ve pushed all 5 patches. > > While I was at it, I’ve added Mathieu and you as committers. Thanks! -- Mathieu Lirzin ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [SHEPHERD] [PATCH] service: Improve 'service-list'. 2016-01-24 21:20 ` [SHEPHERD] [PATCH 0/5] Replace 'dmd' service with 'root/shepherd' Ludovic Courtès 2016-01-24 21:45 ` Mathieu Lirzin @ 2016-01-25 8:39 ` Alex Kost 2016-01-25 15:06 ` Ludovic Courtès 1 sibling, 1 reply; 14+ messages in thread From: Alex Kost @ 2016-01-25 8:39 UTC (permalink / raw) To: Ludovic Courtès; +Cc: guix-devel [-- Attachment #1: Type: text/plain, Size: 1169 bytes --] Ludovic Courtès (2016-01-25 00:20 +0300) wrote: > Alex Kost <alezost@gmail.com> skribis: [...] >> [PATCH 1/5] service: Rename 'services' variable to '%services'. >> [PATCH 2/5] service: Improve style of 'for-each-service'. >> >> [PATCH 3/5] service: 'service-list' returns unique services. >> >> Without this change, if the root service provides 2 names, 'herd status' >> would display: >> >> Started: (root root) >> Stopped: () >> >> [PATCH 4/5] service: Add docstring to 'lookup-services'. >> [PATCH 5/5] Rename 'dmd' service to 'root'. > > Excellent! I’ve pushed all 5 patches. Ah, I'm late :-) I suddenly realized that for the 3rd patch it would be better to use 'lookup-canonical-service' instead of 'delete-duplicates'. It is guaranteed that there will be no duplicates since services have a single canonical name, so for each name from %services hash-table there will be either zero or one service with this canonical name. (Hm, I probably didn't describe it well, but I hope it's clear enough) So would it be OK to push the attached patch? > While I was at it, I’ve added Mathieu and you as committers. Thank you! [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #2: 0001-service-Improve-service-list.patch --] [-- Type: text/x-patch, Size: 1305 bytes --] From f3d21e3ec8a100a966153d03264639ebe48e8872 Mon Sep 17 00:00:00 2001 From: Alex Kost <alezost@gmail.com> Date: Mon, 25 Jan 2016 11:18:00 +0300 Subject: [PATCH] service: Improve 'service-list'. * modules/shepherd/service.scm (service-list): Use 'lookup-canonical-service' on each name instead of removing duplicates from the final list. --- modules/shepherd/service.scm | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/modules/shepherd/service.scm b/modules/shepherd/service.scm index f84d1dd..94f2aae 100644 --- a/modules/shepherd/service.scm +++ b/modules/shepherd/service.scm @@ -871,12 +871,13 @@ Return #f if service is not found." (define (service-list) "Return the list of services currently defined." - (delete-duplicates - (hash-fold (lambda (key services result) - (append services result)) - '() - %services) - eq?)) + (hash-fold (lambda (name services result) + (let ((service (lookup-canonical-service name services))) + (if service + (cons service result) + result))) + '() + %services)) (define (find-service pred) "Return the first service that matches PRED, or #f if none was found." -- 2.6.3 ^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: [SHEPHERD] [PATCH] service: Improve 'service-list'. 2016-01-25 8:39 ` [SHEPHERD] [PATCH] service: Improve 'service-list' Alex Kost @ 2016-01-25 15:06 ` Ludovic Courtès 2016-01-25 15:57 ` Alex Kost 0 siblings, 1 reply; 14+ messages in thread From: Ludovic Courtès @ 2016-01-25 15:06 UTC (permalink / raw) To: Alex Kost; +Cc: guix-devel Alex Kost <alezost@gmail.com> skribis: > From f3d21e3ec8a100a966153d03264639ebe48e8872 Mon Sep 17 00:00:00 2001 > From: Alex Kost <alezost@gmail.com> > Date: Mon, 25 Jan 2016 11:18:00 +0300 > Subject: [PATCH] service: Improve 'service-list'. > > * modules/shepherd/service.scm (service-list): Use > 'lookup-canonical-service' on each name instead of removing duplicates > from the final list. [...] > diff --git a/modules/shepherd/service.scm b/modules/shepherd/service.scm > index f84d1dd..94f2aae 100644 > --- a/modules/shepherd/service.scm > +++ b/modules/shepherd/service.scm > @@ -871,12 +871,13 @@ Return #f if service is not found." > > (define (service-list) > "Return the list of services currently defined." > - (delete-duplicates > - (hash-fold (lambda (key services result) > - (append services result)) > - '() > - %services) > - eq?)) > + (hash-fold (lambda (name services result) > + (let ((service (lookup-canonical-service name services))) > + (if service > + (cons service result) > + result))) > + '() > + %services)) OK, except that we know that SERVICE is necessarily true, because the canonical service for NAME is necessarily among SERVICES. So I would remove the ‘if’ and add a comment explaining the above. OK with this change? Thanks, Ludo’. ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [SHEPHERD] [PATCH] service: Improve 'service-list'. 2016-01-25 15:06 ` Ludovic Courtès @ 2016-01-25 15:57 ` Alex Kost 2016-01-25 21:49 ` Ludovic Courtès 0 siblings, 1 reply; 14+ messages in thread From: Alex Kost @ 2016-01-25 15:57 UTC (permalink / raw) To: Ludovic Courtès; +Cc: guix-devel Ludovic Courtès (2016-01-25 18:06 +0300) wrote: > Alex Kost <alezost@gmail.com> skribis: > >> From f3d21e3ec8a100a966153d03264639ebe48e8872 Mon Sep 17 00:00:00 2001 >> From: Alex Kost <alezost@gmail.com> >> Date: Mon, 25 Jan 2016 11:18:00 +0300 >> Subject: [PATCH] service: Improve 'service-list'. >> >> * modules/shepherd/service.scm (service-list): Use >> 'lookup-canonical-service' on each name instead of removing duplicates >> from the final list. > > [...] > >> diff --git a/modules/shepherd/service.scm b/modules/shepherd/service.scm >> index f84d1dd..94f2aae 100644 >> --- a/modules/shepherd/service.scm >> +++ b/modules/shepherd/service.scm >> @@ -871,12 +871,13 @@ Return #f if service is not found." >> >> (define (service-list) >> "Return the list of services currently defined." >> - (delete-duplicates >> - (hash-fold (lambda (key services result) >> - (append services result)) >> - '() >> - %services) >> - eq?)) >> + (hash-fold (lambda (name services result) >> + (let ((service (lookup-canonical-service name services))) >> + (if service >> + (cons service result) >> + result))) >> + '() >> + %services)) > > OK, except that we know that SERVICE is necessarily true, because the > canonical service for NAME is necessarily among SERVICES. > > So I would remove the ‘if’ and add a comment explaining the above. > > OK with this change? No, the service is not necessarily true. When a service has several names (e.g., "root" and "shepherd"), then %services table will contain 2 entries (with 'root' and 'shepherd' keys and the same (#<<service> …>) value). So for one of the hash-table entries: (lookup-canonical-service 'root (list root-service)) returns #t, and for the other: (lookup-canonical-service 'shepherd (list root-service)) it returns #f. -- Alex ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [SHEPHERD] [PATCH] service: Improve 'service-list'. 2016-01-25 15:57 ` Alex Kost @ 2016-01-25 21:49 ` Ludovic Courtès 2016-01-26 9:42 ` Alex Kost 0 siblings, 1 reply; 14+ messages in thread From: Ludovic Courtès @ 2016-01-25 21:49 UTC (permalink / raw) To: Alex Kost; +Cc: guix-devel Alex Kost <alezost@gmail.com> skribis: > Ludovic Courtès (2016-01-25 18:06 +0300) wrote: > >> Alex Kost <alezost@gmail.com> skribis: >> >>> From f3d21e3ec8a100a966153d03264639ebe48e8872 Mon Sep 17 00:00:00 2001 >>> From: Alex Kost <alezost@gmail.com> >>> Date: Mon, 25 Jan 2016 11:18:00 +0300 >>> Subject: [PATCH] service: Improve 'service-list'. >>> >>> * modules/shepherd/service.scm (service-list): Use >>> 'lookup-canonical-service' on each name instead of removing duplicates >>> from the final list. >> >> [...] >> >>> diff --git a/modules/shepherd/service.scm b/modules/shepherd/service.scm >>> index f84d1dd..94f2aae 100644 >>> --- a/modules/shepherd/service.scm >>> +++ b/modules/shepherd/service.scm >>> @@ -871,12 +871,13 @@ Return #f if service is not found." >>> >>> (define (service-list) >>> "Return the list of services currently defined." >>> - (delete-duplicates >>> - (hash-fold (lambda (key services result) >>> - (append services result)) >>> - '() >>> - %services) >>> - eq?)) >>> + (hash-fold (lambda (name services result) >>> + (let ((service (lookup-canonical-service name services))) >>> + (if service >>> + (cons service result) >>> + result))) >>> + '() >>> + %services)) >> >> OK, except that we know that SERVICE is necessarily true, because the >> canonical service for NAME is necessarily among SERVICES. >> >> So I would remove the ‘if’ and add a comment explaining the above. >> >> OK with this change? > > No, the service is not necessarily true. When a service has several > names (e.g., "root" and "shepherd"), then %services table will contain 2 > entries (with 'root' and 'shepherd' keys and the same (#<<service> …>) > value). So for one of the hash-table entries: > > (lookup-canonical-service 'root (list root-service)) > > returns #t, and for the other: > > (lookup-canonical-service 'shepherd (list root-service)) > > it returns #f. Indeed, my bad. Then OK to push, thanks! Ludo’. ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [SHEPHERD] [PATCH] service: Improve 'service-list'. 2016-01-25 21:49 ` Ludovic Courtès @ 2016-01-26 9:42 ` Alex Kost 0 siblings, 0 replies; 14+ messages in thread From: Alex Kost @ 2016-01-26 9:42 UTC (permalink / raw) To: Ludovic Courtès; +Cc: guix-devel Ludovic Courtès (2016-01-26 00:49 +0300) wrote: > Alex Kost <alezost@gmail.com> skribis: > >> Ludovic Courtès (2016-01-25 18:06 +0300) wrote: >> >>> Alex Kost <alezost@gmail.com> skribis: >>> >>>> From f3d21e3ec8a100a966153d03264639ebe48e8872 Mon Sep 17 00:00:00 2001 >>>> From: Alex Kost <alezost@gmail.com> >>>> Date: Mon, 25 Jan 2016 11:18:00 +0300 >>>> Subject: [PATCH] service: Improve 'service-list'. >>>> >>>> * modules/shepherd/service.scm (service-list): Use >>>> 'lookup-canonical-service' on each name instead of removing duplicates >>>> from the final list. >>> >>> [...] >>> >>>> diff --git a/modules/shepherd/service.scm b/modules/shepherd/service.scm >>>> index f84d1dd..94f2aae 100644 >>>> --- a/modules/shepherd/service.scm >>>> +++ b/modules/shepherd/service.scm >>>> @@ -871,12 +871,13 @@ Return #f if service is not found." >>>> >>>> (define (service-list) >>>> "Return the list of services currently defined." >>>> - (delete-duplicates >>>> - (hash-fold (lambda (key services result) >>>> - (append services result)) >>>> - '() >>>> - %services) >>>> - eq?)) >>>> + (hash-fold (lambda (name services result) >>>> + (let ((service (lookup-canonical-service name services))) >>>> + (if service >>>> + (cons service result) >>>> + result))) >>>> + '() >>>> + %services)) >>> >>> OK, except that we know that SERVICE is necessarily true, because the >>> canonical service for NAME is necessarily among SERVICES. >>> >>> So I would remove the ‘if’ and add a comment explaining the above. >>> >>> OK with this change? >> >> No, the service is not necessarily true. When a service has several >> names (e.g., "root" and "shepherd"), then %services table will contain 2 >> entries (with 'root' and 'shepherd' keys and the same (#<<service> …>) >> value). So for one of the hash-table entries: >> >> (lookup-canonical-service 'root (list root-service)) >> >> returns #t, and for the other: >> >> (lookup-canonical-service 'shepherd (list root-service)) >> >> it returns #f. > > Indeed, my bad. > > Then OK to push, thanks! Pushed, thanks! -- Alex ^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2016-01-26 9:42 UTC | newest] Thread overview: 14+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2016-01-24 15:33 [SHEPHERD] [PATCH 0/5] Replace 'dmd' service with 'root/shepherd' Alex Kost 2016-01-24 15:33 ` [PATCH 1/5] service: Rename 'services' variable to '%services' Alex Kost 2016-01-24 15:33 ` [PATCH 2/5] service: Improve style of 'for-each-service' Alex Kost 2016-01-24 15:33 ` [PATCH 3/5] service: 'service-list' returns unique services Alex Kost 2016-01-24 15:33 ` [PATCH 4/5] service: Add docstring to 'lookup-services' Alex Kost 2016-01-24 15:33 ` [PATCH 5/5] Rename 'dmd' service to 'root' Alex Kost 2016-01-25 8:55 ` Alex Kost 2016-01-24 21:20 ` [SHEPHERD] [PATCH 0/5] Replace 'dmd' service with 'root/shepherd' Ludovic Courtès 2016-01-24 21:45 ` Mathieu Lirzin 2016-01-25 8:39 ` [SHEPHERD] [PATCH] service: Improve 'service-list' Alex Kost 2016-01-25 15:06 ` Ludovic Courtès 2016-01-25 15:57 ` Alex Kost 2016-01-25 21:49 ` Ludovic Courtès 2016-01-26 9:42 ` Alex Kost
Code repositories for project(s) associated with this external index https://git.savannah.gnu.org/cgit/guix.git This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.