#!/bin/bash set -e # bail out at any error if [ -z "${1}" ] ; then echo "Usage:" echo " $0 " echo " $0 " echo exit 1 fi file=${1} mountpoint=${2} if [ -f "${file}" ] ; then for loop in /dev/loop* /dev/loop/* ; do if [ ! -b ${loop} ] ; then unset loop continue fi losetup "${loop}" "${file}" >/dev/null 2>&1 && break unset loop done if [ -z "${loop}" ] ; then echo "No free loopdevice found." exit 1 fi elif [ ! -b "${file}" ] ; then echo "Unknown filetype!" echo "${file} is neither a file nor a blockdevice!" else loop=${file} fi pass="MOOP" pass2="MEEP" while [ "${pass}" != "${pass2}" ] ; do read -s -p "Enter passphrase: " pass echo read -s -p "Repeat: " pass2 echo done pass="`echo ${pass} | md5sum`" pass=${pass%% *} encryptedname="`echo ${mountpoint} ${file} | md5sum`" encryptedname=${encryptedname%% *} while [ -e /dev/mapper/${encryptedname} ] ; do encryptedname="`echo ${encryptedname} ${file} | md5sum`" encryptedname=${encryptedname%% *} # some day we _will_ find an unused one :) done echo 0 `/sbin/blockdev --getsize ${loop}` crypt aes-plain ${pass} 0 ${loop} 0 | /sbin/dmsetup create ${encryptedname} y=0 read size < <( disktype ${loop} | grep ^Block ) size=${size##*(} size=${size%% bytes*} size=$(( ${size} / ( 1024*1024 ) )) echo $size #dd if=${loop} of=/dev/mapper/${encryptedname} bs=1M 2>/tmp/dd.${$} & dd if=${loop} of=/dev/null bs=1M 2>/tmp/dd.${$} & unset pid while [ -z "${pid}" ] ; do sleep 1 pid=`pidof dd` done while [ -e /proc/${pid} ] ; do sleep 4 [ -e /proc/${pid} ] && kill -USR1 ${pid} sleep 1 read records < <( tail -n 1 /tmp/dd.${$} ) records="${records%%+*}" echo -en "\r${records} MB ($(( ${records}00 / ${size} ))%)" done echo /sbin/dmsetup remove ${encryptedname} [[ ${loop} == /dev/loop* ]] && /sbin/losetup -d ${loop}