144 lines
3.1 KiB
Bash
Executable File
144 lines
3.1 KiB
Bash
Executable File
#!/bin/bash
|
|
## Functions
|
|
#find containers
|
|
containers=""
|
|
commands=""
|
|
|
|
function read_containers(){
|
|
containers=$(
|
|
[ -e ~/.containers ] && cat ~/.containers 2>/dev/null
|
|
find /media/${USER} -maxdepth 2 -iname ".containers" | while read line ; do
|
|
cat $line | awk -F';' -v path="$(dirname $line)" '{OFS=";" ; print $1,path"/"$2}'
|
|
done)
|
|
}
|
|
|
|
function mount_container(){
|
|
container_line=$*
|
|
name=$(echo $container_line | cut -f1 -d';')
|
|
path=$(echo $container_line | cut -f2 -d';')
|
|
mount_point="/mnt/${name}"
|
|
|
|
#mount only if containerfile is valid
|
|
if [ -e ${path} ] && cryptsetup isLuks "${path}" ; then
|
|
#if mountpoint is not there create it
|
|
[ ! -e ${mount_point} ] && sudo mkdir -p "${mount_point}" && sudo chmod 777 "${mount_point}"
|
|
#open luks Container
|
|
sudo cryptsetup luksOpen "${path}" "${name}"
|
|
#mount Container
|
|
sudo mount "/dev/mapper/${name}" "${mount_point}"
|
|
else
|
|
echo "Container ${path} not found" && continue
|
|
fi
|
|
}
|
|
|
|
function unmount_container(){
|
|
container_line=$*
|
|
name=$(echo $container_line | cut -f1 -d';')
|
|
path=$(echo $container_line | cut -f2 -d';')
|
|
mount_point="/mnt/${name}"
|
|
|
|
#unmount only if mounted
|
|
if ( mount | grep -q "${mount_point}" ) ; then
|
|
#if still in use
|
|
if [[ $( lsof "${mount_point}" | wc -l ) -gt 0 ]] ; then
|
|
echo "Mountpoint ${mount_point} is still in use:"
|
|
lsof "${mount_point}"
|
|
continue
|
|
else
|
|
sudo umount -l "${mount_point}"
|
|
sudo rmdir "${mount_point}"
|
|
fi
|
|
|
|
sudo cryptsetup luksClose "${name}"
|
|
fi
|
|
}
|
|
|
|
function is_open(){
|
|
container_path="${1}"
|
|
ls -b /dev/mapper/ | xargs -n1 sudo cryptsetup status | grep loop: | grep -q "${container_path}"
|
|
return $?
|
|
}
|
|
|
|
function is_mounted(){
|
|
mount_point="${1}"
|
|
mount | grep -q "${mount_point}"
|
|
return $?
|
|
}
|
|
|
|
function is_used(){
|
|
mount_point="${1}"
|
|
lsof ${mount_point} 2>/dev/null 1>&2
|
|
return $?
|
|
}
|
|
|
|
function is_mounted_container(){
|
|
container_line=$*
|
|
name=$(echo $container_line | cut -f1 -d';')
|
|
path=$(echo $container_line | cut -f2 -d';')
|
|
mount_point="/mnt/${name}"
|
|
result=0
|
|
mount | grep -q "${mount_point}" && (( result+=1 ))
|
|
sudo cryptsetup status ${name} | grep -q "${path}" && (( result+=2 ))
|
|
echo $result
|
|
return $result
|
|
}
|
|
|
|
#mount all containers
|
|
function mount_all(){
|
|
read_containers
|
|
for line in $containers ; do
|
|
mount_container $line
|
|
done
|
|
}
|
|
|
|
#unmount all containers
|
|
function unmount_all(){
|
|
read_containers
|
|
for line in $containers ; do
|
|
unmount_container $line
|
|
done
|
|
}
|
|
|
|
#print status
|
|
function print_status(){
|
|
container_line=$*
|
|
name=$(echo $container_line | cut -f1 -d';')
|
|
path=$(echo $container_line | cut -f2 -d';')
|
|
mount_point="/mnt/${name}"
|
|
echo "Stats for $name : $path"
|
|
is_open ${path} && echo "IS OPENED"
|
|
is_mounted ${mount_point} && echo "IS MOUNTED"
|
|
is_used ${mount_point} && echo "IS IN USE"
|
|
}
|
|
|
|
#print status
|
|
function print_status_all(){
|
|
read_containers
|
|
for line in $containers ; do
|
|
print_status $line
|
|
done
|
|
|
|
}
|
|
|
|
##main
|
|
|
|
command="show"
|
|
[[ $# -eq 1 ]] && command="${1}"
|
|
echo "Command: ${command}"
|
|
|
|
case $command in
|
|
mount)
|
|
mount_all
|
|
;;
|
|
unmount)
|
|
unmount_all
|
|
;;
|
|
list)
|
|
print_status_all
|
|
;;
|
|
*)
|
|
read_containers
|
|
echo $containers
|
|
;;
|
|
esac
|