128 lines
2.7 KiB
Bash
Executable File
128 lines
2.7 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
# This script does the following:
|
|
# dm-crypt: creates /etc/crypttab entries
|
|
|
|
. /lib/partman/lib/base.sh
|
|
|
|
crypttab_add_entry () {
|
|
local realdev realdevdir cryptdev cryptdevdir keytype keyfile opts
|
|
local method mnt target source
|
|
realdev=$1
|
|
realdevdir=$2
|
|
cryptdev=$3
|
|
cryptdevdir=$4
|
|
keytype=$(cat $realdevdir/keytype)
|
|
|
|
# Set basic options
|
|
if [ $keytype = passphrase ]; then
|
|
opts="luks"
|
|
else
|
|
for opt in cipher ivalgorithm keyhash keysize; do
|
|
eval local $opt
|
|
if [ -r "$realdevdir/$opt" ]; then
|
|
eval $opt=$(cat $realdevdir/$opt)
|
|
else
|
|
return 1
|
|
fi
|
|
done
|
|
opts="cipher=$cipher-$ivalgorithm,size=$keysize"
|
|
if [ $keytype != random ] && [ -n "$keyhash" ]; then
|
|
opts="$opts,hash=$keyhash"
|
|
fi
|
|
fi
|
|
|
|
# Set key source
|
|
if [ $keytype = random ]; then
|
|
keyfile="/dev/urandom"
|
|
elif [ $keytype = passphrase ]; then
|
|
keyfile="none"
|
|
elif [ -f $realdevdir/keyfile ]; then
|
|
keyfile=$(cat $realdevdir/keyfile)
|
|
else
|
|
return 1
|
|
fi
|
|
|
|
# Check for special mounts
|
|
method=$(cat $cryptdevdir/method)
|
|
mnt=""
|
|
if [ -f $cryptdevdir/mountpoint ]; then
|
|
mnt=$(cat $cryptdevdir/mountpoint)
|
|
fi
|
|
if [ $method = swap ]; then
|
|
opts="$opts,swap"
|
|
elif [ "$mnt" = /tmp ] && [ $keytype = random ]; then
|
|
opts="$opts,tmp"
|
|
fi
|
|
|
|
# Allow TRIM operations
|
|
opts="$opts,discard"
|
|
|
|
# Check mapping name
|
|
target=$(basename $cryptdev)
|
|
|
|
# Check source device
|
|
source=$realdev
|
|
|
|
# Use UUID for LUKS devices
|
|
if cryptsetup isLuks "$source"; then
|
|
local uuid=$(cryptsetup luksUUID "$source")
|
|
source="UUID=$uuid"
|
|
fi
|
|
|
|
# Add entry to crypttab
|
|
echo "$target $source $keyfile $opts" >> /target/etc/crypttab
|
|
}
|
|
|
|
for dev in $DEVICES/*; do
|
|
[ -d "$dev" ] || continue
|
|
cd $dev
|
|
# skip unless encrypted
|
|
[ -f crypt_realdev ] || continue
|
|
|
|
partitions=
|
|
open_dialog PARTITIONS
|
|
while { read_line num id size type fs path name; [ "$id" ]; }; do
|
|
[ "$fs" != free ] || continue
|
|
partitions="$partitions $id,$path"
|
|
done
|
|
close_dialog
|
|
|
|
for part in $partitions; do
|
|
id=${part%,*}
|
|
path=${part#*,}
|
|
|
|
r=$(cat crypt_realdev)
|
|
set -- $(IFS=: && echo $r)
|
|
realdev=$1
|
|
realdevnum=$2
|
|
realdevdir=$3
|
|
cryptdevdir=$dev/$id
|
|
|
|
[ -f $realdevdir/cipher ] || continue
|
|
[ -f $realdevdir/crypto_type ] || continue
|
|
[ -f $realdevdir/keytype ] || continue
|
|
[ -f $id/method ] || continue
|
|
|
|
# skip unless swap, to be mounted or lvm on dm-crypt
|
|
method=$(cat $id/method)
|
|
type=$(cat $realdevdir/crypto_type)
|
|
if [ "$method" != swap ] && [ "$method" != lvm ] && \
|
|
[ ! -f $id/mountpoint ]; then
|
|
continue
|
|
fi
|
|
if [ "$method" = lvm ] && [ "$type" != dm-crypt ]; then
|
|
continue
|
|
fi
|
|
|
|
realdev=$(mapdevfs $realdev)
|
|
cryptdev=$(mapdevfs $path)
|
|
|
|
case $type in
|
|
dm-crypt)
|
|
crypttab_add_entry $realdev $realdevdir $cryptdev $cryptdevdir
|
|
;;
|
|
esac
|
|
done
|
|
done
|