store: Support 'ssh://' URIs in 'GUIX_DAEMON_SOCKET'.

This allows 'guix' commands to talk to a remote store over SSH.

* guix/store.scm (connect-to-daemon)[connect]: Call 'resolve-interface'
for unknown URI schemes.
* guix/store/ssh.scm: New file.
* Makefile.am (MODULES): Add it.
* doc/guix.texi (The Store): Document it.  Mark remote access as
experimental.
This commit is contained in:
Ludovic Courtès 2017-04-21 19:13:32 +02:00 committed by Ludovic Courtès
parent e537833726
commit 285f63e805
No known key found for this signature in database
GPG key ID: 090B11993D9AEBB5
4 changed files with 81 additions and 4 deletions

View file

@ -187,7 +187,8 @@ if HAVE_GUILE_SSH
MODULES += \ MODULES += \
guix/ssh.scm \ guix/ssh.scm \
guix/scripts/copy.scm guix/scripts/copy.scm \
guix/store/ssh.scm
endif HAVE_GUILE_SSH endif HAVE_GUILE_SSH

View file

@ -3696,9 +3696,30 @@ guix://master.guix.example.org:1234
This setup is suitable on local networks, such as clusters, where only This setup is suitable on local networks, such as clusters, where only
trusted nodes may connect to the build daemon at trusted nodes may connect to the build daemon at
@code{master.guix.example.org}. @code{master.guix.example.org}.
@item ssh
@cindex SSH access to build daemons
These URIs allow you to connect to a remote daemon over
SSH@footnote{This feature requires Guile-SSH (@pxref{Requirements}).}.
A typical URL might look like this:
@example
ssh://charlie@@guix.example.org:22
@end example
As for @command{guix copy}, the usual OpenSSH client configuration files
are honored (@pxref{Invoking guix copy}).
@end table @end table
Additional URI schemes may be supported in the future. Additional URI schemes may be supported in the future.
@c XXX: Remove this note when the protocol incurs fewer round trips
@c and when (guix derivations) no longer relies on file system access.
@quotation Note
The ability to connect to remote build daemons is considered
experimental as of @value{VERSION}. Please get in touch with us to
share any problems or suggestions you may have (@pxref{Contributing}).
@end quotation
@end defvr @end defvr
@deffn {Scheme Procedure} open-connection [@var{uri}] [#:reserve-space? #t] @deffn {Scheme Procedure} open-connection [@var{uri}] [#:reserve-space? #t]

View file

@ -411,6 +411,11 @@ (define addresses
(define (connect-to-daemon uri) (define (connect-to-daemon uri)
"Connect to the daemon at URI, a string that may be an actual URI or a file "Connect to the daemon at URI, a string that may be an actual URI or a file
name." name."
(define (not-supported)
(raise (condition (&nix-connection-error
(file uri)
(errno ENOTSUP)))))
(define connect (define connect
(match (string->uri uri) (match (string->uri uri)
(#f ;URI is a file name (#f ;URI is a file name
@ -428,10 +433,21 @@ (define connect
(errno EBADR))))) ;bah! (errno EBADR))))) ;bah!
(open-inet-socket (uri-host uri) (uri-port uri)))) (open-inet-socket (uri-host uri) (uri-port uri))))
((? symbol? scheme)
;; Try to dynamically load a module for SCHEME.
;; XXX: Errors are swallowed.
(match (false-if-exception
(resolve-interface `(guix store ,scheme)))
((? module? module)
(match (false-if-exception
(module-ref module 'connect-to-daemon))
((? procedure? connect)
(lambda (_)
(connect uri)))
(x (not-supported))))
(#f (not-supported))))
(x (x
(raise (condition (&nix-connection-error (not-supported))))))
(file (uri->string uri))
(errno ENOTSUP)))))))))
(connect uri)) (connect uri))

39
guix/store/ssh.scm Normal file
View file

@ -0,0 +1,39 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2017 Ludovic Courtès <ludo@gnu.org>
;;;
;;; This file is part of GNU Guix.
;;;
;;; GNU Guix is free software; you can redistribute it and/or modify it
;;; under the terms of the GNU General Public License as published by
;;; the Free Software Foundation; either version 3 of the License, or (at
;;; your option) any later version.
;;;
;;; GNU Guix is distributed in the hope that it will be useful, but
;;; WITHOUT ANY WARRANTY; without even the implied warranty of
;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;;; GNU General Public License for more details.
;;;
;;; You should have received a copy of the GNU General Public License
;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
(define-module (guix store ssh)
#:use-module (guix ssh)
#:use-module (web uri)
#:export (connect-to-daemon))
;;; Commentary:
;;;
;;; This modules provides the entry point for 'open-connection' in (guix
;;; store). Passing an 'ssh://' URI to 'open-connection' triggers the use of
;;; the code in this module.
;;;
;;; End:
(define (connect-to-daemon uri)
"Connect to the SSH daemon at URI, a URI object with the 'ssh' scheme."
(remote-daemon-channel
(open-ssh-session (uri-host uri)
#:port (or (uri-port uri) 22)
#:user (uri-userinfo uri))))
;;; ssh.scm ends here