133ff3979SEirik Øverby#!/bin/sh 233ff3979SEirik Øverby 333ff3979SEirik Øverby# PROVIDE: zfskeys 433ff3979SEirik Øverby# REQUIRE: zpool 533ff3979SEirik Øverby# BEFORE: zfs zvol 633ff3979SEirik Øverby 733ff3979SEirik Øverby. /etc/rc.subr 833ff3979SEirik Øverby 933ff3979SEirik Øverbyname="zfskeys" 1033ff3979SEirik Øverbydesc="Load dataset keys" 1133ff3979SEirik Øverbyrcvar="zfskeys_enable" 1233ff3979SEirik Øverbyextra_commands="status" 1333ff3979SEirik Øverbystart_cmd="load_zfs_keys" 1433ff3979SEirik Øverbystop_cmd="unload_zfs_keys" 1533ff3979SEirik Øverbystatus_cmd="status_zfs_keys" 1633ff3979SEirik Øverbyrequired_modules="zfs" 1733ff3979SEirik Øverby 1833ff3979SEirik Øverby# Note that zfskeys_datasets must have any character found in IFS escaped. 1933ff3979SEirik Øverby# Forcibly unmounting/unloading only applies to filesystems; ignored for zvols. 2033ff3979SEirik Øverby: ${zfskeys_datasets:=''} 2133ff3979SEirik Øverby: ${zfskeys_timeout:=10} 2233ff3979SEirik Øverby: ${zfskeys_unload_force:='NO'} 2333ff3979SEirik Øverby 2433ff3979SEirik Øverbyencode_args() 2533ff3979SEirik Øverby{ 2633ff3979SEirik Øverby shift && [ $# -gt 0 ] && printf "%s\0" "$@" | b64encode -r - 2733ff3979SEirik Øverby} 2833ff3979SEirik Øverby 2933ff3979SEirik Øverbylist_datasets() 3033ff3979SEirik Øverby{ 3133ff3979SEirik Øverby if [ "$zfskeys_args" ]; then 3233ff3979SEirik Øverby echo "$zfskeys_args" | b64decode -r | 3333ff3979SEirik Øverby xargs -0 zfs get -H -s local -o value,name keylocation 3433ff3979SEirik Øverby elif [ ! "$zfskeys_datasets" ]; then 3533ff3979SEirik Øverby zfs get -H -t filesystem,volume -s local -o value,name keylocation 3633ff3979SEirik Øverby else 3733ff3979SEirik Øverby echo "$zfskeys_datasets" | xargs -n 1 zfs get -H -s local \ 3833ff3979SEirik Øverby -o value,name keylocation 3933ff3979SEirik Øverby fi 4033ff3979SEirik Øverby} 4133ff3979SEirik Øverby 4233ff3979SEirik Øverbyunlock_fs() 4333ff3979SEirik Øverby{ 4433ff3979SEirik Øverby local fs="$1" 4533ff3979SEirik Øverby local kl="$2" 4633ff3979SEirik Øverby local k="${kl##file://}" 4733ff3979SEirik Øverby 48*408087f1SDoug Ambrisko if [ "$kl" == "prompt" ] 49*408087f1SDoug Ambrisko then 50*408087f1SDoug Ambrisko echo "Key prompt for $fs." 51*408087f1SDoug Ambrisko if zfs load-key -L "$kl" "$fs" < /dev/tty > /dev/tty 2>/dev/tty ; then 52*408087f1SDoug Ambrisko echo "Key loaded for $fs." 53*408087f1SDoug Ambrisko else 54*408087f1SDoug Ambrisko echo "Key failed to load for $fs." 55*408087f1SDoug Ambrisko fi 56*408087f1SDoug Ambrisko elif [ "$k" ] && [ -f "$k" ] && [ -s "$k" ] && [ -r "$k" ]; then 5733ff3979SEirik Øverby if [ "$(zfs get -Ho value keystatus "$fs")" = 'available' ]; then 5833ff3979SEirik Øverby echo "Key already loaded for $fs." 5933ff3979SEirik Øverby elif keytest=$(zfs load-key -n -L "$kl" "$fs" 2>&1); then 6033ff3979SEirik Øverby echo "Loading key for $fs from $kl.." 6133ff3979SEirik Øverby if ! keyload=$(timeout $zfskeys_timeout zfs load-key -L "$kl" "$fs" 2>&1) ; then 6233ff3979SEirik Øverby if [ $? -eq 124 ]; then 6333ff3979SEirik Øverby echo "Timed out loading key from $kl for $fs" 6433ff3979SEirik Øverby else 6533ff3979SEirik Øverby echo "Failed to load key from $kl for $fs:" 6633ff3979SEirik Øverby echo "$keyload" 6733ff3979SEirik Øverby fi 6833ff3979SEirik Øverby fi 6933ff3979SEirik Øverby else 7033ff3979SEirik Øverby echo "Could not verify key from $kl for $fs:" 7133ff3979SEirik Øverby echo "$keytest" 7233ff3979SEirik Øverby fi 7333ff3979SEirik Øverby else 7433ff3979SEirik Øverby echo "Key file $k not found, empty or unreadable. Skipping $fs.." 7533ff3979SEirik Øverby fi 7633ff3979SEirik Øverby} 7733ff3979SEirik Øverby 7833ff3979SEirik Øverbylock_fs() 7933ff3979SEirik Øverby{ 8033ff3979SEirik Øverby local fs=$1 8133ff3979SEirik Øverby 8233ff3979SEirik Øverby if [ "$(zfs get -Ho value mounted "$fs")" = 'yes' ]; then 8333ff3979SEirik Øverby if checkyesno zfskeys_unload_force ; then 8433ff3979SEirik Øverby zfs unmount -f "$fs" && echo "Forcibly unmounted $fs." 8533ff3979SEirik Øverby else 8633ff3979SEirik Øverby zfs unmount "$fs" && echo "Unmounted $fs." 8733ff3979SEirik Øverby fi 8833ff3979SEirik Øverby fi 8933ff3979SEirik Øverby if [ "$?" -ne 0 ]; then 9033ff3979SEirik Øverby echo "Unmount failed for $fs" 9133ff3979SEirik Øverby elif [ "$(zfs get -Ho value keystatus "$fs")" = 'available' ]; then 9233ff3979SEirik Øverby zfs unload-key "$fs" && echo "Unloaded key for $fs." 9333ff3979SEirik Øverby else 9433ff3979SEirik Øverby echo "No key loaded for $fs." 9533ff3979SEirik Øverby fi 9633ff3979SEirik Øverby} 9733ff3979SEirik Øverby 9833ff3979SEirik Øverbystatus_zfs_keys() 9933ff3979SEirik Øverby{ 10033ff3979SEirik Øverby local IFS=$(printf "\t") 10133ff3979SEirik Øverby 10233ff3979SEirik Øverby list_datasets | while read kl fs ; do 10333ff3979SEirik Øverby echo "$fs: $(zfs get -Ho value keystatus "$fs")" 10433ff3979SEirik Øverby done 10533ff3979SEirik Øverby} 10633ff3979SEirik Øverby 10733ff3979SEirik Øverbyload_zfs_keys() 10833ff3979SEirik Øverby{ 10933ff3979SEirik Øverby local IFS=$(printf "\t") 11033ff3979SEirik Øverby 11133ff3979SEirik Øverby list_datasets | while read kl fs ; do 11233ff3979SEirik Øverby unlock_fs "$fs" "$kl" 11333ff3979SEirik Øverby done 11433ff3979SEirik Øverby} 11533ff3979SEirik Øverby 11633ff3979SEirik Øverbyunload_zfs_keys() 11733ff3979SEirik Øverby{ 11833ff3979SEirik Øverby local IFS=$(printf "\t") 11933ff3979SEirik Øverby 12033ff3979SEirik Øverby list_datasets | while read kl fs ; do 12133ff3979SEirik Øverby lock_fs "$fs" 12233ff3979SEirik Øverby done 12333ff3979SEirik Øverby} 12433ff3979SEirik Øverby 12533ff3979SEirik Øverbyzfskeys_args=$(encode_args "$@") 12633ff3979SEirik Øverbyload_rc_config $name 127f99f0ee1SAlexander Leidinger 128f99f0ee1SAlexander Leidinger# doesn't make sense to run in a svcj: config setting 129f99f0ee1SAlexander Leidingerzfskeys_svcj="NO" 130f99f0ee1SAlexander Leidinger 13133ff3979SEirik Øverbyrun_rc_command "$1" 132