publish: Support systemd-style socket activation.
* guix/scripts/publish.scm (systemd-socket): New procedure. (guix-publish): Add 'style' variable. Adjust startup message depending on whether STYLE is 'systemd. * doc/guix.texi (Invoking guix publish): Mention socket activation.master
parent
17c6d00b57
commit
b9233cb9a8
|
@ -14042,6 +14042,11 @@ spawn an HTTP server on port 8080:
|
||||||
guix publish
|
guix publish
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
|
@cindex socket activation, for @command{guix publish}
|
||||||
|
@command{guix publish} can also be started following the systemd
|
||||||
|
``socket activation'' protocol (@pxref{Service De- and Constructors,
|
||||||
|
@code{make-systemd-constructor},, shepherd, The GNU Shepherd Manual}).
|
||||||
|
|
||||||
Once a publishing server has been authorized, the daemon may download
|
Once a publishing server has been authorized, the daemon may download
|
||||||
substitutes from it. @xref{Getting Substitutes from Other Servers}.
|
substitutes from it. @xref{Getting Substitutes from Other Servers}.
|
||||||
|
|
||||||
|
|
|
@ -1235,6 +1235,23 @@ headers."
|
||||||
(bind sock address)
|
(bind sock address)
|
||||||
sock))
|
sock))
|
||||||
|
|
||||||
|
(define (systemd-socket)
|
||||||
|
"If this program is being spawned through systemd-style \"socket
|
||||||
|
activation\", whereby the listening socket is passed as file descriptor 3,
|
||||||
|
return the corresponding socket. Otherwise return #f."
|
||||||
|
(and (equal? (and=> (getenv "LISTEN_PID") string->number)
|
||||||
|
(getpid))
|
||||||
|
(match (getenv "LISTEN_FDS")
|
||||||
|
((= string->number 1)
|
||||||
|
(let ((sock (fdopen 3 "r+0")))
|
||||||
|
(configure-socket sock)
|
||||||
|
sock))
|
||||||
|
((= string->number (? integer? n))
|
||||||
|
(leave (G_ "~a: unexpected number of startup file descriptors")
|
||||||
|
n))
|
||||||
|
(_
|
||||||
|
#f))))
|
||||||
|
|
||||||
(define (gather-user-privileges user)
|
(define (gather-user-privileges user)
|
||||||
"Switch to the identity of USER, a user name."
|
"Switch to the identity of USER, a user name."
|
||||||
(catch 'misc-error
|
(catch 'misc-error
|
||||||
|
@ -1280,7 +1297,12 @@ headers."
|
||||||
(make-socket-address (sockaddr:fam addr)
|
(make-socket-address (sockaddr:fam addr)
|
||||||
(sockaddr:addr addr)
|
(sockaddr:addr addr)
|
||||||
port)))
|
port)))
|
||||||
(socket (open-server-socket address))
|
(socket style (match (systemd-socket)
|
||||||
|
(#f
|
||||||
|
(values (open-server-socket address)
|
||||||
|
'normal))
|
||||||
|
(socket
|
||||||
|
(values socket 'systemd))))
|
||||||
(nar-path (assoc-ref opts 'nar-path))
|
(nar-path (assoc-ref opts 'nar-path))
|
||||||
(repl-port (assoc-ref opts 'repl))
|
(repl-port (assoc-ref opts 'repl))
|
||||||
(cache (assoc-ref opts 'cache))
|
(cache (assoc-ref opts 'cache))
|
||||||
|
@ -1305,10 +1327,12 @@ consider using the '--user' option!~%")))
|
||||||
(cache-bypass-threshold
|
(cache-bypass-threshold
|
||||||
(or (assoc-ref opts 'cache-bypass-threshold)
|
(or (assoc-ref opts 'cache-bypass-threshold)
|
||||||
(cache-bypass-threshold))))
|
(cache-bypass-threshold))))
|
||||||
(info (G_ "publishing ~a on ~a, port ~d~%")
|
(if (eq? style 'systemd)
|
||||||
%store-directory
|
(info (G_ "publishing (started via socket activation)~%"))
|
||||||
(inet-ntop (sockaddr:fam address) (sockaddr:addr address))
|
(info (G_ "publishing ~a on ~a, port ~d~%")
|
||||||
(sockaddr:port address))
|
%store-directory
|
||||||
|
(inet-ntop (sockaddr:fam address) (sockaddr:addr address))
|
||||||
|
(sockaddr:port address)))
|
||||||
|
|
||||||
(for-each (lambda (compression)
|
(for-each (lambda (compression)
|
||||||
(info (G_ "using '~a' compression method, level ~a~%")
|
(info (G_ "using '~a' compression method, level ~a~%")
|
||||||
|
|
Reference in New Issue