guix-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

03/04: store: Add support for remote connections via 'guix://' URIs.


From: Ludovic Courtès
Subject: 03/04: store: Add support for remote connections via 'guix://' URIs.
Date: Fri, 21 Apr 2017 11:24:29 -0400 (EDT)

civodul pushed a commit to branch master
in repository guix.

commit 3dff90ce34448551bc82a6a7262837c0561a4691
Author: Ludovic Courtès <address@hidden>
Date:   Fri Apr 21 14:57:02 2017 +0200

    store: Add support for remote connections via 'guix://' URIs.
    
    * guix/store.scm (open-inet-socket): New procedure.
    (connect-to-daemon): Support the 'guix' URI scheme.
    * doc/guix.texi (The Store): Document it.
---
 doc/guix.texi  | 13 +++++++++++++
 guix/store.scm | 41 +++++++++++++++++++++++++++++++++++++++++
 2 files changed, 54 insertions(+)

diff --git a/doc/guix.texi b/doc/guix.texi
index 5f973e2..8f64647 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -3683,6 +3683,19 @@ supported URI schemes are:
 These are for Unix-domain sockets.
 @code{file:///var/guix/daemon-socket/socket} is equivalent to
 @file{/var/guix/daemon-socket/socket}.
+
address@hidden guix
+These URIs denote connections over TCP/IP, without encryption nor
+authentication of the remote host.  The URI must always specify both the
+host name and port number:
+
address@hidden
+guix://master.guix.example.org:1234
address@hidden example
+
+This setup is suitable on local networks, such as clusters, where only
+trusted nodes may connect to the build daemon at
address@hidden
 @end table
 
 Additional URI schemes may be supported in the future.
diff --git a/guix/store.scm b/guix/store.scm
index 9eac220..752da98 100644
--- a/guix/store.scm
+++ b/guix/store.scm
@@ -375,6 +375,39 @@
       (connect s a)
       s)))
 
+(define (open-inet-socket host port)
+  "Connect to the Unix-domain socket at HOST:PORT and return it.  Raise a
+'&nix-connection-error' upon error."
+  (let ((sock (with-fluids ((%default-port-encoding #f))
+                ;; This trick allows use of the `scm_c_read' optimization.
+                (socket PF_UNIX SOCK_STREAM 0))))
+    (define addresses
+      (getaddrinfo host
+                   (if (number? port) (number->string port) port)
+                   (if (number? port)
+                       (logior AI_ADDRCONFIG AI_NUMERICSERV)
+                       AI_ADDRCONFIG)))
+
+    (let loop ((addresses addresses))
+      (match addresses
+        ((ai rest ...)
+         (let ((s (socket (addrinfo:fam ai)
+                          ;; TCP/IP only
+                          SOCK_STREAM IPPROTO_IP)))
+
+           (catch 'system-error
+             (lambda ()
+               (connect s (addrinfo:addr ai))
+               s)
+             (lambda args
+               ;; Connection failed, so try one of the other addresses.
+               (close s)
+               (if (null? rest)
+                   (raise (condition (&nix-connection-error
+                                      (file host)
+                                      (errno (system-error-errno args)))))
+                   (loop rest))))))))))
+
 (define (connect-to-daemon uri)
   "Connect to the daemon at URI, a string that may be an actual URI or a file
 name."
@@ -387,6 +420,14 @@ name."
          ((or #f 'file 'unix)
           (lambda (_)
             (open-unix-domain-socket (uri-path uri))))
+         ('guix
+          (lambda (_)
+            (unless (uri-port uri)
+              (raise (condition (&nix-connection-error
+                                 (file (uri->string uri))
+                                 (errno EBADR))))) ;bah!
+
+            (open-inet-socket (uri-host uri) (uri-port uri))))
          (x
           (raise (condition (&nix-connection-error
                              (file (uri->string uri))



reply via email to

[Prev in Thread] Current Thread [Next in Thread]