#!/bin/sh

CRYPTLOG="/run/initramfs/opencrypt-genkey.log"
CONFFILE="/etc/opencrypt/opencrypt.conf"
CRYPTTAB="/etc/crypttab"
LOCALPREFIX="/run/opencrypt$$"

. /usr/share/opencrypt/functions.sh
. /usr/share/opencrypt/script-functions.sh

cryptlog() {
	echo "$@"
}

copy_tmp_log() {
    local tmp="$CRYPTLOG.tmp.$$"
    if [ -s "$tmp" ]; then
        if [ $VERBOSE -gt 0 ]; then
            echo "-------------------"
            cat "$tmp"
            echo "-------------------"
        fi
    fi
    [ -f "$tmp" ] && rm -f "$tmp"
}

open_map() {
	local status options keyfile
	keyfile="genkey-${MAP}.key"
	rm -f "$keyfile"

	OPEN="false"
	scan_devices
	create_hash
	if [ ! -s "$HASH" ]; then
		scan_network
		create_hash
	fi
	if [ -s "$HASH" ]; then
		cryptlog "$MAP: created key in $keyfile"
		cat "$HASH" > "$keyfile"
		/sbin/cryptsetup open --tries 1 --test-passphrase --type=$CRYPTYPE --key-file $keyfile $CRYPT >/dev/null 2>&1
		if [ "$?" = "0" ]; then
			cryptlog "$MAP: key file $keyfile validated"
		else
			cryptlog "$MAP: key file $keyfile failed to validate"
		fi
	else
		cryptlog "$MAP: cannot create key"
    fi
}

oc_version=$(cat /usr/share/opencrypt/VERSION)
cryptlog "starting genkey $oc_version"

# crypttab could be empty but must exists
if [ ! -f "$CRYPTTAB" ]; then
	cryptlog "no crypttab found"
	exit 1
fi

if [ ! -f "$CONFFILE" ]; then
	cryptlog "missing $CONFFILE"
	exit 1
fi

if ! load_params ; then
	cryptlog "please check $CONFFILE"
	exit 1
fi

HASH="/run/opencrypthash$$"

TMP2="/run/opencrypttmp$$"

load_modules

cryptlog "loading system crypttab"
load_crypttab "$CRYPTTAB"

open_crypt_devices $cryptdevices

umount_devices

rm -f "$HASH" ${LOCALPREFIX}.*

keys=$(ls -1 genkey-*.key 2>/dev/null)
if [ "x$keys" = "x" ]; then
	cryptlog "no key created"
else
	cryptlog ""
	cryptlog "created keys:"
	for key in $keys ; do
		cryptlog "  $key"
	done
	cryptlog ""
fi

exit 0
