1*00b67f09SDavid van Moolenbroek#!/bin/sh 2*00b67f09SDavid van Moolenbroek# 3*00b67f09SDavid van Moolenbroek# Copyright (C) 2005, 2007, 2011-2014 Internet Systems Consortium, Inc. ("ISC") 4*00b67f09SDavid van Moolenbroek# 5*00b67f09SDavid van Moolenbroek# Permission to use, copy, modify, and/or distribute this software for any 6*00b67f09SDavid van Moolenbroek# purpose with or without fee is hereby granted, provided that the above 7*00b67f09SDavid van Moolenbroek# copyright notice and this permission notice appear in all copies. 8*00b67f09SDavid van Moolenbroek# 9*00b67f09SDavid van Moolenbroek# THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH 10*00b67f09SDavid van Moolenbroek# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 11*00b67f09SDavid van Moolenbroek# AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, 12*00b67f09SDavid van Moolenbroek# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 13*00b67f09SDavid van Moolenbroek# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE 14*00b67f09SDavid van Moolenbroek# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 15*00b67f09SDavid van Moolenbroek# PERFORMANCE OF THIS SOFTWARE. 16*00b67f09SDavid van Moolenbroek 17*00b67f09SDavid van Moolenbroek# Id 18*00b67f09SDavid van Moolenbroek 19*00b67f09SDavid van MoolenbroekSYSTEMTESTTOP=.. 20*00b67f09SDavid van Moolenbroek. $SYSTEMTESTTOP/conf.sh 21*00b67f09SDavid van Moolenbroek 22*00b67f09SDavid van Moolenbroekismap () { 23*00b67f09SDavid van Moolenbroek $PERL -e 'binmode STDIN; 24*00b67f09SDavid van Moolenbroek read(STDIN, $input, 8); 25*00b67f09SDavid van Moolenbroek ($style, $version) = unpack("NN", $input); 26*00b67f09SDavid van Moolenbroek exit 1 if ($style != 3 || $version > 1);' < $1 27*00b67f09SDavid van Moolenbroek return $? 28*00b67f09SDavid van Moolenbroek} 29*00b67f09SDavid van Moolenbroek 30*00b67f09SDavid van Moolenbroekisraw () { 31*00b67f09SDavid van Moolenbroek $PERL -e 'binmode STDIN; 32*00b67f09SDavid van Moolenbroek read(STDIN, $input, 8); 33*00b67f09SDavid van Moolenbroek ($style, $version) = unpack("NN", $input); 34*00b67f09SDavid van Moolenbroek exit 1 if ($style != 2 || $version > 1);' < $1 35*00b67f09SDavid van Moolenbroek return $? 36*00b67f09SDavid van Moolenbroek} 37*00b67f09SDavid van Moolenbroek 38*00b67f09SDavid van Moolenbroekrawversion () { 39*00b67f09SDavid van Moolenbroek $PERL -e 'binmode STDIN; 40*00b67f09SDavid van Moolenbroek read(STDIN, $input, 8); 41*00b67f09SDavid van Moolenbroek if (length($input) < 8) { print "not raw\n"; exit 0; }; 42*00b67f09SDavid van Moolenbroek ($style, $version) = unpack("NN", $input); 43*00b67f09SDavid van Moolenbroek print ($style == 2 || $style == 3 ? "$version\n" : 44*00b67f09SDavid van Moolenbroek "not raw or map\n");' < $1 45*00b67f09SDavid van Moolenbroek} 46*00b67f09SDavid van Moolenbroek 47*00b67f09SDavid van Moolenbroeksourceserial () { 48*00b67f09SDavid van Moolenbroek $PERL -e 'binmode STDIN; 49*00b67f09SDavid van Moolenbroek read(STDIN, $input, 20); 50*00b67f09SDavid van Moolenbroek if (length($input) < 20) { print "UNSET\n"; exit; }; 51*00b67f09SDavid van Moolenbroek ($format, $version, $dumptime, $flags, $sourceserial) = 52*00b67f09SDavid van Moolenbroek unpack("NNNNN", $input); 53*00b67f09SDavid van Moolenbroek if ($format != 2 || $version < 1) { print "UNSET\n"; exit; }; 54*00b67f09SDavid van Moolenbroek if ($flags & 02) { 55*00b67f09SDavid van Moolenbroek print $sourceserial . "\n"; 56*00b67f09SDavid van Moolenbroek } else { 57*00b67f09SDavid van Moolenbroek print "UNSET\n"; 58*00b67f09SDavid van Moolenbroek }' < $1 59*00b67f09SDavid van Moolenbroek} 60*00b67f09SDavid van Moolenbroek 61*00b67f09SDavid van Moolenbroekstomp () { 62*00b67f09SDavid van Moolenbroek $PERL -e 'open(my $file, "+<", $ARGV[0]); 63*00b67f09SDavid van Moolenbroek binmode $file; 64*00b67f09SDavid van Moolenbroek seek($file, $ARGV[1], 0); 65*00b67f09SDavid van Moolenbroek for (my $i = 0; $i < $ARGV[2]; $i++) { 66*00b67f09SDavid van Moolenbroek print $file pack('C', $ARGV[3]); 67*00b67f09SDavid van Moolenbroek } 68*00b67f09SDavid van Moolenbroek close($file);' $1 $2 $3 $4 69*00b67f09SDavid van Moolenbroek} 70*00b67f09SDavid van Moolenbroek 71*00b67f09SDavid van Moolenbroekrestart () { 72*00b67f09SDavid van Moolenbroek sleep 1 73*00b67f09SDavid van Moolenbroek (cd ..; $PERL start.pl --noclean --restart masterformat ns3) 74*00b67f09SDavid van Moolenbroek} 75*00b67f09SDavid van Moolenbroek 76*00b67f09SDavid van MoolenbroekDIGOPTS="+tcp +noauth +noadd +nosea +nostat +noquest +nocomm +nocmd" 77*00b67f09SDavid van Moolenbroek 78*00b67f09SDavid van Moolenbroekstatus=0 79*00b67f09SDavid van Moolenbroek 80*00b67f09SDavid van Moolenbroekecho "I:checking that master files in raw format loaded" 81*00b67f09SDavid van Moolenbroekret=0 82*00b67f09SDavid van Moolenbroekset -- 1 2 3 83*00b67f09SDavid van Moolenbroekfor zone in example example-explicit example-compat; do 84*00b67f09SDavid van Moolenbroek for server in $*; do 85*00b67f09SDavid van Moolenbroek for name in ns mx a aaaa cname dname txt rrsig nsec \ 86*00b67f09SDavid van Moolenbroek dnskey ds cdnskey cds; do 87*00b67f09SDavid van Moolenbroek $DIG $DIGOPTS $name.$zone. $name @10.53.0.$server -p 5300 88*00b67f09SDavid van Moolenbroek echo 89*00b67f09SDavid van Moolenbroek done > dig.out.$zone.$server 90*00b67f09SDavid van Moolenbroek done 91*00b67f09SDavid van Moolenbroek $PERL ../digcomp.pl dig.out.$zone.1 dig.out.$zone.2 || ret=1 92*00b67f09SDavid van Moolenbroek if [ $zone = "example" ]; then 93*00b67f09SDavid van Moolenbroek set -- 1 2 94*00b67f09SDavid van Moolenbroek $PERL ../digcomp.pl dig.out.$zone.1 dig.out.$zone.3 || ret=1 95*00b67f09SDavid van Moolenbroek fi 96*00b67f09SDavid van Moolenbroekdone 97*00b67f09SDavid van Moolenbroek[ $ret -eq 0 ] || echo "I:failed" 98*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret` 99*00b67f09SDavid van Moolenbroek 100*00b67f09SDavid van Moolenbroekecho "I:checking raw format versions" 101*00b67f09SDavid van Moolenbroekret=0 102*00b67f09SDavid van Moolenbroekisraw ns1/example.db.raw || ret=1 103*00b67f09SDavid van Moolenbroekisraw ns1/example.db.raw1 || ret=1 104*00b67f09SDavid van Moolenbroekisraw ns1/example.db.compat || ret=1 105*00b67f09SDavid van Moolenbroekismap ns1/example.db.map || ret=1 106*00b67f09SDavid van Moolenbroek[ "`rawversion ns1/example.db.raw`" = 1 ] || ret=1 107*00b67f09SDavid van Moolenbroek[ "`rawversion ns1/example.db.raw1`" = 1 ] || ret=1 108*00b67f09SDavid van Moolenbroek[ "`rawversion ns1/example.db.compat`" = 0 ] || ret=1 109*00b67f09SDavid van Moolenbroek[ "`rawversion ns1/example.db.map`" = 1 ] || ret=1 110*00b67f09SDavid van Moolenbroek[ $ret -eq 0 ] || echo "I:failed" 111*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret` 112*00b67f09SDavid van Moolenbroek 113*00b67f09SDavid van Moolenbroekecho "I:checking source serial numbers" 114*00b67f09SDavid van Moolenbroekret=0 115*00b67f09SDavid van Moolenbroek[ "`sourceserial ns1/example.db.raw`" = "UNSET" ] || ret=1 116*00b67f09SDavid van Moolenbroek[ "`sourceserial ns1/example.db.serial.raw`" = "3333" ] || ret=1 117*00b67f09SDavid van Moolenbroek[ $ret -eq 0 ] || echo "I:failed" 118*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret` 119*00b67f09SDavid van Moolenbroek 120*00b67f09SDavid van Moolenbroekecho "I:waiting for transfers to complete" 121*00b67f09SDavid van Moolenbroekfor i in 0 1 2 3 4 5 6 7 8 9 122*00b67f09SDavid van Moolenbroekdo 123*00b67f09SDavid van Moolenbroek test -f ns2/transfer.db.raw -a -f ns2/transfer.db.txt && break 124*00b67f09SDavid van Moolenbroek sleep 1 125*00b67f09SDavid van Moolenbroekdone 126*00b67f09SDavid van Moolenbroek 127*00b67f09SDavid van Moolenbroekecho "I:checking that slave was saved in raw format by default" 128*00b67f09SDavid van Moolenbroekret=0 129*00b67f09SDavid van Moolenbroekisraw ns2/transfer.db.raw || ret=1 130*00b67f09SDavid van Moolenbroek[ $ret -eq 0 ] || echo "I:failed" 131*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret` 132*00b67f09SDavid van Moolenbroek 133*00b67f09SDavid van Moolenbroekecho "I:checking that slave was saved in text format when configured" 134*00b67f09SDavid van Moolenbroekret=0 135*00b67f09SDavid van Moolenbroekisraw ns2/transfer.db.txt && ret=1 136*00b67f09SDavid van Moolenbroek[ $ret -eq 0 ] || echo "I:failed" 137*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret` 138*00b67f09SDavid van Moolenbroek 139*00b67f09SDavid van Moolenbroekecho "I:checking that slave formerly in text format is now raw" 140*00b67f09SDavid van Moolenbroekfor i in 0 1 2 3 4 5 6 7 8 9 141*00b67f09SDavid van Moolenbroekdo 142*00b67f09SDavid van Moolenbroek ret=0 143*00b67f09SDavid van Moolenbroek israw ns2/formerly-text.db > /dev/null 2>&1 || ret=1 144*00b67f09SDavid van Moolenbroek [ "`rawversion ns2/formerly-text.db`" = 1 ] || ret=1 145*00b67f09SDavid van Moolenbroek [ $ret -eq 0 ] && break 146*00b67f09SDavid van Moolenbroek sleep 1 147*00b67f09SDavid van Moolenbroekdone 148*00b67f09SDavid van Moolenbroek[ $ret -eq 0 ] || echo "I:failed" 149*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret` 150*00b67f09SDavid van Moolenbroek 151*00b67f09SDavid van Moolenbroekecho "I:checking that large rdatasets loaded" 152*00b67f09SDavid van Moolenbroekfor i in 0 1 2 3 4 5 6 7 8 9 153*00b67f09SDavid van Moolenbroekdo 154*00b67f09SDavid van Moolenbroekret=0 155*00b67f09SDavid van Moolenbroekfor a in a b c 156*00b67f09SDavid van Moolenbroekdo 157*00b67f09SDavid van Moolenbroek $DIG +tcp txt ${a}.large @10.53.0.2 -p 5300 > dig.out 158*00b67f09SDavid van Moolenbroek grep "status: NOERROR" dig.out > /dev/null || ret=1 159*00b67f09SDavid van Moolenbroekdone 160*00b67f09SDavid van Moolenbroek[ $ret -eq 0 ] && break 161*00b67f09SDavid van Moolenbroeksleep 1 162*00b67f09SDavid van Moolenbroekdone 163*00b67f09SDavid van Moolenbroek 164*00b67f09SDavid van Moolenbroekecho "I:checking format transitions: text->raw->map->text" 165*00b67f09SDavid van Moolenbroekret=0 166*00b67f09SDavid van Moolenbroek./named-compilezone -D -f text -F text -o baseline.txt example.nil ns1/example.db > /dev/null 167*00b67f09SDavid van Moolenbroek./named-compilezone -D -f text -F raw -o raw.1 example.nil baseline.txt > /dev/null 168*00b67f09SDavid van Moolenbroek./named-compilezone -D -f raw -F map -o map.1 example.nil raw.1 > /dev/null 169*00b67f09SDavid van Moolenbroek./named-compilezone -D -f map -F text -o text.1 example.nil map.1 > /dev/null 170*00b67f09SDavid van Moolenbroekcmp -s baseline.txt text.1 || ret=0 171*00b67f09SDavid van Moolenbroek[ $ret -eq 0 ] || echo "I:failed" 172*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret` 173*00b67f09SDavid van Moolenbroek 174*00b67f09SDavid van Moolenbroekecho "I:checking format transitions: text->map->raw->text" 175*00b67f09SDavid van Moolenbroekret=0 176*00b67f09SDavid van Moolenbroek./named-compilezone -D -f text -F map -o map.2 example.nil baseline.txt > /dev/null 177*00b67f09SDavid van Moolenbroek./named-compilezone -D -f map -F raw -o raw.2 example.nil map.2 > /dev/null 178*00b67f09SDavid van Moolenbroek./named-compilezone -D -f raw -F text -o text.2 example.nil raw.2 > /dev/null 179*00b67f09SDavid van Moolenbroekcmp -s baseline.txt text.2 || ret=0 180*00b67f09SDavid van Moolenbroek[ $ret -eq 0 ] || echo "I:failed" 181*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret` 182*00b67f09SDavid van Moolenbroek 183*00b67f09SDavid van Moolenbroekecho "I:checking map format loading with journal file rollforward" 184*00b67f09SDavid van Moolenbroekret=0 185*00b67f09SDavid van Moolenbroek$NSUPDATE <<END > /dev/null || status=1 186*00b67f09SDavid van Moolenbroekserver 10.53.0.3 5300 187*00b67f09SDavid van Moolenbroekttl 600 188*00b67f09SDavid van Moolenbroekupdate add newtext.dynamic IN TXT "added text" 189*00b67f09SDavid van Moolenbroekupdate delete aaaa.dynamic 190*00b67f09SDavid van Moolenbroeksend 191*00b67f09SDavid van MoolenbroekEND 192*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS @10.53.0.3 -p 5300 newtext.dynamic txt > dig.out.dynamic.3.1 193*00b67f09SDavid van Moolenbroekgrep "added text" dig.out.dynamic.3.1 > /dev/null 2>&1 || ret=1 194*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +comm @10.53.0.3 -p 5300 added.dynamic txt > dig.out.dynamic.3.2 195*00b67f09SDavid van Moolenbroekgrep "NXDOMAIN" dig.out.dynamic.3.2 > /dev/null 2>&1 || ret=1 196*00b67f09SDavid van Moolenbroek# using "rndc halt" ensures that we don't dump the zone file 197*00b67f09SDavid van Moolenbroek$RNDC -c ../common/rndc.conf -s 10.53.0.3 -p 9953 halt 2>&1 | sed 's/^/I:ns3 /' 198*00b67f09SDavid van Moolenbroekrestart 199*00b67f09SDavid van Moolenbroekfor i in 0 1 2 3 4 5 6 7 8 9; do 200*00b67f09SDavid van Moolenbroek lret=0 201*00b67f09SDavid van Moolenbroek $DIG $DIGOPTS @10.53.0.3 -p 5300 newtext.dynamic txt > dig.out.dynamic.3.3 202*00b67f09SDavid van Moolenbroek grep "added text" dig.out.dynamic.3.3 > /dev/null 2>&1 || lret=1 203*00b67f09SDavid van Moolenbroek [ $lret -eq 0 ] && break; 204*00b67f09SDavid van Moolenbroekdone 205*00b67f09SDavid van Moolenbroek[ $lret -eq 1 ] && ret=1 206*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS +comm @10.53.0.3 -p 5300 added.dynamic txt > dig.out.dynamic.3.4 207*00b67f09SDavid van Moolenbroekgrep "NXDOMAIN" dig.out.dynamic.3.4 > /dev/null 2>&1 || ret=1 208*00b67f09SDavid van Moolenbroek[ $ret -eq 0 ] || echo "I:failed" 209*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret` 210*00b67f09SDavid van Moolenbroek 211*00b67f09SDavid van Moolenbroekecho "I:checking map format file dumps correctly" 212*00b67f09SDavid van Moolenbroekret=0 213*00b67f09SDavid van Moolenbroek$NSUPDATE <<END > /dev/null || status=1 214*00b67f09SDavid van Moolenbroekserver 10.53.0.3 5300 215*00b67f09SDavid van Moolenbroekttl 600 216*00b67f09SDavid van Moolenbroekupdate add moretext.dynamic IN TXT "more text" 217*00b67f09SDavid van Moolenbroeksend 218*00b67f09SDavid van MoolenbroekEND 219*00b67f09SDavid van Moolenbroek$DIG $DIGOPTS @10.53.0.3 -p 5300 moretext.dynamic txt > dig.out.dynamic.3.5 220*00b67f09SDavid van Moolenbroekgrep "more text" dig.out.dynamic.3.5 > /dev/null 2>&1 || ret=1 221*00b67f09SDavid van Moolenbroek# using "rndc stop" will cause the zone file to flush before shutdown 222*00b67f09SDavid van Moolenbroek$RNDC -c ../common/rndc.conf -s 10.53.0.3 -p 9953 stop 2>&1 | sed 's/^/I:ns3 /' 223*00b67f09SDavid van Moolenbroekrm ns3/*.jnl 224*00b67f09SDavid van Moolenbroekrestart 225*00b67f09SDavid van Moolenbroekfor i in 0 1 2 3 4 5 6 7 8 9; do 226*00b67f09SDavid van Moolenbroek lret=0 227*00b67f09SDavid van Moolenbroek $DIG $DIGOPTS +comm @10.53.0.3 -p 5300 moretext.dynamic txt > dig.out.dynamic.3.6 228*00b67f09SDavid van Moolenbroek grep "more text" dig.out.dynamic.3.6 > /dev/null 2>&1 || lret=1 229*00b67f09SDavid van Moolenbroek [ $lret -eq 0 ] && break; 230*00b67f09SDavid van Moolenbroekdone 231*00b67f09SDavid van Moolenbroek[ $lret -eq 1 ] && ret=1 232*00b67f09SDavid van Moolenbroek[ $ret -eq 0 ] || echo "I:failed" 233*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret` 234*00b67f09SDavid van Moolenbroek 235*00b67f09SDavid van Moolenbroek# stomp on the file data so it hashes differently. 236*00b67f09SDavid van Moolenbroek# these are small and subtle changes, so that the resulting file 237*00b67f09SDavid van Moolenbroek# would appear to be a legitimate map file and would not trigger an 238*00b67f09SDavid van Moolenbroek# assertion failure if loaded into memory, but should still fail to 239*00b67f09SDavid van Moolenbroek# load because of a SHA1 hash mismatch. 240*00b67f09SDavid van Moolenbroekecho "I:checking corrupt map files fail to load (bad node header)" 241*00b67f09SDavid van Moolenbroekret=0 242*00b67f09SDavid van Moolenbroek./named-compilezone -D -f text -F map -o map.5 example.nil baseline.txt > /dev/null 243*00b67f09SDavid van Moolenbroekcp map.5 badmap 244*00b67f09SDavid van Moolenbroekstomp badmap 2754 2 99 245*00b67f09SDavid van Moolenbroek./named-compilezone -D -f map -F text -o text.5 example.nil badmap > /dev/null 246*00b67f09SDavid van Moolenbroek[ $? = 1 ] || ret=1 247*00b67f09SDavid van Moolenbroek[ $ret -eq 0 ] || echo "I:failed" 248*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret` 249*00b67f09SDavid van Moolenbroek 250*00b67f09SDavid van Moolenbroekecho "I:checking corrupt map files fail to load (bad node data)" 251*00b67f09SDavid van Moolenbroekret=0 252*00b67f09SDavid van Moolenbroekcp map.5 badmap 253*00b67f09SDavid van Moolenbroekstomp badmap 2897 5 127 254*00b67f09SDavid van Moolenbroek./named-compilezone -D -f map -F text -o text.5 example.nil badmap > /dev/null 255*00b67f09SDavid van Moolenbroek[ $? = 1 ] || ret=1 256*00b67f09SDavid van Moolenbroek[ $ret -eq 0 ] || echo "I:failed" 257*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret` 258*00b67f09SDavid van Moolenbroek 259*00b67f09SDavid van Moolenbroekecho "I:checking map format zone is scheduled for resigning (compilezone)" 260*00b67f09SDavid van Moolenbroekret=0 261*00b67f09SDavid van Moolenbroek$RNDC -c ../common/rndc.conf -s 10.53.0.1 -p 9953 zonestatus signed > rndc.out 2>&1 || ret=1 262*00b67f09SDavid van Moolenbroekgrep 'next resign' rndc.out > /dev/null 2>&1 || ret=1 263*00b67f09SDavid van Moolenbroek[ $ret -eq 0 ] || echo "I:failed" 264*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret` 265*00b67f09SDavid van Moolenbroek 266*00b67f09SDavid van Moolenbroekecho "I:checking map format zone is scheduled for resigning (signzone)" 267*00b67f09SDavid van Moolenbroekret=0 268*00b67f09SDavid van Moolenbroek$RNDC -c ../common/rndc.conf -s 10.53.0.1 -p 9953 freeze signed > rndc.out 2>&1 || ret=1 269*00b67f09SDavid van Moolenbroekcd ns1 270*00b67f09SDavid van Moolenbroek$SIGNER -S -O map -f signed.db.map -o signed signed.db > /dev/null 2>&1 271*00b67f09SDavid van Moolenbroekcd .. 272*00b67f09SDavid van Moolenbroek$RNDC -c ../common/rndc.conf -s 10.53.0.1 -p 9953 reload signed > rndc.out 2>&1 || ret=1 273*00b67f09SDavid van Moolenbroek$RNDC -c ../common/rndc.conf -s 10.53.0.1 -p 9953 zonestatus signed > rndc.out 2>&1 || ret=1 274*00b67f09SDavid van Moolenbroekgrep 'next resign' rndc.out > /dev/null 2>&1 || ret=1 275*00b67f09SDavid van Moolenbroek[ $ret -eq 0 ] || echo "I:failed" 276*00b67f09SDavid van Moolenbroekstatus=`expr $status + $ret` 277*00b67f09SDavid van Moolenbroek 278*00b67f09SDavid van Moolenbroekecho "I:exit status: $status" 279*00b67f09SDavid van Moolenbroekexit $status 280