#!/bin/bash

# DESCRIPTION:
#
# Open and mount dm_crypt container the easy way.


# USAGE:
#
# sesame open
#   or
# sesame close


# PREPARATIONS:
#
# cd
# dd if=/dev/urandom of=./secrets.dd bs=4096 count=65536
# sudo aptitude install cryptsetup
# sudo losetup /dev/loop0 ./secrets.dd
# sudo cryptsetup luksFormat /dev/loop0
# sudo cryptsetup luksOpen /dev/loop0 ./secrets
# sudo mkfs.ext4 -L secrets /dev/mapper/secrets
# mkdir secrets
# sudo mount /dev/mapper/secrets ./secrets
# sudo chown -R pi:pi ./secrets
# touch ./secrets/test
# sudo umount /dev/mapper/secrets
# sudo cryptsetup luksClose secrets
# sudo losetup -d /dev/loop0


readonly NAME="secrets"
readonly CONTAINER="/home/pi/${NAME}.dd"
readonly MOUNTPOINT="/home/pi/${NAME}"

case "${1}" in
  open)
    if [ ! -f "${CONTAINER}" ] ; then
      printf "ERROR: container file is missing - EXIT!\n"
      exit 1
    fi

    if ! losetup -a | grep -F "${CONTAINER}" > /dev/null 2>&1 ; then
      sudo losetup $( losetup -f ) "${CONTAINER}"
    else
      printf "NOTICE: the container has already been looped.\n"
    fi

    readonly LOOPDEVICE="$( losetup -a | grep -F "${CONTAINER}" | cut -d ":" -f 1 )"

    if ! sudo cryptsetup status "${NAME}" | grep -F "/dev/mapper/${NAME} is active" > /dev/null 2>&1 ; then
      sudo cryptsetup luksOpen "${LOOPDEVICE}" "${NAME}"
    else
      printf "NOTICE: ${CONTAINER} has already been opened.\n"
    fi

    if [ ! -d "${MOUNTPOINT}" ] ; then
      mkdir "${MOUNTPOINT}"
      printf "NOTICE: I have created the mountpoint for you.\n"
    fi

    if ! grep "/dev/mapper/${NAME}" /proc/mounts > /dev/null 2>&1 ; then
      sudo mount "/dev/mapper/${NAME}" "${NAME}"
    else
      printf "NOTICE: open container has already been mounted.\n"
    fi
    ;;
  close)
    if grep "/dev/mapper/${NAME}" /proc/mounts > /dev/null 2>&1 ; then
      sudo umount "/dev/mapper/${NAME}" 2> /dev/null
      if [ "${?}" -ne 0 ] ; then
        printf "ERROR: container could not be unmounted - EXIT!\n"
        exit 1
      fi
    else
      printf "NOTICE: open container has not been mounted.\n"
    fi

    if sudo cryptsetup status "${NAME}" | grep -F "/dev/mapper/${NAME} is active" > /dev/null 2>&1 ; then
      sudo cryptsetup luksClose "${NAME}"
    else
      printf "NOTICE: ${CONTAINER} has not been opened.\n"
    fi

    readonly LOOPDEVICE="$( losetup -a | grep -F "${CONTAINER}" | cut -d ":" -f 1 )"

    if [ -n "${LOOPDEVICE}" ] ; then
      sudo losetup -d "${LOOPDEVICE}"
    else
      printf "NOTICE: the container has not been looped.\n"
    fi

    ;;
  *)
    printf "ERROR: I do not understand you - EXIT!\n"
    exit 1

esac

exit 0
