services: guix: Add 'set-http-proxy' action.

Fixes <https://bugs.gnu.org/25569>.
Reported by Divan Santana <divan@santanas.co.za>.

* gnu/services/base.scm (shepherd-set-http-proxy-action): New procedure.
(guix-shepherd-service): Add 'actions' field.  Change 'start' to a
lambda; check the value of the "http_proxy" environment variable and
add "http_proxy" and "https_proxy" to #:environment-variables as a
function of that.
* gnu/tests/base.scm (run-basic-test)["guix-daemon set-http-proxy
action", "guix-daemon set-http-proxy action, clear"]: New tests.
* doc/guix.texi (Base Services): Document it.
This commit is contained in:
Ludovic Courtès 2020-04-07 12:13:04 +02:00
parent 1e6fe44da8
commit 3302e03ba0
No known key found for this signature in database
GPG Key ID: 090B11993D9AEBB5
3 changed files with 102 additions and 37 deletions

View File

@ -12779,9 +12779,24 @@ List of extra command-line options for @command{guix-daemon}.
File where @command{guix-daemon}'s standard output and standard error
are written.
@cindex HTTP proxy, for @code{guix-daemon}
@cindex proxy, for @code{guix-daemon} HTTP access
@item @code{http-proxy} (default: @code{#f})
The HTTP proxy used for downloading fixed-output derivations and
substitutes.
The URL of the HTTP and HTTPS proxy used for downloading fixed-output
derivations and substitutes.
It is also possible to change the daemon's proxy at run time through the
@code{set-http-proxy} action, which restarts it:
@example
herd set-http-proxy guix-daemon http://localhost:8118
@end example
To clear the proxy settings, run:
@example
herd set-http-proxy guix-daemon
@end example
@item @code{tmpdir} (default: @code{#f})
A directory path where the @command{guix-daemon} will perform builds.

View File

@ -1640,6 +1640,30 @@ archive' public keys, with GUIX."
(define %default-guix-configuration
(guix-configuration))
(define shepherd-set-http-proxy-action
;; Shepherd action to change the HTTP(S) proxy.
(shepherd-action
(name 'set-http-proxy)
(documentation
"Change the HTTP(S) proxy used by 'guix-daemon' and restart it.")
(procedure #~(lambda* (_ #:optional proxy)
(let ((environment (environ)))
;; A bit of a hack: communicate PROXY to the 'start'
;; method via environment variables.
(if proxy
(begin
(format #t "changing HTTP/HTTPS \
proxy of 'guix-daemon' to ~s...~%"
proxy)
(setenv "http_proxy" proxy))
(begin
(format #t "clearing HTTP/HTTPS \
proxy of 'guix-daemon'...~%")
(unsetenv "http_proxy")))
(action 'guix-daemon 'restart)
(environ environment)
#t)))))
(define (guix-shepherd-service config)
"Return a <shepherd-service> for the Guix daemon service with CONFIG."
(match-record config <guix-configuration>
@ -1651,47 +1675,58 @@ archive' public keys, with GUIX."
(documentation "Run the Guix daemon.")
(provision '(guix-daemon))
(requirement '(user-processes))
(actions (list shepherd-set-http-proxy-action))
(modules '((srfi srfi-1)))
(start
#~(make-forkexec-constructor
(cons* #$(file-append guix "/bin/guix-daemon")
"--build-users-group" #$build-group
"--max-silent-time" #$(number->string max-silent-time)
"--timeout" #$(number->string timeout)
"--log-compression" #$(symbol->string log-compression)
#$@(if use-substitutes?
'()
'("--no-substitutes"))
"--substitute-urls" #$(string-join substitute-urls)
#$@extra-options
#~(lambda _
(define proxy
;; HTTP/HTTPS proxy. The 'http_proxy' variable is set by
;; the 'set-http-proxy' action.
(or (getenv "http_proxy") #$http-proxy))
;; Add CHROOT-DIRECTORIES and all their dependencies (if
;; these are store items) to the chroot.
(append-map (lambda (file)
(append-map (lambda (directory)
(list "--chroot-directory"
directory))
(call-with-input-file file
read)))
'#$(map references-file chroot-directories)))
(fork+exec-command
(cons* #$(file-append guix "/bin/guix-daemon")
"--build-users-group" #$build-group
"--max-silent-time" #$(number->string max-silent-time)
"--timeout" #$(number->string timeout)
"--log-compression" #$(symbol->string log-compression)
#$@(if use-substitutes?
'()
'("--no-substitutes"))
"--substitute-urls" #$(string-join substitute-urls)
#$@extra-options
#:environment-variables
(list #$@(if http-proxy
(list (string-append "http_proxy=" http-proxy))
'())
#$@(if tmpdir
(list (string-append "TMPDIR=" tmpdir))
'())
;; Add CHROOT-DIRECTORIES and all their dependencies
;; (if these are store items) to the chroot.
(append-map (lambda (file)
(append-map (lambda (directory)
(list "--chroot-directory"
directory))
(call-with-input-file file
read)))
'#$(map references-file
chroot-directories)))
;; Make sure we run in a UTF-8 locale so that 'guix
;; offload' correctly restores nars that contain UTF-8
;; file names such as 'nss-certs'. See
;; <https://bugs.gnu.org/32942>.
(string-append "GUIX_LOCPATH="
#$glibc-utf8-locales "/lib/locale")
"LC_ALL=en_US.utf8")
#:environment-variables
(append (list #$@(if tmpdir
(list (string-append "TMPDIR=" tmpdir))
'())
#:log-file #$log-file))
;; Make sure we run in a UTF-8 locale so that
;; 'guix offload' correctly restores nars that
;; contain UTF-8 file names such as
;; 'nss-certs'. See
;; <https://bugs.gnu.org/32942>.
(string-append "GUIX_LOCPATH="
#$glibc-utf8-locales
"/lib/locale")
"LC_ALL=en_US.utf8")
(if proxy
(list (string-append "http_proxy=" proxy)
(string-append "https_proxy=" proxy))
'()))
#:log-file #$log-file)))
(stop #~(make-kill-destructor))))))
(define (guix-accounts config)

View File

@ -459,6 +459,21 @@ info --version")
(marionette-eval '(readlink "/var/guix/gcroots/profiles")
marionette))
(test-equal "guix-daemon set-http-proxy action"
'(#t) ;one value, #t
(marionette-eval '(with-shepherd-action 'guix-daemon
('set-http-proxy "http://localhost:8118")
result
result)
marionette))
(test-equal "guix-daemon set-http-proxy action, clear"
'(#t) ;one value, #t
(marionette-eval '(with-shepherd-action 'guix-daemon
('set-http-proxy)
result
result)
marionette))
(test-assert "screendump"
(begin