#!/bin/sh
# scripts/local-top/loopaes
# Description:
# - mount encrypted sd-card with gpgkey which is in initrd
# - setup loop devices
# - umount sd-card

#set -e

PREREQ=""

prereqs()
{
	echo "$PREREQ"
}

case $1 in
	prereqs)
		prereqs
		exit 0
		;;
esac

get_loop_opts() 
{
	local opt
   local IFS=", "

	for opt in ${1}; do
		case $opt in
			loop=*)
				loop_dev=${opt#loop=}
				;;
			gpgkey=*)
				loop_gpg=${opt#gpgkey=}
				loop_pw=`echo $loop_gpg | sed -e 's/\.gpg/\.passw/g'`
				;;
		esac
	done
}

crypt_fs()
{
	local device mount type options dump pass

	[ -r /etc/fstab ] || return 1
	
	if [ "$1" = "mount" ]; then
		echo -n "Password: "
		read -s -t 60 passw
		echo "${passw}" > /tmp/passw
		exec 9< /tmp/passw
	fi

	grep '^[^#]' /etc/fstab | \
	while read device mount type options dump pass; do
		if [ "$device" = "$2" ]; then
			case ${1} in
				mount)
					mkdir -p "$mount"
					/bin/mount -p 9 ${mount}
					error=$?
					exec 9<&-
					rm -f /tmp/passw
					unset passw
					[ ${error} = 0 ] || return 1
					;;
				umount)
					/bin/umount ${mount}
					;;
			esac
			return
		fi
	done
}

losetup_crypt_fs()
{
	local device mount type options dump pass

	[ -r /etc/fstab ] || return 1

	grep '^[^#]' /etc/fstab | \
	while read device mount type options dump pass; do
		if [ "$device" = "$2" ]; then
			get_loop_opts ${options}
			case ${1} in
				create)
					[ -r ${loop_pw} ] || return 1
					exec 9< ${loop_pw}
					/sbin/losetup -p 9 -F ${loop_dev}
					exec 9<&-
					;;
				delete)
					/sbin/losetup -d ${loop_dev}
					;;
			esac
			unset loop_dev
			unset loop_gpg
			unset loop_pw
			return
		fi
	done 
}

load_keymap()
{
	if [ -x /bin/loadkeys -a -r /etc/boottime.kmap.gz ]; then
		loadkeys -q /etc/boottime.kmap.gz
	fi
}

### start processing ###

# /proc/cmdline: "loopaes" required 
# /proc/cmdline: root=/dev/loopX like in /etc/fstab
grep -qs loopaes /proc/cmdline || exit 0

# should be somewhere in a configuration file
filesystems="/dev/sda3 /dev/sda7"
key_device="/dev/mmcblk0p1"
modules="mmc_block sdhci aes_i586 loop ext2 ext3"

for mod in ${modules}; do
	modprobe -q $mod
done

load_keymap

count=0
while [ $count -lt 3 ]; do
	crypt_fs mount ${key_device}
	[ $? = 0 ] && break
	count=$(( $count + 1 ))
done
[ $count -gt 2 ] && exit 1

for cmnt in ${filesystems}; do
	losetup_crypt_fs create ${cmnt}
done

crypt_fs umount ${key_device}

rm /etc/fstab

exit 0
