--- initscripts/rc.sysinit 2009-06-10 16:59:35.920127136 -0400 +++ initscripts.new/rc.sysinit 2009-06-10 16:57:12.669313205 -0400 @@ -178,27 +178,69 @@ /sbin/mkswap -L $cname /dev/mapper/$cname >/dev/null fi fi - elif [ "${cpass}" = "ASK" ]; then - printf "\nOpening '${cname}' volume:\n" - - if $CS isLuks $csrc 2>/dev/null; then - $CS $copts luksOpen $csrc $cname < /dev/console - else - $CS $copts create $cname $csrc < /dev/console - fi - elif [ "${cpass:0:1}" != "/" ]; then + elif [ "${cpass:0:1}" != "/" -a "${cpass}" != "ASK" ]; then if $CS isLuks $csrc 2>/dev/null; then echo "$cpass" | $CS $copts luksOpen $csrc $cname >/dev/null else echo "$cpass" | $CS $copts create $cname $csrc >/dev/null fi else + #lets see if this device needs to be mounted... + cleanupcryptmount="NO" + cryptmountpoint="/tmp" #I have to mount over /tmp because root is ro... :( + if [ ! -z `echo ${cpass} | cut -sd ':' -f 2` ]; then + try=10 + dev=`echo ${cpass} | cut -sd ':' -f 1` + key=`echo ${cpass} | cut -sd ':' -f 2` + + printf "\nWaiting for ${dev} ...\n" + while [ ! -b "${dev}" -a ${try} -gt 0 ]; do + sleep 1 + try=$((${try}-1)) + done + + if [ -b ${dev} ]; then + if mount -n -o ro ${dev} ${cryptmountpoint}; then + cleanupcryptmount="YES" + if [ -e ${cryptmountpoint}/${key} ]; then + cpass=${cryptmountpoint}/${key} + else + printf "${key} not found on ${dev}\n" && cpass="ASK" + fi + else + printf "Failed to mount ${dev}\n" && cpass="ASK" + fi + else + printf "No block device ${dev}\n" && cpass="ASK" + fi + fi + + if [ "${cpass}" != "ASK" ]; then + if $CS isLuks $csrc 2>/dev/null; then + $CS -d $cpass $copts luksOpen $csrc $cname >/dev/null + else + $CS -d $cpass $copts create $cname $csrc >/dev/null + fi + else + printf "Falling back to password...\n" + fi + + + if [ "${cleanupcryptmount}" == "YES" ]; then + umount ${cryptmountpoint} + fi + fi + + if [ "${cpass}" = "ASK" ]; then + printf "\nOpening '${cname}' volume:\n" + if $CS isLuks $csrc 2>/dev/null; then - $CS -d $cpass $copts luksOpen $csrc $cname >/dev/null + $CS $copts luksOpen $csrc $cname < /dev/console else - $CS -d $cpass $copts create $cname $csrc >/dev/null + $CS $copts create $cname $csrc < /dev/console fi fi + if [ $? -ne 0 ]; then csfailed=1 stat_append "failed "