all messages for Guix-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
blob 1aa52e69dd7d548801eecaaa2a197d31667151b2 4707 bytes (raw)
name: guix/eris.scm 	 # note: path name is non-authoritative(*)

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
 
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2022 pukkamustard <pukkamustard@posteo.net>
;;;
;;; 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 eris)

  #:use-module (eris)
  #:use-module (eris fs)
  #:use-module (eris sqlite)
  #:use-module (sqlite3)
  #:use-module (eris coap)
  #:use-module (eris read-capability)

  #:use-module (coap tcp)

  #:use-module (web uri)
  #:use-module (ice-9 match)
  #:use-module (srfi srfi-171)

  #:export (%eris-store-url
            eris-encode-store-item
            eris-decode-store-item))

(define %eris-store-url
  (make-parameter
   (getenv "ERIS_STORE_URL")
   (lambda (val)
     (cond
      ((uri? val) val)
      ((string? val) (string->uri val))
      (else #f)))))

(define %guix-eris-convergence-secret
  (make-parameter %null-convergence-secret))

(define (open-coap-unix-socket path)
  (let ((sock (socket PF_UNIX SOCK_STREAM 0)))
    ;; Release FD on exec
    (fcntl sock F_SETFD FD_CLOEXEC)
    ;; Set to non-blocking
    (fcntl sock F_SETFL (logior O_NONBLOCK (fcntl sock F_GETFL)))
    ;; Connect
    (connect sock AF_UNIX path)

    ;; Initialize the CoAP connection
    (open-socket-for-uri #f
                         #:socket sock
                         ;; Allow up to 64 in-flight requests
                         #:nstart 64)))

(define (guix-eris-block-reducer)
  "Returns an ERIS block reducer."
  (let ((store-url (%eris-store-url)))
    (if (uri? store-url)
        (match (uri-scheme store-url)

          ;; Store blocks in an SQLite database (see
          ;; https://eris.codeberg.page/eer/sqlite.xml)
          ('sqlite
           (eris-sqlite-block-reducer (uri-path store-url)))

          ;; Connect to a CoAP ERIS store over a Unix socket
          ('coap+unix
           ;; Wrap the eris-coap-block-reducer to close the provided connection.
           (let ((ecbr (eris-coap-block-reducer
                      (build-uri 'coap #:path ".well-known/eris")
                      #:nstart 64
                      #:connection (open-coap-unix-socket
                                    (uri-path store-url)))))
             (case-lambda
               (() (ecbr))
               ((conn ref-block) (ecbr conn ref-block))
               ((conn)
                (ecbr conn)))))

          ;; TODO
          ;; ('coap+tcp #f)

          (_ (error "Don't know how to handle ERIS store URL "
                    (uri->string (%eris-store-url)))))

        ;; If no ERIS store URL is provided we just compute the ERIS URN without
        ;; storing the blocks anywhere. As dummy block-reducer we use `rcount` from
        ;; SRFI-171 that counts the number of blocks.
        rcount)))

(define (call-with-guix-eris-block-ref proc)
  (let ((store-url (%eris-store-url)))
    (if (uri? store-url)
        (match (uri-scheme store-url)

          ('sqlite
           (let ((db (eris-sqlite-open (uri-path store-url))))
             (proc (lambda (ref) (eris-sqlite-ref db ref)))
             (sqlite-close db)))

          ('coap+unix
           (let ((conn (open-coap-unix-socket (uri-path store-url)))
                 (req-uri (build-uri 'coap #:path ".well-known/eris")))
             (proc
              (lambda (ref)
                (eris-coap-block-ref req-uri ref #:connection conn)))
             (close-port conn)))

          (_ (error "Don't know how to handle ERIS store URL "
                    (uri->string (%eris-store-url)))))

        (error "No ERIS store to get blocks."))))

(define* (eris-encode-store-item item)
  "Encodes the store item ITEM using ERIS and returns the read capability as
string."
  (eris-fs-encode item
                  #:convergence-secret (%guix-eris-convergence-secret)
                  #:block-reducer (guix-eris-block-reducer)))

(define* (eris-decode-store-item eris-urn destination)
  "Decode a store item with read-capability ERIS-URN to DESTINATION."
  (call-with-guix-eris-block-ref
   (lambda (block-ref)
     (eris-fs-decode eris-urn destination
                     #:block-ref block-ref)
     #t)))

debug log:

solving 1aa52e69dd ...
found 1aa52e69dd in https://yhetil.org/guix/deebb9389ad0f32f9bcfb0d7ca6ed9cc04a980d2.1703316055.git.pukkamustard@posteo.net/
found 3fbedd0cb7 in https://yhetil.org/guix/cd7432fcc871296d8a14b902e65190669ef89d62.1703316055.git.pukkamustard@posteo.net/
found d98a9a62bd in https://yhetil.org/guix/000b47eb98b4f22a24f246cc12bb405c65efdf57.1703316055.git.pukkamustard@posteo.net/

applying [1/3] https://yhetil.org/guix/000b47eb98b4f22a24f246cc12bb405c65efdf57.1703316055.git.pukkamustard@posteo.net/
diff --git a/guix/eris.scm b/guix/eris.scm
new file mode 100644
index 0000000000..d98a9a62bd


applying [2/3] https://yhetil.org/guix/cd7432fcc871296d8a14b902e65190669ef89d62.1703316055.git.pukkamustard@posteo.net/
diff --git a/guix/eris.scm b/guix/eris.scm
index d98a9a62bd..3fbedd0cb7 100644


applying [3/3] https://yhetil.org/guix/deebb9389ad0f32f9bcfb0d7ca6ed9cc04a980d2.1703316055.git.pukkamustard@posteo.net/
diff --git a/guix/eris.scm b/guix/eris.scm
index 3fbedd0cb7..1aa52e69dd 100644

Checking patch guix/eris.scm...
Applied patch guix/eris.scm cleanly.
Checking patch guix/eris.scm...
Applied patch guix/eris.scm cleanly.
Checking patch guix/eris.scm...
Applied patch guix/eris.scm cleanly.

index at:
100644 1aa52e69dd7d548801eecaaa2a197d31667151b2	guix/eris.scm

(*) Git path names are given by the tree(s) the blob belongs to.
    Blobs themselves have no identifier aside from the hash of its contents.^

Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/guix.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.