#!/bin/sh

set -e

VOLUME_SNAP=0
if [ "x$1" = "xvol" ]
then
	VOLUME_SNAP=1
elif [ "x$1" != "xfs" ]
then
    echo "First parameter must be either 'fs' or 'vol'"
    exit 1
fi
shift

SNAP_ID=$1
SNAP_MOUNTPOINT="$2"
SNAP_ORIG_PATH="$5"

CDIR=`dirname $0`

remove_overlay() {
	if test -e "$SNAP_ORIG_PATH/.overlay_2fefd007-3e48-4162-b2c6-45ccdda22f37_$SNAP_ID"
	then
		chattr -i "$SNAP_ORIG_PATH/.overlay_2fefd007-3e48-4162-b2c6-45ccdda22f37_$SNAP_ID"
		rm "$SNAP_ORIG_PATH/.overlay_2fefd007-3e48-4162-b2c6-45ccdda22f37_$SNAP_ID"
	fi
	
	if test -e "$SNAP_ORIG_PATH/.overlay_2fefd007-3e48-4162-b2c6-45ccdda22f37_$SNAP_ID-wsnap"
	then
		LODEV=`losetup -j "$SNAP_ORIG_PATH/.overlay_2fefd007-3e48-4162-b2c6-45ccdda22f37_$SNAP_ID-wsnap" | cut -d':' -f1`
        if [ "x$LODEV" != x ]
        then
            losetup -d "$LODEV"
        fi
		rm "$SNAP_ORIG_PATH/.overlay_2fefd007-3e48-4162-b2c6-45ccdda22f37_$SNAP_ID-wsnap"
	fi
}

remove_dm() {
    if ! [ -e "${SNAP_MOUNTPOINT}-name" ]
    then
        if [ $VOLUME_SNAP = 1 ]
        then
            TYPE=$(df -T -P | egrep " ${SNAP_MOUNTPOINT}\$" | head -n 1 | tr -s " " | cut -d" " -f2)
            if [ "x$TYPE" = "xvfat" ]
            then
                echo "Snapshot is an vfat partition and no name found. No dm nodes to remove"
                return 0
            fi
        fi

        echo "Could not find snapshot device name at ${SNAP_MOUNTPOINT}-name. Cannot remove dm nodes"
        return 1
    fi

    DEVNAME=$(cat "${SNAP_MOUNTPOINT}-name")

    if [ "x$DEVNAME" = "xvfat" ]
    then
        echo "Snapshot is an vfat partition. No dm nodes to remove"
        rm "${SNAP_MOUNTPOINT}-name" || true
        rm "${SNAP_MOUNTPOINT}-dev" || true
        return 0
    fi

    echo "Removing dm snapshot..."

    dmsetup remove "$DEVNAME-$SNAP_ID-wsnap" || true
    dmsetup remove "$DEVNAME-$SNAP_ID" || true

    echo "Removing snapshot cow storage..."
    dmsetup remove "$DEVNAME-$SNAP_ID-cow-storage" || true

    rm "${SNAP_MOUNTPOINT}-name"
    rm "${SNAP_MOUNTPOINT}-dev"
    rmdir "${SNAP_MOUNTPOINT}"
}

if ! test -e $SNAP_MOUNTPOINT
then
    echo "Snapshot at $SNAP_MOUNTPOINT was already removed"
    remove_dm
    remove_overlay
    exit 0
fi

TYPE=$(df -T -P | egrep " ${SNAP_MOUNTPOINT}\$" | head -n 1 | tr -s " " | cut -d" " -f2)

if [ "x$TYPE" = "x" ]
then
    if [ $VOLUME_SNAP = 1 ]
    then
        echo "Removing volume snapshot $SNAP_MOUNTPOINT..."
        remove_dm
        remove_overlay
        exit 0
    fi

    if btrfs subvolume list -o "$SNAP_MOUNTPOINT" > /dev/null 2>&1
    then
            TYPE="btrfs"
    fi
fi

if [ "x$TYPE" = "xbtrfs" ] && [ $VOLUME_SNAP = 0 ]
then
    $CDIR/btrfs_remove_filesystem_snapshot "$@"
    exit $?
fi

if ! df -T -P | egrep " ${SNAP_MOUNTPOINT}\$" > /dev/null 2>&1
then
    echo "Snapshot is not mounted. Already removed"
    remove_dm
    remove_overlay
    exit 0
fi

if [ "x$TYPE" = "xvfat" ]
then
	mount -o remount,rw "$SNAP_MOUNTPOINT"
	remove_dm
    remove_overlay
	exit 0
fi

if ! [ -e "${SNAP_MOUNTPOINT}-name" ]
then
	echo "Could not find snapshot device name at ${SNAP_MOUNTPOINT}-name"
	exit 1
fi

DEVNAME=$(cat "${SNAP_MOUNTPOINT}-name")

echo "Unmounting /dev/mapper/$DEVNAME-$SNAP_ID at /mnt/urbackup_snaps/$SNAP_ID..."

if ! umount /mnt/urbackup_snaps/$SNAP_ID
then
    lsof | grep /mnt/urbackup_snaps/$SNAP_ID || true
    echo "Unmounting /mnt/urbackup_snaps/$SNAP_ID failed. Retrying in 10s..."
    sleep 10
    umount /mnt/urbackup_snaps/$SNAP_ID
fi

remove_dm
remove_overlay
exit 0
