Tobias Simetsreiter 4 lat temu
rodzic
commit
9864d71890
1 zmienionych plików z 29 dodań i 22 usunięć
  1. 29 22
      overlaycached

+ 29 - 22
overlaycached

@@ -8,7 +8,7 @@ overlaycached(){
     DEPTH=2
     WRITE_THROUGH=false
     SSHFS_CMD="sshfs"
-    while getopts ":dmS:D:-" opt; do
+    while getopts ":dwmS:D:-" opt; do
         case $opt in
             d )
                 DEBUG=true
@@ -30,12 +30,16 @@ overlaycached(){
               ;;
             \? ) cat 1>&2 <<'USAGEEOF'
 
-Usage: <sharxz> [-d] [ -D DEPTH ] [-m | -S SSHFS | LOWER_DIR ] [ UPPER_DIR ] [ MOUNT_DIR ]
+Usage: 
+overlaycached [-dw] [ -D DEPTH ] LOWER_DIR UPPER_DIR MOUNT_DIR
+overlaycached [-dw] [ -D DEPTH ] -S SSHFS UPPER_DIR MOUNT_DIR
+overlaycached [-dw] [ -D DEPTH ] -m LOWER_DIR MOUNT_DIR
+overlaycached [-dw] [ -D DEPTH ] -mS SSHFS MOUNT_DIR
 -d DEBUG
--D DEPTH=1 depth of inotify directory watches
--S SSHFS mount sshfs for LOWER_DIR
 -m MOVE move MOUNT_DIR to another mount point and mount overlay
 -w Write through missing files to lowerdir
+-D DEPTH=1 depth of inotify directory watches
+-S SSHFS mount sshfs for LOWER_DIR
 -- stop parsing and pass remaining arguments
 
 USAGEEOF
@@ -48,24 +52,27 @@ USAGEEOF
         esac
     done
     shift $((OPTIND -1))
-
-    $MOVE ||
-        [ -z "$SSHFS" ] &&
-            LOWER_DIR="$1" && shift 1
-    UPPER_DIR="$1"
-    MOUNT_DIR="$2"
-    WORK_DIR="$(realpath "$UPPER_DIR").work"
+    [ -z "$SSHFS" ] && LOWER_DIR="$1" && shift 1
+    $MOVE || { UPPER_DIR="$1" && shift 1; }
+    MOUNT_DIR="$1"
+    trap cleanup EXIT
+    if $MOVE; then
+        UPPER_DIR="$(realpath "$MOUNT_DIR").upper"
+        WORK_DIR="$(realpath "$MOUNT_DIR").work"
+        set -x
+        mv "$MOUNT_DIR" "$UPPER_DIR"
+        mkdir -p "$MOUNT_DIR"
+        set +x
+    else
+        WORK_DIR="$(realpath "$UPPER_DIR").work"
+    fi
     mkdir -p "$WORK_DIR"
     CLEANUP_DIRS=(
         "$WORK_DIR"
     )
-    if $MOVE; then
-        LOWER_DIR="$(mktemp -d)"
-        set -x
-        mount --move "$MOUNT_DIR" "$LOWER_DIR"
-        set +x
-    elif [ ! -z "$SSHFS" ]; then
-        LOWER_DIR="$(mktemp -d)"
+    if [ ! -z "$SSHFS" ]; then
+        LOWER_DIR="$(realpath "$MOUNT_DIR").sshfs"
+        mkdir -p "$LOWER_DIR"
         SSHFS_OPTS="-oauto_cache,reconnect,no_readahead,allow_other"
 #         if [ ! -z "$SUDO_USER" ]; then
 #             SSHFS_CMD="sudo -u $SUDO_USER $SSHFS_CMD"
@@ -78,7 +85,6 @@ USAGEEOF
     fi
     show_workdir_contents
 
-    trap cleanup EXIT
     set -x
     mount -t overlay -o lowerdir="$LOWER_DIR",upperdir="$UPPER_DIR",workdir="$WORK_DIR" overlay "$MOUNT_DIR"
     set +x
@@ -90,7 +96,7 @@ USAGEEOF
 
         [[ "$EVT" =~ "CLOSE_NOWRITE" ]] && [ ! -f "$UPPER_DIR/$RELPATH" ] && {
             echo touch "$MOUNT_DIR/$RELPATH"
-            touch -c "$MOUNT_DIR/$RELPATH"
+            cat "$LOWER_DIR/$RELPATH" > "$MOUNT_DIR/$RELPATH"
             touch -c -r "$LOWER_DIR/$RELPATH" "$MOUNT_DIR/$RELPATH"
         }
 
@@ -103,12 +109,13 @@ USAGEEOF
 
 cleanup(){
     echo "Cleaning up mount points...."
+    set +e
     set -x
     umount "$MOUNT_DIR" # 2> /dev/null
     sync
     if $MOVE; then
-        mount --move "$LOWER_DIR" "$MOUNT_DIR"
-        rmdir "$LOWER_DIR"
+        rmdir "$MOUNT_DIR"
+        mv "$UPPER_DIR" "$MOUNT_DIR"
     fi
     if [ ! -z "$SSHFS" ]; then
         umount "$LOWER_DIR" # 2> /dev/null