commit e6db14dcfc0ee5d7fdc530e3c6c90c768b352912
parent 0dab10f26cd6d6d0d8db643bd4418af869e5f9c8
Author: Jaromil <jaromil@dyne.org>
Date: Mon, 7 Feb 2011 09:42:50 +0100
bind hooks
a file bind-hook in the tomb's root indicated directories to be
mount -o bind when the tomb is opened. tomb close manages to umount them
Diffstat:
M | src/tomb | | | 45 | ++++++++++++++++++++++++++++++++++++--------- |
1 file changed, 36 insertions(+), 9 deletions(-)
diff --git a/src/tomb b/src/tomb
@@ -193,12 +193,6 @@ exec_as_user() {
fi
func "executing as user '$SUDO_USER': ${(f)@}"
- # which gksu > /dev/null
- # if [ $? = 0 ]; then
- # func "Using gksu for execution of '${(f)@}' as user $SUDO_USER"
- # gksu -u $SUDO_USER "${@[@]}"
- # return $?
- # fi
which sudo > /dev/null
if [ $? = 0 ]; then
func "Using sudo for execution of '${(f)@}' as user $SUDO_USER"
@@ -587,10 +581,31 @@ mount_tomb() {
chown $(id -u $ME):$(id -g $ME) ${tombmount}
notice "encrypted storage $tombfile succesfully mounted on $tombmount"
+ exec_bind_hooks ${tombmount}
exec_as_user tomb-status ${mapper} ${tombfile} ${tombmount} &!
return 0
}
+exec_bind_hooks() {
+ mnt=$1 # first argument is where the tomb is mounted
+ if ! [ -r ${mnt}/bind-hooks ]; then return; fi
+
+ # if 'bind-hooks' is found inside the tomb, parse it
+ # every line contains two strings:
+ # the first is a directory existing inside the tomb
+ # the second is the place where it should be mounted (-o bind)
+ hook=`cat ${mnt}/bind-hooks | awk '
+/^#/ { next }
+{ if($1 && $2) print "mount -o bind \${mnt}/" $1 " " $2 "; " }
+'`
+ # restore $HOME for the calling user
+ HOME=/home/${SUDO_USER}
+
+ act "bind hooks found, mounting direcories as requested"
+ # execute the mount commands
+ eval $hook
+}
+
umount_tomb() {
if ! [ $1 ]; then
@@ -601,7 +616,6 @@ umount_tomb() {
return 1
elif [ "$how_many_tombs" = "1" ]; then
mapper=`find /dev/mapper -name 'tomb.*'`
- tombfile=`mount | grep $mapper | awk '{print $3}'`
else
error "too many tombs mounted, please specify which to unmount:"
ls /dev/mapper/tomb.*
@@ -630,15 +644,28 @@ umount_tomb() {
else
error "tomb not found: $1"
error "please specify an existing /dev/mapper/tomb.*"
- tomb-notify "My tomb vanished" "Crypto undertaker will rest in peace."
+ tomb-notify "Tomb was already closed." "Undertaker will rest in peace."
return 0
fi
basemap=`basename $mapper`
tombname=`echo ${basemap} | cut -d. -f2`
+ tombmount=`mount | grep $mapper | awk '{print $3}'`
+
+ # check if there are binded dirs and close them first
+ mount | grep "${tombmount}" | grep -v loop 2>&1 > /dev/null
+ if [ $? = 0 ]; then
+ act "closing tomb $tombname binded directories"
+ unbind=`mount | grep ${tombmount} | grep -v loop | awk '
+ { print "umount " $3 "; " }
+ '`
+ eval $unbind
+ func "umount binded dirs:"
+ func "$unbind"
+ fi
- act "closing tomb $tombname on dm-crypt $basemap"
+ act "closing tomb $tombname on dm-crypt $basemap"
mount | grep $mapper 2>&1 >/dev/null
if [ $? = 0 ]; then # still mounted
errno=`umount ${mapper}`