Răsfoiți Sursa

handle SUDO_USER

Tobias Simetsreiter 4 ani în urmă
părinte
comite
22c1c1ef25
1 a modificat fișierele cu 27 adăugiri și 11 ștergeri
  1. 27 11
      overlaycached

+ 27 - 11
overlaycached

@@ -6,11 +6,15 @@ overlaycached(){
     MOVE=false
     SSHFS=""
     DEPTH=1
+    WRITE_THROUGH=false
     while getopts ":dmS:D:-" opt; do
         case $opt in
             d )
                 DEBUG=true
               ;;
+            w )
+                WRITE_THROUGH=true
+              ;;
             m )
                 MOVE=true
               ;;
@@ -30,6 +34,7 @@ Usage: <sharxz> [-d] [ -D DEPTH ] [-m | -S SSHFS | LOWER_DIR ] [ UPPER_DIR ] [ M
 -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
 -- stop parsing and pass remaining arguments
 
 USAGEEOF
@@ -53,17 +58,19 @@ USAGEEOF
     CLEANUP_DIRS=(
         "$WORK_DIR"
     )
+    SSHFS_CMD="sshfs"
     if $MOVE; then
         LOWER_DIR="$(mktemp -d)"
-        CLEANUP_DIRS+=( "$LOWER_DIR" )
         set -x
         mount --move "$MOUNT_DIR" "$LOWER_DIR"
         set +x
     elif [ ! -z "$SSHFS" ]; then
         LOWER_DIR="$(mktemp -d)"
-        CLEANUP_DIRS+=( "$LOWER_DIR" )
+        SSHFS_OPTS="-oauto_cache,reconnect,no_readahead,idmap=user"
+        [ ! -z "$SUDO_USER" ] && SSHFS_CMD="sudo -u $SUDO_USER $SSHFS_CMD"
+        [ ! -z "$SUDO_USER" ] && chmod ogu+rwx "$LOWER_DIR"
         set -x
-        sshfs "$SSHFS" "$LOWER_DIR"
+        $SSHFS_CMD "$SSHFS" "$LOWER_DIR" "${SSHFS_OPTS}"
         set +x
     fi
     show_workdir_contents
@@ -72,29 +79,38 @@ USAGEEOF
     set -x
     mount -t overlay -o lowerdir="$LOWER_DIR",upperdir="$UPPER_DIR",workdir="$WORK_DIR" overlay "$MOUNT_DIR"
     set +x
-    inotify_cmd $MOUNT_DIR |while read DIR EVT FILE;
+    inotify_cmd "$MOUNT_DIR" |while read DIR EVT FILE;
     do 
         echo "$DIR $EVT $FILE"
         [[ "$EVT" =~ "ISDIR" ]] && continue
-        RELPATH="$(realpath --relative-to=$MOUNT_DIR $DIR)/$FILE"
-        [ ! -f "$UPPER_DIR/$RELPATH" ] && {
-            mkdir -p "$(dirname $UPPER_DIR/$RELPATH)"
-            cp -a "$LOWER_DIR/$RELPATH" "$UPPER_DIR/$RELPATH"
-            sync && mount -o remount "$MOUNT_DIR"
+        RELPATH="$(realpath --relative-to="$MOUNT_DIR" "$DIR")/$FILE"
+        [ -f "$UPPER_DIR/$RELPATH" ] || {
+            echo cat "$LOWER_DIR/$RELPATH" ">" "$MOUNT_DIR/$RELPATH"
+            cat "$LOWER_DIR/$RELPATH" > "$MOUNT_DIR/$RELPATH"
+        }
+        $WRITE_THROUGH && [ ! -f "$LOWER_DIR/$RELPATH" ] && {
+            echo cat "$UPPER_DIR/$RELPATH" ">" "$LOWER_DIR/$RELPATH"
+            cat "$UPPER_DIR/$RELPATH" > "$LOWER_DIR/$RELPATH"
         }
     done
 }
+
 cleanup(){
-    umount "$MOUNT_DIR" 2> /dev/null
+    echo "Cleaning up mount points...."
+    umount "$MOUNT_DIR" # 2> /dev/null
     if $MOVE; then
         mount --move "$LOWER_DIR" "$MOUNT_DIR"
+        rmdir "$LOWER_DIR"
     fi
     if [ -z "$SSHFS" ]; then
-        umount "$LOWER_DIR" 2> /dev/null
+        umount "$LOWER_DIR" # 2> /dev/null
+        rmdir "$LOWER_DIR"
     fi
+    set -x
     for DIR in ${CLEANUP_DIRS[@]}; do
         rm -rf "$DIR"
     done
+    set +x
 }
 show_workdir_contents(){
     (cd $WORK_DIR;pwd; ls -alsh)