#! /bin/sh
### BEGIN INIT INFO
# Provides:          cryptdisks
# Required-Start:    checkroot
# Required-Stop:     umountroot
# Should-Start:      udev devfsd raid2 mdadm lvm
# Should-Stop:
# Default-Start:     S
# Default-Stop:      0 6
# Short-Description: Setup encrypted block devices.
# Description:
### END INIT INFO

. /lib/lsb/init-functions

CRYPTCMD=/sbin/cryptsetup
DEVMAPCMD=/sbin/dmsetup
LOSETUP=/sbin/losetup
TABFILE=/etc/crypttab
MAPPER=/dev/mapper

test -x $CRYPTCMD  || exit 0
test -x $DEVMAPCMD || exit 0
test -f $TABFILE   || exit 0             

[ -r /etc/default/cryptdisks ] && . /etc/default/cryptdisks

[ -r /lib/cryptsetup/init_functions ] && . /lib/cryptsetup/init_functions

case "$CRYPTDISKS_ENABLE" in
  [Nn]*)
  	exit 0
  	;;
esac

$DEVMAPCMD mknodes

case "$1" in
  start)
	log_action_begin_msg "Starting crypto disks"
	egrep -v "^[[:space:]]*(#|$)" $TABFILE | while read dst src key opt; do
		
		if ! test -r "$src" ; then
			if [ "x$LOUD" == "xyes" ]; then
				echo -e "\n - Device '$src' does not exist, skipping" >&2
			fi
			continue
		fi

		if test -b $MAPPER/$dst; then
			log_progress_msg "$dst(running)"
		else
			log_progress_msg "$dst(starting)"

			parse_opts
			check_key
			lo_setup

			if test "x$SKIP" = "xyes" ; then
				continue
			fi

			if test "x$USELUKS" = "xyes" ; then
				do_luks
			else
				do_noluks
			fi

			do_swap
			do_tmp
		fi
	done
	echo -n " "
	log_action_end_msg $?
	;;
  stop)
	log_action_begin_msg "Stopping crypto disks"
	egrep -v "^[[:space:]]*(#|$)" $TABFILE | while read dst src key; do
		if test -b $MAPPER/$dst; then
			if $DEVMAPCMD info $dst | grep -q '^Open count: *0$'; then
				dev=`$DEVMAPCMD table $dst | sed 's/^.* \([0-9]*:[0-9]*\) .*/\1/'`
				major=`echo $dev | sed 's/:.*//'`
				minor=`echo $dev | sed 's/.*://'`
				
				log_progress_msg "$dst(stopping)"
				$CRYPTCMD remove $dst
				
				# Detach loopback device, if attached
				if test -f $src -a $major -eq 7; then
					$LOSETUP -d /dev/loop$minor
				fi
			else
				log_progress_msg "$dst(busy)"
			fi
		else
			log_progress_msg "$dst(stopped)"
		fi
	done

	echo -n " "
	log_action_end_msg $?
	;;
  restart|reload|force-reload)
	$0 stop
	$0 start
	;;
  *)
	echo "Usage: cryptdisks {start|stop|restart|reload|force-reload}"
	exit 1
	;;
esac
