#!/bin/sh
while getopts "z:d:p:v" arg; do
    case $arg in
        z) zpool=$OPTARG      ;;
        d) dest=$OPTARG       ;;
        p) passphrase=$OPTARG ;;
        v) verbose=1          ;;
    esac
done
_hash() { md5sum|awk '{print $1}'|sha1sum|awk '{print $1}'|sha224sum|awk '{print $1}'|sha256sum|awk '{print $1}'|sha384sum|awk '{print $1}'|sha512sum|awk '{print $1}'; }
_keygen() { printf '%s\n' "$1"|_hash|printf '%s\n' "$(cat)"|base64 -w 0|cut -c1-500; }
[ -z "$zpool" ] && zpool=$(mount 2>/dev/null|grep "/ "|awk '{print $1}'|sed "s@\/.*@@")
[ -z "$zpool" ] && { echo "zpool not found"; exit 1; }
[ -z "$(zpool list -o name|grep -v "NAME"|grep "^$zpool$")" ] && { echo "[$zpool] zpool not found"; exit 1; }
[ -z "$passphrase" ] && { echo "passphrase required: -p <passphrase>"; exit 1; }
tmp=$(mktemp /dev/shm/keys.XXXXXX)
chmod 600 "$tmp"
trap 'rm -f "$tmp" /dev/shm/encpass' EXIT INT TERM
zpool status "$zpool"|grep "ONLINE"|grep -v state|grep -v "$zpool"|awk '{print $1}'|while IFS= read -r line; do
    printf '%s %s\n' "$(_keygen "$line")" "$line" >> "$tmp"
done
printf '%s %s\n' "$(_keygen "$(zpool get -H -o value guid "$zpool")")" "$zpool" >> "$tmp"
[ -n "$verbose" ] && cat "$tmp"
[ -n "$dest" ] && {
    openssl enc -aes-256-cbc -pbkdf2 -pass "pass:$passphrase" -in "$tmp" -out "$dest"
}