#! /usr/bin/env bash set -euo pipefail declare -A devices valid_name=0 command_name=${1:-} device_name=${2:-} if [ -r "$HOME/.config/cs/config" ]; then . "$HOME/.config/cs/config" fi #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 if [ -L "/dev/mapper/$2" ]; then echo "Crypt device has already been opened: /dev/mapper/$2" echo "Continuing..." else /usr/bin/sudo /usr/bin/cryptsetup luksOpen "/dev/disk/by-uuid/$1" "$2" fi 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 -p "/mnt/$1" fi sudo mount "/dev/mapper/$1" "/mnt/$1" if [ -x "$HOME/.config/cs/post_mount/$1" ]; then "$HOME/.config/cs/post_mount/$1" fi else echo "Error: Device /dev/mapper/$1 is not available." return 1 fi } function unmount_cryptdevice() { if [ -x "$HOME/.config/cs/pre_umount/$1" ]; then "$HOME/.config/cs/pre_umount/$1" 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 "$command_name" 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