diff --git a/Makefile.am b/Makefile.am index a997ed8b99..db4ebe04dc 100644 --- a/Makefile.am +++ b/Makefile.am @@ -187,7 +187,8 @@ if HAVE_GUILE_SSH MODULES += \ guix/ssh.scm \ - guix/scripts/copy.scm + guix/scripts/copy.scm \ + guix/store/ssh.scm endif HAVE_GUILE_SSH diff --git a/doc/guix.texi b/doc/guix.texi index 8f646475e9..0d334e302f 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -3696,9 +3696,30 @@ guix://master.guix.example.org:1234 This setup is suitable on local networks, such as clusters, where only trusted nodes may connect to the build daemon at @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 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 @deffn {Scheme Procedure} open-connection [@var{uri}] [#:reserve-space? #t] diff --git a/guix/store.scm b/guix/store.scm index 752da98e37..683f071a83 100644 --- a/guix/store.scm +++ b/guix/store.scm @@ -411,6 +411,11 @@ (define (connect-to-daemon uri) "Connect to the daemon at URI, a string that may be an actual URI or a file name." + (define (not-supported) + (raise (condition (&nix-connection-error + (file uri) + (errno ENOTSUP))))) + (define connect (match (string->uri uri) (#f ;URI is a file name @@ -428,10 +433,21 @@ name." (errno EBADR))))) ;bah! (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 - (raise (condition (&nix-connection-error - (file (uri->string uri)) - (errno ENOTSUP))))))))) + (not-supported)))))) (connect uri)) diff --git a/guix/store/ssh.scm b/guix/store/ssh.scm new file mode 100644 index 0000000000..09c0832505 --- /dev/null +++ b/guix/store/ssh.scm @@ -0,0 +1,39 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2017 Ludovic Courtès +;;; +;;; 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 . + +(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