Skip to content

Commit 9accb04

Browse files
committed
warn on check failure - fixes #43
1 parent 4ca0684 commit 9accb04

File tree

2 files changed

+115
-41
lines changed

2 files changed

+115
-41
lines changed

test/test.sh

+89-27
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#!/usr/bin/env dash
2-
# shellcheck disable=SC2030,SC2031
2+
# shellcheck disable=SC2030,SC2031,SC2034
33
## ^^ tests are intentionally run in subshells
4+
## variables that appear unused here are used by main script
45

56
## test.sh contains zfs-replicate test cases
67
set -eu ## fail on errors and undefined variables
@@ -16,7 +17,6 @@ SCRIPT_PATH="${0%/*}"
1617
_fail() {
1718
line=$1
1819
match=$2
19-
## verbose testing
2020
## hack to match blank lines
2121
if [ "$match" = "null" ] && [ -n "$line" ]; then
2222
printf "FAILED '%s' != ''\n" "$line" && exit 1
@@ -30,44 +30,35 @@ _fail() {
3030

3131
_testZFSReplicate() {
3232
## wrapper for easy matching
33-
export ECHO="echo"
34-
## define test conditions
35-
export FIND="${SCRIPT_PATH}/find.sh"
36-
export ZFS="${SCRIPT_PATH}/zfs.sh"
37-
export SSH="${SCRIPT_PATH}/ssh.sh"
38-
export HOST_CHECK="${ECHO} %HOST%"
39-
export SYSLOG=0
40-
REPLICATE_SETS="srcPool0/srcFS0:dstPool0/dstFS0"
41-
REPLICATE_SETS="${REPLICATE_SETS} srcPool1/srcFS1/subFS1:dstPool1/dstFS1@dstHost1"
42-
REPLICATE_SETS="${REPLICATE_SETS} srcPool2/srcFS2:dstPool2/dstFS2@dstHost2"
43-
REPLICATE_SETS="${REPLICATE_SETS} srcPool3/srcFS3@srcHost3:dstPool3/dstFS3"
44-
REPLICATE_SETS="${REPLICATE_SETS} srcPool4/srcFS4@srcHost4:dstPool4/dstFS4@dstHost4"
33+
ECHO="echo"
34+
## disable syslog for tests
35+
SYSLOG=0
4536

4637
## test loadConfig
4738
(
48-
## source script functions
4939
# shellcheck source=/dev/null
5040
. ../zfs-replicate.sh
51-
printf "_testSetsNoConfig/loadConfig\n" ## we expect no output and clean exit
41+
printf "_testZFSReplicate/loadConfigWithError\n"
5242
loadConfig | awk '{ print NR-1, $0 }' | while read -r idx line; do
5343
printf "%d %s\n" "$idx" "$line"
5444
case $idx in
55-
*)
56-
_fail "$line" "null"
45+
0)
46+
_fail "$line" "missing required setting REPLICATE_SETS"
5747
;;
5848
esac
5949
done
6050
)
6151

62-
## test config override
52+
## test config override of script defaults
6353
(
6454
## likely default values at script load time
55+
FIND="/usr/bin/find"
6556
ZFS="/sbin/zfs"
6657
SSH="/usr/sbin/ssh"
67-
## source script functions
58+
REPLICATE_SETS="fakeSource:fakeDest"
6859
# shellcheck source=/dev/null
6960
. ../zfs-replicate.sh
70-
printf "_testSetsNoConfig/loadConfigOverrideDefaults\n"
61+
printf "_testZFSReplicate/loadConfigOverrideDefaults\n"
7162
_fail "/usr/sbin/ssh %HOST% /sbin/zfs receive -vFd" "$DEST_PIPE_WITH_HOST"
7263
_fail "/sbin/zfs receive -vFd" "$DEST_PIPE_WITHOUT_HOST"
7364
## generate config
@@ -81,12 +72,21 @@ _testZFSReplicate() {
8172
_fail "myZFS receive -vFd" "$DEST_PIPE_WITHOUT_HOST"
8273
)
8374

84-
## test snapCreate
75+
## test snapCreate with different set combinations
8576
(
86-
## source script functions
77+
## configure test parameters
78+
FIND="${SCRIPT_PATH}/find.sh"
79+
ZFS="${SCRIPT_PATH}/zfs.sh"
80+
SSH="${SCRIPT_PATH}/ssh.sh"
81+
HOST_CHECK="${ECHO} %HOST%"
82+
REPLICATE_SETS="srcPool0/srcFS0:dstPool0/dstFS0"
83+
REPLICATE_SETS="${REPLICATE_SETS} srcPool1/srcFS1/subFS1:dstPool1/dstFS1@dstHost1"
84+
REPLICATE_SETS="${REPLICATE_SETS} srcPool2/srcFS2:dstPool2/dstFS2@dstHost2"
85+
REPLICATE_SETS="${REPLICATE_SETS} srcPool3/srcFS3@srcHost3:dstPool3/dstFS3"
86+
REPLICATE_SETS="${REPLICATE_SETS} srcPool4/srcFS4@srcHost4:dstPool4/dstFS4@dstHost4"
8787
# shellcheck source=/dev/null
8888
. ../zfs-replicate.sh && loadConfig
89-
printf "_testSetsNoConfig/snapCreate\n"
89+
printf "_testZFSReplicate/snapCreateWithoutErrors\n"
9090
snapCreate | awk '{ print NR-1, $0 }' | while read -r idx line; do
9191
match=""
9292
printf "%d %s\n" "$idx" "$line"
@@ -221,24 +221,86 @@ _testZFSReplicate() {
221221
done
222222
)
223223

224-
## test exitClean
224+
## test snapCreate with host check errors
225225
(
226+
## configure test parameters
227+
FIND="${SCRIPT_PATH}/find.sh"
228+
ZFS="${SCRIPT_PATH}/zfs.sh"
229+
SSH="${SCRIPT_PATH}/ssh.sh"
230+
HOST_CHECK="false"
231+
REPLICATE_SETS="srcPool0/srcFS0:dstPool0/dstFS0"
232+
REPLICATE_SETS="${REPLICATE_SETS} srcPool1/srcFS1/subFS1:dstPool1/dstFS1@dstHost1"
233+
REPLICATE_SETS="${REPLICATE_SETS} srcPool2/srcFS2:dstPool2/dstFS2@dstHost2"
234+
REPLICATE_SETS="${REPLICATE_SETS} srcPool3/srcFS3@srcHost3:dstPool3/dstFS3"
235+
REPLICATE_SETS="${REPLICATE_SETS} srcPool4/srcFS4@srcHost4:dstPool4/dstFS4@dstHost4"
236+
# shellcheck source=/dev/null
237+
. ../zfs-replicate.sh && loadConfig
238+
printf "_testZFSReplicate/snapCreateWithHostCheckErrors\n"
239+
snapCreate | awk '{ print NR-1, $0 }' | while read -r idx line; do
240+
match=""
241+
printf "%d %s\n" "$idx" "$line"
242+
case $idx in
243+
17)
244+
match="source or destination host check failed"
245+
;;
246+
19)
247+
match="source or destination host check failed"
248+
;;
249+
21)
250+
match="source or destination host check failed"
251+
;;
252+
23)
253+
match="source or destination host check failed"
254+
;;
255+
esac
256+
_fail "$line" "$match"
257+
done
258+
)
259+
260+
## test exitClean code=0 and extra message
261+
(
262+
FIND="fakeFIND"
263+
ZFS="fakeZFS"
264+
SSH="fakeSSH"
265+
REPLICATE_SETS="fakeSource:fakeDest"
226266
## source script functions
227267
# shellcheck source=/dev/null
228268
. ../zfs-replicate.sh && loadConfig
229-
printf "_testSetsNoConfig/exitClean\n"
269+
printf "_testZFSReplicate/exitCleanSuccess\n"
230270
exitClean 0 "test message" | awk '{ print NR-1, $0 }' | while read -r idx line; do
231271
printf "%d %s\n" "$idx" "$line"
232272
case $idx in
233273
0)
234-
match="success total sets 0 skipped 0: test message"
274+
match="success total sets 0 skipped 0: test message" ## counts in test are always zero
275+
_fail "$line" "$match"
276+
;;
277+
esac
278+
done
279+
)
280+
281+
## test exitClean code=99 with error message
282+
(
283+
FIND="fakeFIND"
284+
ZFS="fakeZFS"
285+
SSH="fakeSSH"
286+
REPLICATE_SETS="fakeSource:fakeDest"
287+
## source script functions
288+
# shellcheck source=/dev/null
289+
. ../zfs-replicate.sh && loadConfig
290+
printf "_testZFSReplicate/exitCleanError\n"
291+
exitClean 99 "error message" | awk '{ print NR-1, $0 }' | while read -r idx line; do
292+
printf "%d %s\n" "$idx" "$line"
293+
case $idx in
294+
0)
295+
match="operation exited unexpectedly: code=99 msg=error message"
235296
_fail "$line" "$match"
236297
;;
237298
esac
238299
done
239300
)
240301

