#! /usr/bin/env bash set -euo pipefail declare -A devices valid_name=0 command_name=${1:-} device_name=${2:-} . ~/.config/cs.conf #TODO: do sanity checks on mountpoints and (dm) devices #TODO: display list of devices available, if no argument given function open_cryptdevice() { if [ -L "/dev/disk/by-uuid/$1" ]; then /usr/bin/sudo /usr/bin/cryptsetup luksOpen "/dev/disk/by-uuid/$1" $2 else echo "Error: Device $2 (UUID=$1) is not available." return 1 fi } function close_cryptdevice() { /usr/bin/sudo /usr/bin/cryptsetup luksClose $1 } function mount_cryptdevice() { if [[ -e "/dev/mapper/$1" ]]; then if [[ ! -d "/mnt/$1" ]]; then sudo mkdir "/mnt/$1" fi sudo mount "/dev/mapper/$1" "/mnt/$1" if [ $1 = "media" ]; then sudo mount --bind /mnt/media/music /mnt/music sudo mount --bind /mnt/media/photos /mnt/photos if [ ! -h ~/.cache/shotwell ]; then ln -s /mnt/photos/shotwell/ ~/.cache/shotwell fi fi else echo "Error: Device /dev/mapper/$1 is not available." return 1 fi } function unmount_cryptdevice() { if [ $1 = "media" ]; then /usr/bin/sudo /usr/bin/umount /mnt/{music,photos} fi /usr/bin/sudo /usr/bin/umount /mnt/$1 } function validate_cryptdevice_name() { local _result_valid_name=$1 local name_found=0 local input_name=${2:-} for name in "${!devices[@]}"; do if [ $name = "${input_name}" ]; then name_found=1 eval $_result_valid_name="'$name_found'" fi done } validate_cryptdevice_name valid_name ${device_name} if [ $valid_name -eq 0 ]; then echo "No such device: '$device_name'!" exit 1 fi case $1 in "open") open_cryptdevice ${devices[${2}]} $2 mount_cryptdevice $2 ;; "close") unmount_cryptdevice $2 close_cryptdevice $2 ;; *) echo "cs only understands 'open' and 'close'." exit 1 ;; esac exit 0