mirror of
https://git.in.rschanz.org/ryan77627/guix.git
synced 2024-12-24 13:28:12 -05:00
services: nscd: Add 'invalidate' and 'statistics' actions.
* gnu/services/base.scm (nscd-action-procedure, nscd-actions): New procedures. (nscd-shepherd-service): Add 'modules' and 'actions' fields. * gnu/tests/base.scm (run-basic-test)["nscd invalidate action"] ["nscd invalidate action, wrong table"]: New tests. * doc/guix.texi (Services): Mention 'herd doc nscd action'. (Base Services): Document the actions.
This commit is contained in:
parent
190877748e
commit
d3f75179e5
3 changed files with 88 additions and 6 deletions
|
@ -10563,11 +10563,14 @@ Start,,, shepherd, The GNU Shepherd Manual}). For example:
|
|||
|
||||
The above command, run as @code{root}, lists the currently defined
|
||||
services. The @command{herd doc} command shows a synopsis of the given
|
||||
service:
|
||||
service and its associated actions:
|
||||
|
||||
@example
|
||||
# herd doc nscd
|
||||
Run libc's name service cache daemon (nscd).
|
||||
|
||||
# herd doc nscd action invalidate
|
||||
invalidate: Invalidate the given cache--e.g., 'hosts' for host name lookups.
|
||||
@end example
|
||||
|
||||
The @command{start}, @command{stop}, and @command{restart} sub-commands
|
||||
|
@ -10965,6 +10968,27 @@ The Kmscon package to use.
|
|||
Return a service that runs the libc name service cache daemon (nscd) with the
|
||||
given @var{config}---an @code{<nscd-configuration>} object. @xref{Name
|
||||
Service Switch}, for an example.
|
||||
|
||||
For convenience, the Shepherd service for nscd provides the following actions:
|
||||
|
||||
@table @code
|
||||
@item invalidate
|
||||
@cindex cache invalidation, nscd
|
||||
@cindex nscd, cache invalidation
|
||||
This invalidate the given cache. For instance, running:
|
||||
|
||||
@example
|
||||
herd invalidate nscd hosts
|
||||
@end example
|
||||
|
||||
@noindent
|
||||
invalidates the host name lookup cache of nscd.
|
||||
|
||||
@item statistics
|
||||
Running @command{herd statistics nscd} displays information about nscd usage
|
||||
and caches.
|
||||
@end table
|
||||
|
||||
@end deffn
|
||||
|
||||
@defvr {Scheme Variable} %nscd-default-configuration
|
||||
|
|
|
@ -1252,18 +1252,57 @@ (define cache->config
|
|||
(string-concatenate
|
||||
(map cache->config caches)))))))
|
||||
|
||||
(define (nscd-action-procedure nscd config option)
|
||||
;; XXX: This is duplicated from mcron; factorize.
|
||||
#~(lambda (_ . args)
|
||||
;; Run 'nscd' in a pipe so we can explicitly redirect its output to
|
||||
;; 'current-output-port', which at this stage is bound to the client
|
||||
;; connection.
|
||||
(let ((pipe (apply open-pipe* OPEN_READ #$nscd
|
||||
"-f" #$config #$option args)))
|
||||
(let loop ()
|
||||
(match (read-line pipe 'concat)
|
||||
((? eof-object?)
|
||||
(catch 'system-error
|
||||
(lambda ()
|
||||
(zero? (close-pipe pipe)))
|
||||
(lambda args
|
||||
;; There's a race with the SIGCHLD handler, which could
|
||||
;; call 'waitpid' before 'close-pipe' above does. If we
|
||||
;; get ECHILD, that means we lost the race, but that's
|
||||
;; fine.
|
||||
(or (= ECHILD (system-error-errno args))
|
||||
(apply throw args)))))
|
||||
(line
|
||||
(display line)
|
||||
(loop)))))))
|
||||
|
||||
(define (nscd-actions nscd config)
|
||||
"Return Shepherd actions for NSCD."
|
||||
;; Make this functionality available as actions because that's a simple way
|
||||
;; to run the right 'nscd' binary with the right config file.
|
||||
(list (shepherd-action
|
||||
(name 'statistics)
|
||||
(documentation "Display statistics about nscd usage.")
|
||||
(procedure (nscd-action-procedure nscd config "--statistics")))
|
||||
(shepherd-action
|
||||
(name 'invalidate)
|
||||
(documentation
|
||||
"Invalidate the given cache--e.g., 'hosts' for host name lookups.")
|
||||
(procedure (nscd-action-procedure nscd config "--invalidate")))))
|
||||
|
||||
(define (nscd-shepherd-service config)
|
||||
"Return a shepherd service for CONFIG, an <nscd-configuration> object."
|
||||
(let ((nscd.conf (nscd.conf-file config))
|
||||
(let ((nscd (file-append (nscd-configuration-glibc config)
|
||||
"/sbin/nscd"))
|
||||
(nscd.conf (nscd.conf-file config))
|
||||
(name-services (nscd-configuration-name-services config)))
|
||||
(list (shepherd-service
|
||||
(documentation "Run libc's name service cache daemon (nscd).")
|
||||
(provision '(nscd))
|
||||
(requirement '(user-processes))
|
||||
(start #~(make-forkexec-constructor
|
||||
(list #$(file-append (nscd-configuration-glibc config)
|
||||
"/sbin/nscd")
|
||||
"-f" #$nscd.conf "--foreground")
|
||||
(list #$nscd "-f" #$nscd.conf "--foreground")
|
||||
|
||||
;; Wait for the PID file. However, the PID file is
|
||||
;; written before nscd is actually listening on its
|
||||
|
@ -1277,7 +1316,12 @@ (define (nscd-shepherd-service config)
|
|||
(string-append dir "/lib"))
|
||||
(list #$@name-services))
|
||||
":")))))
|
||||
(stop #~(make-kill-destructor))))))
|
||||
(stop #~(make-kill-destructor))
|
||||
(modules `((ice-9 popen) ;for the actions
|
||||
(ice-9 rdelim)
|
||||
(ice-9 match)
|
||||
,@%default-modules))
|
||||
(actions (nscd-actions nscd nscd.conf))))))
|
||||
|
||||
(define nscd-activation
|
||||
;; Actions to take before starting nscd.
|
||||
|
|
|
@ -335,6 +335,20 @@ (define (entry->list entry)
|
|||
(x
|
||||
(pk 'failure x #f))))
|
||||
|
||||
(test-equal "nscd invalidate action"
|
||||
'(#t) ;one value, #t
|
||||
(marionette-eval '(with-shepherd-action 'nscd ('invalidate "hosts")
|
||||
result
|
||||
result)
|
||||
marionette))
|
||||
|
||||
(test-equal "nscd invalidate action, wrong table"
|
||||
'(#f) ;one value, #f
|
||||
(marionette-eval '(with-shepherd-action 'nscd ('invalidate "xyz")
|
||||
result
|
||||
result)
|
||||
marionette))
|
||||
|
||||
(test-equal "host not found"
|
||||
#f
|
||||
(marionette-eval
|
||||
|
|
Loading…
Reference in a new issue