241302
## yay, tests completed!
303+
printf "Tests Complete: No Error!\n"
242304
return 0
243305
}
244306

zfs-replicate.sh

+26-14
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ __SKIP_COUNT=0
5252
sortLogs() {
5353
## check if file logging is enabled
5454
if [ -z "$LOG_BASE" ] || [ ! -d "$LOG_BASE" ]; then
55-
return
55+
return 0
5656
fi
5757
## find existing logs
5858
logs=$($FIND "$LOG_BASE" -maxdepth 1 -type f -name 'autorep-*')
@@ -147,15 +147,19 @@ checkLock() {
147147
checkHost() {
148148
## do we have a host check defined
149149
if [ -z "$HOST_CHECK" ]; then
150-
return
150+
return 0
151151
fi
152152
host=$1
153+
if [ -z "$host" ]; then
154+
return 0
155+
fi
153156
cmd=$(printf "%s\n" "$HOST_CHECK" | sed "s/%HOST%/$host/g")
154157
printf "checking host cmd=%s\n" "$cmd"
155158
## run the check
156159
if ! $cmd > /dev/null 2>&1; then
157-
exitClean 128 "host check failed"
160+
return 1
158161
fi
162+
return 0
159163
}
160164

161165
## ensure dataset exists
@@ -171,8 +175,9 @@ checkDataset() {
171175
printf "checking dataset cmd=%s\n" "$cmd"
172176
## execute command
173177
if ! $cmd; then
174-
exitClean 128 "failed to list dataset: $set"
178+
return 1
175179
fi
180+
return 0
176181
}
177182

178183
## small wrapper around zfs destroy
@@ -271,29 +276,36 @@ snapCreate() {
271276
if [ "$ALLOW_ROOT_DATASETS" -ne 1 ]; then
272277
if [ "$dst" = "$(basename "$dst")" ] || [ "$dst" = "$(basename "$dst")/" ]; then
273278
temps="replicating root datasets can lead to data loss - set ALLOW_ROOT_DATASETS=1 to override"
274-
printf "WARNING: %s\n" "$temps"
279+
printf "WARNING: skipping replication set '%s' - %s\n" "$pair" "$temps"
275280
__SKIP_COUNT=$((__SKIP_COUNT + 1))
276281
continue
277282
fi
278283
fi
279284
## init source and destination host in each loop iteration
280285
srcHost=""
281286
dstHost=""
282-
## look for host options on source and check host if found
287+
## look for source host option
283288
if [ "${src#*"@"}" != "$src" ]; then
284289
srcHost=$(printf "%s\n" "$src" | cut -f2 -d@)
285-
checkHost "$srcHost"
286290
src=$(printf "%s\n" "$src" | cut -f1 -d@)
287291
fi
288-
## look for host options on destination and check host if found
292+
## look for destination host option
289293
if [ "${dst#*"@"}" != "$dst" ]; then
290294
dstHost=$(printf "%s\n" "$dst" | cut -f2 -d@)
291-
checkHost "$dstHost"
292295
dst=$(printf "%s\n" "$dst" | cut -f1 -d@)
293296
fi
297+
## check source and destination hosts
298+
if ! checkHost "$srcHost" || ! checkHost "$dstHost"; then
299+
printf "WARNING: skipping replication set '%s' - source or destination host check failed\n" "$pair"
300+
__SKIP_COUNT=$((__SKIP_COUNT + 1))
301+
continue
302+
fi
294303
## check source and destination datasets
295-
checkDataset "$src" "$srcHost"
296-
checkDataset "$dst" "$dstHost"
304+
if ! checkDataset "$src" "$srcHost" || ! checkDataset "$dst" "$dstHost"; then
305+
printf "WARNING: skipping replication set '%s' - source or destination dataset check failed\n" "$pair"
306+
__SKIP_COUNT=$((__SKIP_COUNT + 1))
307+
continue
308+
fi
297309
## get source and destination snapshots
298310
srcSnaps=$(snapList "$src" "$srcHost" 1)
299311
dstSnaps=$(snapList "$dst" "$dstHost" 0)
@@ -508,9 +520,6 @@ loadConfig() {
508520
if [ -n "$LOG_BASE" ] && [ ! -d "$LOG_BASE" ]; then
509521
mkdir -p "$LOG_BASE"
510522
fi
511-
if [ -z "$FIND" ]; then
512-
writeLog "ERROR: unable to locate system find binary" && exit 1
513-
fi
514523
## we have all we need for status
515524
if [ "$status" -eq 1 ]; then
516525
showStatus
@@ -525,6 +534,9 @@ loadConfig() {
525534
if [ "$SNAP_KEEP" -lt 2 ]; then
526535
writeLog "ERROR: a minimum of 2 snapshots are required for incremental sending" && exit 1
527536
fi
537+
if [ -z "$FIND" ]; then
538+
writeLog "ERROR: unable to locate system find binary" && exit 1
539+
fi
528540
if [ -z "$SSH" ]; then
529541
writeLog "ERROR: unable to locate system ssh binary" && exit 1
530542
fi

0 commit comments

Comments
 (0)