#!/bin/sh -e

. /usr/lib/bilibop/common.sh

ROOTFSPART="$(underlying_device_from_file /)"
if [ ! -b "${ROOTFSPART}" ]; then
    echo "${AUTOPKGTEST_REBOOT_MARK}: ROOTFSPART (${ROOTFSPART}) is not a block device." >&2
    exit 80
fi

ROOTFSREAL="$(findmnt --noheadings --output=target ${ROOTFSPART})"
if [ ! -d "${ROOTFSREAL}" ]; then
    echo "${AUTOPKGTEST_REBOOT_MARK}: ROOTFSREAL (${ROOTFSREAL}) is not a directory." >&2
    exit 81
fi


display_command_and_run_it() {
    echo "# ${@}"
    eval "${@}"
    echo
}

# This will allow humans to compare locked/unlocked states.
display_command_and_run_it "grep -E ' / |overlay|lockfs|aufs' /proc/mounts"
display_command_and_run_it "lsblk --output=name,ro,mountpoint"
display_command_and_run_it "df --output=source,fstype,target"


case "${AUTOPKGTEST_REBOOT_MARK}" in
    "")
        if [ "${ROOTFSREAL}" = "/" ]; then
            echo "STAGE 0: root filesystem is not locked."
            echo "STAGE 0: enable bilibop-lockfs and reboot."
            echo
            display_command_and_run_it "echo BILIBOP_LOCKFS='true' | tee /etc/bilibop/bilibop.conf"
            display_command_and_run_it "sync"
            /tmp/autopkgtest-reboot lockfs
        else
            echo "STAGE 0: unexpected error" >&2
            exit 90
        fi
        ;;

    lockfs)
        if [ "${ROOTFSREAL}" = "/" ]; then
            echo "STAGE 1: root filesystem is not locked." >&2
            exit 11
        fi
        if [ $(blockdev --getro ${ROOTFSPART}) -eq 1 ] &&
            [ "${ROOTFSREAL}" = "/overlay/ro" -o "${ROOTFSREAL}" = "/aufs/ro" ]; then
            echo "STAGE 1: root filesystem is successfully locked with hard policy."
            echo "STAGE 1: change lockfs settings and reboot."
            echo
            display_command_and_run_it "blockdev -v --setrw ${ROOTFSPART}"
            display_command_and_run_it "mount -v -o remount,rw ${ROOTFSREAL}"
            display_command_and_run_it "echo BILIBOP_LOCKFS_PATH_PREFIX='.lockfs' | tee -a ${ROOTFSREAL}/etc/bilibop/bilibop.conf"
            display_command_and_run_it "echo BILIBOP_LOCKFS_POLICY='soft' | tee -a ${ROOTFSREAL}/etc/bilibop/bilibop.conf"
            display_command_and_run_it "sync"
            display_command_and_run_it "mount -v -o remount,ro ${ROOTFSREAL}"
            display_command_and_run_it "blockdev -v --setro ${ROOTFSPART}"
            /tmp/autopkgtest-reboot relockfs
        else
            echo "STAGE 1: unexpected error" >&2
            exit 91
        fi
        ;;

    relockfs)
        if [ "${ROOTFSREAL}" = "/" ]; then
            echo "STAGE 2: root filesystem is not locked." >&2
            exit 12
        fi
        if [ $(blockdev --getro ${ROOTFSPART}) -eq 0 ] && [ "${ROOTFSREAL}" = "/.lockfs/ro" ]; then
            echo "STAGE 2: root filesystem is successfully locked with soft policy."
            echo "STAGE 2: disable bilibop-lockfs and reboot."
            echo
            display_command_and_run_it "mount -v -o remount,rw ${ROOTFSREAL}"
            display_command_and_run_it "echo BILIBOP_LOCKFS='false' | tee ${ROOTFSREAL}/etc/bilibop/bilibop.conf"
            display_command_and_run_it "sync"
            display_command_and_run_it "mount -v -o remount,ro ${ROOTFSREAL}"
            /tmp/autopkgtest-reboot nolockfs
        else
            echo "STAGE 2: unexpected error" >&2
            exit 92
        fi
        ;;

    nolockfs)
        if [ "${ROOTFSREAL}" = "/" ]; then
            echo "STAGE 3: root filesystem is successfully unlocked."
            echo "STAGE 3: end of test."
            exit 0
        else
            echo "STAGE 3: root filesystem is still locked." >&2
            exit 13
        fi
        ;;

    *)
        echo "unsupported value (AUTOPKGTEST_REBOOT_MARK='${AUTOPKGTEST_REBOOT_MARK}')" >&2
        exit 100
        ;;
esac
