|
@@ -6,11 +6,15 @@ overlaycached(){
|
|
|
MOVE=false
|
|
MOVE=false
|
|
|
SSHFS=""
|
|
SSHFS=""
|
|
|
DEPTH=1
|
|
DEPTH=1
|
|
|
|
|
+ WRITE_THROUGH=false
|
|
|
while getopts ":dmS:D:-" opt; do
|
|
while getopts ":dmS:D:-" opt; do
|
|
|
case $opt in
|
|
case $opt in
|
|
|
d )
|
|
d )
|
|
|
DEBUG=true
|
|
DEBUG=true
|
|
|
;;
|
|
;;
|
|
|
|
|
+ w )
|
|
|
|
|
+ WRITE_THROUGH=true
|
|
|
|
|
+ ;;
|
|
|
m )
|
|
m )
|
|
|
MOVE=true
|
|
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
|
|
-D DEPTH=1 depth of inotify directory watches
|
|
|
-S SSHFS mount sshfs for LOWER_DIR
|
|
-S SSHFS mount sshfs for LOWER_DIR
|
|
|
-m MOVE move MOUNT_DIR to another mount point and mount overlay
|
|
-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
|
|
-- stop parsing and pass remaining arguments
|
|
|
|
|
|
|
|
USAGEEOF
|
|
USAGEEOF
|
|
@@ -53,17 +58,19 @@ USAGEEOF
|
|
|
CLEANUP_DIRS=(
|
|
CLEANUP_DIRS=(
|
|
|
"$WORK_DIR"
|
|
"$WORK_DIR"
|
|
|
)
|
|
)
|
|
|
|
|
+ SSHFS_CMD="sshfs"
|
|
|
if $MOVE; then
|
|
if $MOVE; then
|
|
|
LOWER_DIR="$(mktemp -d)"
|
|
LOWER_DIR="$(mktemp -d)"
|
|
|
- CLEANUP_DIRS+=( "$LOWER_DIR" )
|
|
|
|
|
set -x
|
|
set -x
|
|
|
mount --move "$MOUNT_DIR" "$LOWER_DIR"
|
|
mount --move "$MOUNT_DIR" "$LOWER_DIR"
|
|
|
set +x
|
|
set +x
|
|
|
elif [ ! -z "$SSHFS" ]; then
|
|
elif [ ! -z "$SSHFS" ]; then
|
|
|
LOWER_DIR="$(mktemp -d)"
|
|
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
|
|
set -x
|
|
|
- sshfs "$SSHFS" "$LOWER_DIR"
|
|
|
|
|
|
|
+ $SSHFS_CMD "$SSHFS" "$LOWER_DIR" "${SSHFS_OPTS}"
|
|
|
set +x
|
|
set +x
|
|
|
fi
|
|
fi
|
|
|
show_workdir_contents
|
|
show_workdir_contents
|
|
@@ -72,29 +79,38 @@ USAGEEOF
|
|
|
set -x
|
|
set -x
|
|
|
mount -t overlay -o lowerdir="$LOWER_DIR",upperdir="$UPPER_DIR",workdir="$WORK_DIR" overlay "$MOUNT_DIR"
|
|
mount -t overlay -o lowerdir="$LOWER_DIR",upperdir="$UPPER_DIR",workdir="$WORK_DIR" overlay "$MOUNT_DIR"
|
|
|
set +x
|
|
set +x
|
|
|
- inotify_cmd $MOUNT_DIR |while read DIR EVT FILE;
|
|
|
|
|
|
|
+ inotify_cmd "$MOUNT_DIR" |while read DIR EVT FILE;
|
|
|
do
|
|
do
|
|
|
echo "$DIR $EVT $FILE"
|
|
echo "$DIR $EVT $FILE"
|
|
|
[[ "$EVT" =~ "ISDIR" ]] && continue
|
|
[[ "$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
|
|
done
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
cleanup(){
|
|
cleanup(){
|
|
|
- umount "$MOUNT_DIR" 2> /dev/null
|
|
|
|
|
|
|
+ echo "Cleaning up mount points...."
|
|
|
|
|
+ umount "$MOUNT_DIR" # 2> /dev/null
|
|
|
if $MOVE; then
|
|
if $MOVE; then
|
|
|
mount --move "$LOWER_DIR" "$MOUNT_DIR"
|
|
mount --move "$LOWER_DIR" "$MOUNT_DIR"
|
|
|
|
|
+ rmdir "$LOWER_DIR"
|
|
|
fi
|
|
fi
|
|
|
if [ -z "$SSHFS" ]; then
|
|
if [ -z "$SSHFS" ]; then
|
|
|
- umount "$LOWER_DIR" 2> /dev/null
|
|
|
|
|
|
|
+ umount "$LOWER_DIR" # 2> /dev/null
|
|
|
|
|
+ rmdir "$LOWER_DIR"
|
|
|
fi
|
|
fi
|
|
|
|
|
+ set -x
|
|
|
for DIR in ${CLEANUP_DIRS[@]}; do
|
|
for DIR in ${CLEANUP_DIRS[@]}; do
|
|
|
rm -rf "$DIR"
|
|
rm -rf "$DIR"
|
|
|
done
|
|
done
|
|
|
|
|
+ set +x
|
|
|
}
|
|
}
|
|
|
show_workdir_contents(){
|
|
show_workdir_contents(){
|
|
|
(cd $WORK_DIR;pwd; ls -alsh)
|
|
(cd $WORK_DIR;pwd; ls -alsh)
|