[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
04/07: publish: Support systemd-style socket activation.
From: |
guix-commits |
Subject: |
04/07: publish: Support systemd-style socket activation. |
Date: |
Thu, 14 Apr 2022 08:49:48 -0400 (EDT) |
civodul pushed a commit to branch master
in repository guix.
commit b9233cb9a82690f81446443e016e07e01c123910
Author: Ludovic Courtès <ludo@gnu.org>
AuthorDate: Wed Apr 6 22:37:33 2022 +0200
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.
---
doc/guix.texi | 5 +++++
guix/scripts/publish.scm | 34 +++++++++++++++++++++++++++++-----
2 files changed, 34 insertions(+), 5 deletions(-)
diff --git a/doc/guix.texi b/doc/guix.texi
index a865b2e2e4..94998f170f 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -14042,6 +14042,11 @@ spawn an HTTP server on port 8080:
guix publish
@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
substitutes from it. @xref{Getting Substitutes from Other Servers}.
diff --git a/guix/scripts/publish.scm b/guix/scripts/publish.scm
index d6eb65d912..e8197eb47a 100644
--- a/guix/scripts/publish.scm
+++ b/guix/scripts/publish.scm
@@ -1235,6 +1235,23 @@ headers."
(bind sock address)
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)
"Switch to the identity of USER, a user name."
(catch 'misc-error
@@ -1280,7 +1297,12 @@ headers."
(make-socket-address (sockaddr:fam addr)
(sockaddr:addr addr)
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))
(repl-port (assoc-ref opts 'repl))
(cache (assoc-ref opts 'cache))
@@ -1305,10 +1327,12 @@ consider using the '--user' option!~%")))
(cache-bypass-threshold
(or (assoc-ref opts 'cache-bypass-threshold)
(cache-bypass-threshold))))
- (info (G_ "publishing ~a on ~a, port ~d~%")
- %store-directory
- (inet-ntop (sockaddr:fam address) (sockaddr:addr address))
- (sockaddr:port address))
+ (if (eq? style 'systemd)
+ (info (G_ "publishing (started via socket activation)~%"))
+ (info (G_ "publishing ~a on ~a, port ~d~%")
+ %store-directory
+ (inet-ntop (sockaddr:fam address) (sockaddr:addr address))
+ (sockaddr:port address)))
(for-each (lambda (compression)
(info (G_ "using '~a' compression method, level ~a~%")
- branch master updated (919cecd00b -> 16372cb347), guix-commits, 2022/04/14
- 03/07: publish: Use SRFI-71 instead of SRFI-11., guix-commits, 2022/04/14
- 01/07: style: Correctly read dots in pairs and improper lists., guix-commits, 2022/04/14
- 02/07: gnu: guile-fibers@1.1: Support cross-compilation., guix-commits, 2022/04/14
- 04/07: publish: Support systemd-style socket activation.,
guix-commits <=
- 07/07: gnu: sundials: Remove input labels., guix-commits, 2022/04/14
- 05/07: daemon: Support systemd-style socket activation., guix-commits, 2022/04/14
- 06/07: gnu: sundials: Update to 6.1.1., guix-commits, 2022/04/14