From 285f63e805f4a895c1d301efe6d40e93c4e2f704 Mon Sep 17 00:00:00 2001 From: Ludovic Courtès Date: Fri, 21 Apr 2017 19:13:32 +0200 Subject: 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. --- guix/store.scm | 22 +++++++++++++++++++--- guix/store/ssh.scm | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+), 3 deletions(-) create mode 100644 guix/store/ssh.scm (limited to 'guix') 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 addresses (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 @@ (define connect (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 -- cgit v1.2.3