#!/bin/bash

set -u

LOG="${LOG:-/dev/null}"
UMOUNT_WAIT_RETRIES="${UMOUNT_WAIT_RETRIES:-5}"
UMOUNT_WAIT_DELAY="${UMOUNT_WAIT_DELAY:-1}"
FUSE_OVERLAYFS_BIN="${FUSE_OVERLAYFS_BIN:-/usr/bin/fuse-overlayfs}"

if [[ -x /usr/bin/squashfuse_ll ]]; then
    SQUASHFUSE_BIN="${SQUASHFUSE_BIN:-/usr/bin/squashfuse_ll}"
else
    SQUASHFUSE_BIN="${SQUASHFUSE_BIN:-/usr/bin/squashfuse}"
fi

if [[ "${1:-}" == "wait" ]]; then
    inotifywait -e delete "$2/etc"

    for i in $(seq "${UMOUNT_WAIT_RETRIES}"); do
        umount -v "$3" >> "${LOG}" 2>&1
        if [[ $? -ne 0 ]]; then
            echo "Retry umount after sleep ${UMOUNT_WAIT_DELAY} second(s)" >> "${LOG}"
            sleep "${UMOUNT_WAIT_DELAY}"
        else
            break
        fi
    done
    exit 0
fi

args="$*"
lowerdir_path="$(echo "${args}" | sed 's/,upperdir.*//' | sed 's/.*lowerdir=//' | sed 's/.*://')"
echo "In fow ${lowerdir_path}.squash" >> "${LOG}"
if [[ -e "${lowerdir_path}.squash" ]]; then
    echo "Mount squash ${lowerdir_path} with ${SQUASHFUSE_BIN}" >> "${LOG}"
    "${SQUASHFUSE_BIN}" "${lowerdir_path}.squash" "${lowerdir_path}" >> "${LOG}" 2>&1
fi

"${FUSE_OVERLAYFS_BIN}" "$@" >> "${LOG}" 2>&1
ret=$?
mount_dir="$(echo "${args}" | sed 's/.* //')"
chmod a+rx "${mount_dir}"
echo "${mount_dir}" >> "${LOG}"
ls -ld "${mount_dir}" >> "${LOG}"

if [[ -e "${lowerdir_path}.squash" ]]; then
    "$0" wait "${mount_dir}" "${lowerdir_path}" 0<&- &>/dev/null &
fi

exit "${ret}"
