1#!/bin/sh 2 3# Copyright (C) Internet Systems Consortium, Inc. ("ISC") 4# 5# SPDX-License-Identifier: MPL-2.0 6# 7# This Source Code Form is subject to the terms of the Mozilla Public 8# License, v. 2.0. If a copy of the MPL was not distributed with this 9# file, you can obtain one at https://mozilla.org/MPL/2.0/. 10# 11# See the COPYRIGHT file distributed with this work for additional 12# information regarding copyright ownership. 13 14set -e 15 16. ../conf.sh 17 18dig_with_opts() { 19 "$DIG" @10.53.0.1 -p "$PORT" +tcp "$@" 20} 21 22rndc_with_opts() { 23 "$RNDC" -c ../_common/rndc.conf -p "$CONTROLPORT" -s "$@" 24} 25 26status=0 27n=0 28 29n=$((n + 1)) 30echo_i "check outdated journal rolled forward (dynamic) ($n)" 31ret=0 32dig_with_opts changed soa >dig.out.test$n 33grep 'status: NOERROR' dig.out.test$n >/dev/null || ret=1 34grep '2012010902' dig.out.test$n >/dev/null || ret=1 35grep 'zone changed/IN: journal rollforward completed successfully using old journal format' ns1/named.run >/dev/null || ret=1 36[ $ret -eq 0 ] || echo_i "failed" 37status=$((status + ret)) 38 39n=$((n + 1)) 40echo_i "check outdated empty journal did not cause an error (dynamic) ($n)" 41ret=0 42dig_with_opts unchanged soa >dig.out.test$n 43grep 'status: NOERROR' dig.out.test$n >/dev/null || ret=1 44grep '2012010901' dig.out.test$n >/dev/null || ret=1 45[ $ret -eq 0 ] || echo_i "failed" 46status=$((status + ret)) 47 48n=$((n + 1)) 49echo_i "check outdated journals were updated or removed (dynamic) ($n)" 50ret=0 51cat -v ns1/changed.db.jnl | grep "BIND LOG V9.2" >/dev/null || ret=1 52[ -f ns1/unchanged.db.jnl ] && ret=1 53[ $ret -eq 0 ] || echo_i "failed" 54status=$((status + ret)) 55 56n=$((n + 1)) 57echo_i "check updated journal has correct RR count (dynamic) ($n)" 58ret=0 59$JOURNALPRINT -x ns1/changed.db.jnl | grep "rrcount 3 " >/dev/null || ret=1 60[ $ret -eq 0 ] || echo_i "failed" 61status=$((status + ret)) 62 63n=$((n + 1)) 64echo_i "check new-format journal rolled forward (dynamic) ($n)" 65ret=0 66dig_with_opts changed2 soa >dig.out.test$n 67grep 'status: NOERROR' dig.out.test$n >/dev/null || ret=1 68grep '2012010902' dig.out.test$n >/dev/null || ret=1 69grep 'zone changed2/IN: journal rollforward completed successfully: success' ns1/named.run >/dev/null || ret=1 70grep 'zone changed2/IN: journal rollforward completed successfully using old journal format' ns1/named.run >/dev/null && ret=1 71[ $ret -eq 0 ] || echo_i "failed" 72status=$((status + ret)) 73 74n=$((n + 1)) 75echo_i "check new-format empty journal did not cause error (dynamic) ($n)" 76ret=0 77dig_with_opts unchanged2 soa >dig.out.test$n 78grep 'status: NOERROR' dig.out.test$n >/dev/null || ret=1 79grep '2012010901' dig.out.test$n >/dev/null || ret=1 80grep 'zone unchanged2/IN: journal rollforward completed successfully' ns1/named.run >/dev/null && ret=1 81grep 'zone unchanged2/IN: journal rollforward completed successfully using old journal format' ns1/named.run >/dev/null && ret=1 82[ $ret -eq 0 ] || echo_i "failed" 83status=$((status + ret)) 84 85n=$((n + 1)) 86echo_i "check new-format journals were updated or removed (dynamic) ($n)" 87ret=0 88cat -v ns1/changed2.db.jnl | grep "BIND LOG V9.2" >/dev/null || ret=1 89[ -f ns1/unchanged2.db.jnl ] && ret=1 90[ $ret -eq 0 ] || echo_i "failed" 91status=$((status + ret)) 92 93n=$((n + 1)) 94echo_i "check outdated up-to-date journal succeeded (ixfr-from-differences) ($n)" 95ret=0 96dig_with_opts -t soa ixfr >dig.out.test$n 97grep 'status: NOERROR' dig.out.test$n >/dev/null || ret=1 98grep '2012010902' dig.out.test$n >/dev/null || ret=1 99grep 'zone ixfr/IN: journal rollforward completed successfully using old journal format: up to date' ns1/named.run >/dev/null || ret=1 100[ $ret -eq 0 ] || echo_i "failed" 101status=$((status + ret)) 102 103n=$((n + 1)) 104echo_i "check outdated journal was updated (ixfr-from-differences) ($n)" 105ret=0 106cat -v ns1/ixfr.db.jnl | grep "BIND LOG V9.2" >/dev/null || ret=1 107[ $ret -eq 0 ] || echo_i "failed" 108status=$((status + ret)) 109 110n=$((n + 1)) 111echo_i "check journal with mixed headers succeeded (version 1,2,1,2) ($n)" 112ret=0 113dig_with_opts -t soa hdr1d1d2d1d2 >dig.out.test$n 114grep 'status: NOERROR' dig.out.test$n >/dev/null || ret=1 115grep '2012010905' dig.out.test$n >/dev/null || ret=1 116grep 'zone hdr1d1d2d1d2/IN: journal rollforward completed successfully using old journal format: success' ns1/named.run >/dev/null || ret=1 117grep 'zone_journal_compact: zone hdr1d1d2d1d2/IN: repair full journal' ns1/named.run >/dev/null || ret=1 118grep 'hdr1d1d2d1d2/IN: dns_journal_compact: success' ns1/named.run >/dev/null || ret=1 119[ $ret -eq 0 ] || echo_i "failed" 120status=$((status + ret)) 121 122n=$((n + 1)) 123echo_i "check journal with mixed headers was updated (version 1,2,1,2) ($n)" 124ret=0 125[ $($JOURNALPRINT -x ns1/d1212.jnl.saved | grep -c "version 1") -eq 2 ] || ret=1 126[ $($JOURNALPRINT -x ns1/d1212.jnl.saved | grep -c "version 2") -eq 2 ] || ret=1 127[ $($JOURNALPRINT -x ns1/d1212.db.jnl | grep -c "version 1") -eq 0 ] || ret=1 128[ $($JOURNALPRINT -x ns1/d1212.db.jnl | grep -c "version 2") -eq 4 ] || ret=1 129[ $ret -eq 0 ] || echo_i "failed" 130status=$((status + ret)) 131 132n=$((n + 1)) 133echo_i "check journal with mixed headers succeeded (version 2,1,2,1) ($n)" 134ret=0 135dig_with_opts -t soa hdr1d2d1d2d1 >dig.out.test$n 136grep 'status: NOERROR' dig.out.test$n >/dev/null || ret=1 137grep '2012010905' dig.out.test$n >/dev/null || ret=1 138grep 'zone hdr1d2d1d2d1/IN: journal rollforward completed successfully using old journal format: success' ns1/named.run >/dev/null || ret=1 139grep 'zone_journal_compact: zone hdr1d2d1d2d1/IN: repair full journal' ns1/named.run >/dev/null || ret=1 140grep 'zone hdr1d2d1d2d1/IN: dns_journal_compact: success' ns1/named.run >/dev/null || ret=1 141[ $ret -eq 0 ] || echo_i "failed" 142status=$((status + ret)) 143 144n=$((n + 1)) 145echo_i "check journal with mixed headers was updated (version 2,1,2,1) ($n)" 146ret=0 147[ $($JOURNALPRINT -x ns1/d2121.jnl.saved | grep -c "version 1") -eq 2 ] || ret=1 148[ $($JOURNALPRINT -x ns1/d2121.jnl.saved | grep -c "version 2") -eq 2 ] || ret=1 149[ $($JOURNALPRINT -x ns1/d2121.db.jnl | grep -c "version 1") -eq 0 ] || ret=1 150[ $($JOURNALPRINT -x ns1/d2121.db.jnl | grep -c "version 2") -eq 4 ] || ret=1 151[ $ret -eq 0 ] || echo_i "failed" 152status=$((status + ret)) 153 154n=$((n + 1)) 155echo_i "check there are no journals left un-updated ($n)" 156ret=0 157c1=$(cat -v ns1/*.jnl | grep -c "BIND LOG V9") 158c2=$(cat -v ns1/*.jnl | grep -c "BIND LOG V9.2") 159[ ${c1} -eq ${c2} ] || ret=1 160[ $ret -eq 0 ] || echo_i "failed" 161status=$((status + ret)) 162 163n=$((n + 1)) 164echo_i "Check that journal with mixed headers can be compacted (version 1,2,1,2) ($n)" 165ret=0 166journal=ns1/d1212.jnl.saved 167seriallist=$($JOURNALPRINT -x $journal | awk '$1 == "Transaction:" { print $11 }') 168for serial in $seriallist; do 169 cp $journal tmp.jnl 170 $JOURNALPRINT -c $serial tmp.jnl || ret=1 171done 172[ $ret -eq 0 ] || echo_i "failed" 173status=$((status + ret)) 174 175n=$((n + 1)) 176echo_i "Check that journal with mixed headers can be compacted (version 2,1,2,1) ($n)" 177ret=0 178journal=ns1/d2121.jnl.saved 179seriallist=$($JOURNALPRINT -x $journal | awk '$1 == "Transaction:" { print $11 }') 180for serial in $seriallist; do 181 cp ns1/d1212.jnl.saved tmp.jnl 182 $JOURNALPRINT -c $serial tmp.jnl || ret=1 183done 184[ $ret -eq 0 ] || echo_i "failed" 185status=$((status + ret)) 186 187n=$((n + 1)) 188echo_i "check upgrade of managed-keys.bind.jnl succeeded($n)" 189ret=0 190$JOURNALPRINT ns1/managed-keys.bind.jnl >journalprint.out.test$n 191lines=$(awk '$1 == "add" && $5 == "SOA" && $8 == "3297" { print }' journalprint.out.test$n | wc -l) 192test $lines -eq 1 || ret=1 193[ $ret -eq 0 ] || echo_i "failed" 194status=$((status + ret)) 195 196n=$((n + 1)) 197echo_i "check journal downgrade/upgrade ($n)" 198ret=0 199cp ns1/changed.db.jnl ns1/temp.jnl 200$JOURNALPRINT -d ns1/temp.jnl 201[ $($JOURNALPRINT -x ns1/temp.jnl | grep -c "version 1") -eq 1 ] || ret=1 202$JOURNALPRINT -x ns1/temp.jnl | grep -q "Header version = 1" || ret=1 203$JOURNALPRINT -u ns1/temp.jnl 204$JOURNALPRINT -x ns1/temp.jnl | grep -q "Header version = 2" || ret=1 205[ $($JOURNALPRINT -x ns1/temp.jnl | grep -c "version 2") -eq 1 ] || ret=1 206[ $ret -eq 0 ] || echo_i "failed" 207status=$((status + ret)) 208 209n=$((n + 1)) 210echo_i "check max-journal-size works after journal update ($n)" 211ret=0 212# journal was repaired, it should still be big 213[ $(wc -c <ns1/maxjournal.db.jnl) -gt 12000 ] || ret=1 214# the zone hasn't been dumped yet, so 'rndc sync' should work without 215# needing a zone update first. 216rndc_with_opts 10.53.0.1 sync maxjournal 217check_size() ( 218 [ $(wc -c <ns1/maxjournal.db.jnl) -lt 4000 ] 219) 220retry_quiet 10 check_size || ret=1 221[ $ret -eq 0 ] || echo_i "failed" 222status=$((status + ret)) 223 224n=$((n + 1)) 225echo_i "check max-journal-size works with non-updated journals ($n)" 226ret=0 227# journal was not repaired, so it should still be big 228[ $(wc -c <ns1/maxjournal2.db.jnl) -gt 12000 ] || ret=1 229# the zone hasn't been dumped yet, so 'rndc sync' should work without 230# needing a zone update first. 231rndc_with_opts 10.53.0.1 sync maxjournal2 232check_size() ( 233 [ $(wc -c <ns1/maxjournal2.db.jnl) -lt 4000 ] 234) 235retry_quiet 10 check_size || ret=1 236[ $ret -eq 0 ] || echo_i "failed" 237status=$((status + ret)) 238 239n=$((n + 1)) 240echo_i "check journal index consistency ($n)" 241ret=0 242for jnl in ns1/*.jnl; do 243 $JOURNALPRINT -x $jnl 2>&1 | grep -q "Offset mismatch" && ret=1 244done 245[ $ret -eq 0 ] || echo_i "failed" 246status=$((status + ret)) 247 248n=$((n + 1)) 249echo_i "check that journal is applied to zone with keydata placeholder record" 250ret=0 251grep 'managed-keys-zone: journal rollforward completed successfully: up to date' ns2/named.run >/dev/null 2>&1 || ret=1 252[ $ret -eq 0 ] || echo_i "failed" 253 254echo_i "exit status: $status" 255[ $status -eq 0 ] || exit 1 256