1#!/bin/ksh -p 2# 3# CDDL HEADER START 4# 5# This file and its contents are supplied under the terms of the 6# Common Development and Distribution License ("CDDL"), version 1.0. 7# You may only use this file in accordance with the terms of version 8# 1.0 of the CDDL. 9# 10# A full copy of the text of the CDDL should have accompanied this 11# source. A copy of the CDDL is also available via the Internet at 12# http://www.illumos.org/license/CDDL. 13# 14# CDDL HEADER END 15# 16 17# 18# Copyright (c) 2017 Datto, Inc. All rights reserved. 19# Copyright 2020 Joyent, Inc. 20# 21 22. $STF_SUITE/include/libtest.shlib 23 24# 25# DESCRIPTION: 26# ZFS should receive streams from raw incremental sends. 27# 28# STRATEGY: 29# 1. Create an encrypted dataset 30# 2. Snapshot the dataset 31# 3. Create a file and get its checksum 32# 4. Snapshot the dataset 33# 5. Attempt to receive a raw send stream of the first snapshot 34# 6. Change the passphrase required to unlock the original filesystem 35# 7. Attempt and intentionally fail to receive the second snapshot 36# 8. Verify that the required passphrase hasn't changed on the receive side 37# 9. Attempt a real raw incremental send stream of the second snapshot 38# 10. Attempt load the key and mount the dataset 39# 11. Verify the checksum of the file is the same as the original 40# 41 42verify_runnable "both" 43 44function cleanup 45{ 46 datasetexists $TESTPOOL/$TESTFS1 && \ 47 log_must zfs destroy -r $TESTPOOL/$TESTFS1 48 49 datasetexists $TESTPOOL/$TESTFS2 && \ 50 log_must zfs destroy -r $TESTPOOL/$TESTFS2 51 52 [[ -f $ibackup ]] && log_must rm -f $ibackup 53} 54 55log_onexit cleanup 56 57log_assert "ZFS should receive streams from raw incremental sends" 58 59typeset ibackup="/var/tmp/ibackup.$$" 60typeset ibackup_trunc="/var/tmp/ibackup_trunc.$$" 61typeset passphrase="password" 62typeset passphrase2="password2" 63typeset snap1="$TESTPOOL/$TESTFS1@snap1" 64typeset snap2="$TESTPOOL/$TESTFS1@snap2" 65 66log_must eval "echo $passphrase | zfs create -o encryption=on" \ 67 "-o keyformat=passphrase $TESTPOOL/$TESTFS1" 68 69log_must zfs snapshot $snap1 70 71log_must mkfile 1M /$TESTPOOL/$TESTFS1/$TESTFILE0 72typeset checksum=$(digest -a md5 /$TESTPOOL/$TESTFS1/$TESTFILE0) 73 74log_must zfs snapshot $snap2 75 76log_must eval "zfs send -w $snap1 | zfs receive $TESTPOOL/$TESTFS2" 77log_must eval "echo $passphrase2 | zfs change-key $TESTPOOL/$TESTFS1" 78log_must eval "zfs send -w -i $snap1 $snap2 > $ibackup" 79 80typeset trunc_size=$(stat -c %s $ibackup) 81trunc_size=$(expr $trunc_size - 64) 82log_must cp $ibackup $ibackup_trunc 83log_must truncate -s $trunc_size $ibackup_trunc 84log_mustnot eval "zfs receive $TESTPOOL/$TESTFS2 < $ibackup_trunc" 85log_mustnot eval "echo $passphrase2 | zfs load-key $TESTPOOL/$TESTFS2" 86log_must eval "echo $passphrase | zfs load-key $TESTPOOL/$TESTFS2" 87log_must zfs unload-key $TESTPOOL/$TESTFS2 88 89log_must eval "zfs receive $TESTPOOL/$TESTFS2 < $ibackup" 90log_must eval "echo $passphrase2 | zfs mount -l $TESTPOOL/$TESTFS2" 91 92typeset cksum1=$(digest -a md5 /$TESTPOOL/$TESTFS2/$TESTFILE0) 93[[ "$cksum1" == "$checksum" ]] || \ 94 log_fail "Checksums differ ($cksum1 != $checksum)" 95 96log_pass "ZFS can receive streams from raw incremental sends" 97