summary refs log tree commit diff
path: root/gnu/system
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/system')
-rw-r--r--gnu/system/mapped-devices.scm29
1 files changed, 28 insertions, 1 deletions
diff --git a/gnu/system/mapped-devices.scm b/gnu/system/mapped-devices.scm
index 81afb91f86..dd8e432688 100644
--- a/gnu/system/mapped-devices.scm
+++ b/gnu/system/mapped-devices.scm
@@ -17,7 +17,9 @@
 ;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
 
 (define-module (gnu system mapped-devices)
+  #:use-module (guix gexp)
   #:use-module (guix records)
+  #:autoload   (gnu packages cryptsetup) (cryptsetup)
   #:export (mapped-device
             mapped-device?
             mapped-device-source
@@ -27,7 +29,9 @@
             mapped-device-kind
             mapped-device-kind?
             mapped-device-kind-open
-            mapped-device-kind-close))
+            mapped-device-kind-close
+
+            luks-device-mapping))
 
 ;;; Commentary:
 ;;;
@@ -50,4 +54,27 @@
   (close     mapped-device-kind-close             ;source target -> gexp
              (default (const #~(const #f)))))
 
+
+;;;
+;;; Common device mappings.
+;;;
+
+(define (open-luks-device source target)
+  "Return a gexp that maps SOURCE to TARGET as a LUKS device, using
+'cryptsetup'."
+  #~(zero? (system* (string-append #$cryptsetup "/sbin/cryptsetup")
+                    "open" "--type" "luks"
+                    #$source #$target)))
+
+(define (close-luks-device source target)
+  "Return a gexp that closes TARGET, a LUKS device."
+  #~(zero? (system* (string-append #$cryptsetup "/sbin/cryptsetup")
+                    "close" #$target)))
+
+(define luks-device-mapping
+  ;; The type of LUKS mapped devices.
+  (mapped-device-kind
+   (open open-luks-device)
+   (close close-luks-device)))
+
 ;;; mapped-devices.scm ends here