xref: /freebsd/libexec/rc/rc.d/zfskeys (revision 408087f128fe745dbfb2b8423f0afd9e0ce2d11a)
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