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# 20 21. $STF_SUITE/include/libtest.shlib 22 23# 24# DESCRIPTION: 25# ZFS should receive streams from raw incremental sends. 26# 27# STRATEGY: 28# 1. Create an encrypted dataset 29# 2. Snapshot the dataset 30# 3. Create a file and get its checksum 31# 4. Snapshot the dataset 32# 5. Attempt to receive a raw send stream of the first snapshot 33# 6. Change the passphrase required to unlock the original filesystem 34# 7. Attempt and intentionally fail to receive the second snapshot 35# 8. Verify that the required passphrase hasn't changed on the receive side 36# 9. Attempt a real raw incremental send stream of the second snapshot 37# 10. Attempt load the key and mount the dataset 38# 11. Verify the checksum of the file is the same as the original 39# 40 41verify_runnable "both" 42 43function cleanup 44{ 45 datasetexists $TESTPOOL/$TESTFS1 && \ 46 log_must zfs destroy -r $TESTPOOL/$TESTFS1 47 48 datasetexists $TESTPOOL/$TESTFS2 && \ 49 log_must zfs destroy -r $TESTPOOL/$TESTFS2 50 51 [[ -f $ibackup ]] && log_must rm -f $ibackup 52} 53 54log_onexit cleanup 55 56log_assert "ZFS should receive streams from raw incremental sends" 57 58typeset ibackup="/var/tmp/ibackup.$$" 59typeset ibackup_trunc="/var/tmp/ibackup_trunc.$$" 60typeset passphrase="password" 61typeset passphrase2="password2" 62typeset snap1="$TESTPOOL/$TESTFS1@snap1" 63typeset snap2="$TESTPOOL/$TESTFS1@snap2" 64 65log_must eval "echo $passphrase | zfs create -o encryption=on" \ 66 "-o keyformat=passphrase $TESTPOOL/$TESTFS1" 67 68log_must zfs snapshot $snap1 69 70log_must mkfile 1M /$TESTPOOL/$TESTFS1/$TESTFILE0 71typeset checksum=$(md5sum /$TESTPOOL/$TESTFS1/$TESTFILE0 | awk '{ print $1 }') 72 73log_must zfs snapshot $snap2 74 75log_must eval "zfs send -w $snap1 | zfs receive $TESTPOOL/$TESTFS2" 76log_must eval "echo $passphrase2 | zfs change-key $TESTPOOL/$TESTFS1" 77log_must eval "zfs send -w -i $snap1 $snap2 > $ibackup" 78 79typeset trunc_size=$(stat -c %s $ibackup) 80trunc_size=$(expr $trunc_size - 64) 81log_must cp $ibackup $ibackup_trunc 82log_must truncate -s $trunc_size $ibackup_trunc 83log_mustnot eval "zfs receive $TESTPOOL/$TESTFS2 < $ibackup_trunc" 84log_mustnot eval "echo $passphrase2 | zfs load-key $TESTPOOL/$TESTFS2" 85log_must eval "echo $passphrase | zfs load-key $TESTPOOL/$TESTFS2" 86log_must zfs unload-key $TESTPOOL/$TESTFS2 87 88log_must eval "zfs receive $TESTPOOL/$TESTFS2 < $ibackup" 89log_must eval "echo $passphrase2 | zfs mount -l $TESTPOOL/$TESTFS2" 90 91typeset cksum1=$(md5sum /$TESTPOOL/$TESTFS2/$TESTFILE0 | awk '{ print $1 }') 92[[ "$cksum1" == "$checksum" ]] || \ 93 log_fail "Checksums differ ($cksum1 != $checksum)" 94 95log_pass "ZFS can receive streams from raw incremental sends" 96