1#!/bin/sh 2 3set -eu 4if [ ! -e /run/zfs_fs_name ]; then 5 echo "Wait for the root pool to be imported or press Ctrl-C to exit." 6fi 7while [ ! -e /run/zfs_fs_name ]; do 8 if [ -e /run/zfs_unlock_complete ]; then 9 exit 0 10 fi 11 sleep 1 12done 13echo 14echo "Unlocking encrypted ZFS filesystems..." 15echo "Enter the password or press Ctrl-C to exit." 16echo 17zfs_fs_name="" 18if [ ! -e /run/zfs_unlock_complete_notify ]; then 19 mkfifo /run/zfs_unlock_complete_notify 20fi 21while [ ! -e /run/zfs_unlock_complete ]; do 22 zfs_fs_name=$(cat /run/zfs_fs_name) 23 zfs_console_askpwd_cmd=$(cat /run/zfs_console_askpwd_cmd) 24 systemd-ask-password "Encrypted ZFS password for ${zfs_fs_name}:" | \ 25 /sbin/zfs load-key "$zfs_fs_name" || true 26 if [ "$(/sbin/zfs get -H -ovalue keystatus "$zfs_fs_name" 2> /dev/null)" = "available" ]; then 27 echo "Password for $zfs_fs_name accepted." 28 zfs_console_askpwd_pid=$(ps | awk '!'"/awk/ && /$zfs_console_askpwd_cmd/ { print \$1; exit }") 29 if [ -n "$zfs_console_askpwd_pid" ]; then 30 kill "$zfs_console_askpwd_pid" 31 fi 32 # Wait for another filesystem to unlock. 33 while [ "$(cat /run/zfs_fs_name)" = "$zfs_fs_name" ] && [ ! -e /run/zfs_unlock_complete ]; do 34 sleep 1 35 done 36 else 37 echo "Wrong password. Try again." 38 fi 39done 40echo "Unlocking complete. Resuming boot sequence..." 41echo "Please reconnect in a while." 42echo "ok" > /run/zfs_unlock_complete_notify 43