Browse Source

generate encfs password & config; encfs reverse mount

Fabian Peter Hammerle 5 years ago
commit
544c08f87e
2 changed files with 66 additions and 0 deletions
  1. 20 0
      Dockerfile
  2. 46 0
      mount.sh

+ 20 - 0
Dockerfile

@@ -0,0 +1,20 @@
+FROM alpine:3.9
+
+RUN apk add --no-cache encfs
+
+ENV ENCFS_PASSWORD_CHARSET="1-9a-km-zA-HJKLMNPR-Z*+!&#@%.\-_" \
+    ENCFS_PASSWORD_LENGTH=32 \
+    ENCFS_PASSWORD_PATH=/source/secret/password \
+    ENCFS_SOURCE_DIR=/source/plain \
+    ENCFS_MOUNT_POINT=/target/encfs \
+    ENCFS_CONFIG_PATH=/target/config/encfs6.xml \
+    ENCFS_CONFIG_GENERATION_TIMEOUT_SECS=8
+
+COPY ./mount.sh /
+RUN mkdir -p \
+        $(dirname $ENCFS_PASSWORD_PATH) \
+        $ENCFS_SOURCE_DIR \
+        $ENCFS_MOUNT_POINT \
+        $(dirname $ENCFS_CONFIG_PATH) \
+    && chmod +x /mount.sh
+CMD ["/mount.sh"]

+ 46 - 0
mount.sh

@@ -0,0 +1,46 @@
+#!/bin/sh
+set -e
+
+if [ ! -f "$ENCFS_PASSWORD_PATH" ]; then
+    echo generating encfs password
+    (set -x;
+     tr -dc "$ENCFS_PASSWORD_CHARSET" < /dev/random | head -c "$ENCFS_PASSWORD_LENGTH" > "$ENCFS_PASSWORD_PATH")
+    [ -f "$ENCFS_CONFIG_PATH" ] && (set -x; rm "$ENCFS_CONFIG_PATH")
+fi
+
+function mount_encfs {
+    (set -x
+     encfs --reverse "$@" \
+        --extpass="cat \"$ENCFS_PASSWORD_PATH\"" \
+        "$ENCFS_SOURCE_DIR" "$ENCFS_MOUNT_POINT")
+}
+
+if [ ! -f "$ENCFS_CONFIG_PATH" ]; then
+    # ERROR fatal: config file specified by environment does not exist: /target/config/encfs6.xml [FileUtils.cpp:246]
+    # https://github.com/vgough/encfs/issues/497
+    echo generating encfs config
+    ENCFS_DEFAULT_CONFIG_PATH="$ENCFS_SOURCE_DIR/.encfs6.xml"
+    if [ -f "$ENCFS_DEFAULT_CONFIG_PATH" ]; then
+        echo conflicting encfs config in $ENCFS_DEFAULT_CONFIG_PATH
+        exit 1
+    fi
+    mount_encfs --standard
+    while [ ! -f "$ENCFS_DEFAULT_CONFIG_PATH" ]; do
+        sleep 1
+        echo waiting for encfs config
+    done
+    if [ -f "$ENCFS_DEFAULT_CONFIG_PATH" ]; then
+        umount "$ENCFS_MOUNT_POINT"
+        while mountpoint -q "$ENCFS_MOUNT_POINT"; do
+            echo waiting for unmount
+            sleep 1
+        done
+        (set -x; mv "$ENCFS_DEFAULT_CONFIG_PATH" "$ENCFS_CONFIG_PATH")
+    else
+        echo failed to generate encfs config
+        exit 1
+    fi
+fi
+
+export ENCFS6_CONFIG="$ENCFS_CONFIG_PATH"
+mount_encfs -f