xref: /plan9/sys/lib/backup/restore (revision ba8542f7a64cb018d856de588f59d755d599b1d2)
15c4758afSDavid du Colombier#!/bin/rc
21c9e5a6cSDavid du Colombier# restore arena# [dev] - load venti with arenas on dev, stored one per track
31c9e5a6cSDavid du Colombier#	starting with arena#.  must have run fmtarenas before restoring
41c9e5a6cSDavid du Colombier#	the first arena in the partition.
51c9e5a6cSDavid du Colombier#	this must be run on the venti server, without venti running on the
61c9e5a6cSDavid du Colombier#	affected arena partition(s).
75c4758afSDavid du Colombierrfork ne
85c4758afSDavid du Colombierif (test -e /sys/lib/backup/funcs)
95c4758afSDavid du Colombier	.   /sys/lib/backup/funcs
105c4758afSDavid du Colombierswitch ($#*) {
115c4758afSDavid du Colombiercase 1
121c9e5a6cSDavid du Colombiercase 2
131c9e5a6cSDavid du Colombier	rdev=$2
145c4758afSDavid du Colombiercase *
151c9e5a6cSDavid du Colombier	echo usage: $0 arena-num '[dev]' >[1=2]
165c4758afSDavid du Colombier	exit usage
175c4758afSDavid du Colombier}
181c9e5a6cSDavid du Colombierstarena=$1
191c9e5a6cSDavid du Colombierif (! ~ $starena [0-9] [0-9][0-9] [0-9][0-9][0-9]) {
201c9e5a6cSDavid du Colombier	echo $0: bad starting arena: $starena >[1=2]
211c9e5a6cSDavid du Colombier	exit bad-arena-num
221c9e5a6cSDavid du Colombier}
235c4758afSDavid du Colombier
241c9e5a6cSDavid du Colombier# clear any dregs from a previous run
255c4758afSDavid du Colombierunmount /mnt/cd >[2]/dev/null
261c9e5a6cSDavid du Colombiersleep 1
271c9e5a6cSDavid du Colombierkill cdfs | rc
281c9e5a6cSDavid du Colombiersleep 1
295c4758afSDavid du Colombiercdfs -d $rdev || exit
305c4758afSDavid du Colombiercd /mnt/cd
311c9e5a6cSDavid du Colombier
321c9e5a6cSDavid du Colombier#for (track in d[0-9]*)
331c9e5a6cSDavid du Colombier#	venti/wrarena $track	# slow; takes about 12½ mins. per GB
341c9e5a6cSDavid du Colombier
351c9e5a6cSDavid du Colombierarena = $starena
361c9e5a6cSDavid du Colombier# set arenabase for arenastart
371c9e5a6cSDavid du Colombierarenabase = `{ venti/printarenapart $arenas | sed -e 's/.*arenabase=//' -e 1q }
381c9e5a6cSDavid du Colombierkill printarenapart | rc		# printarenapart leaves a process behind
391c9e5a6cSDavid du Colombier# echo arenabase $arenabase
401c9e5a6cSDavid du Colombier
411c9e5a6cSDavid du Colombierskipping=yes
421c9e5a6cSDavid du Colombierfor (track in d[0-9]*) {
431c9e5a6cSDavid du Colombier	if (~ track 'd[0-9]*') {
441c9e5a6cSDavid du Colombier		echo $0: no tracks in /mnt/cd >[1=2]
451c9e5a6cSDavid du Colombier		exit no-tracks
461c9e5a6cSDavid du Colombier	}
471c9e5a6cSDavid du Colombier	if (~ $skipping yes) {
481c9e5a6cSDavid du Colombier		# verify that first track is the expected one
491c9e5a6cSDavid du Colombier		type=`{file $track}
501c9e5a6cSDavid du Colombier		switch ($"type) {
511c9e5a6cSDavid du Colombier		case *': venti arena'
521c9e5a6cSDavid du Colombier			name=`{ venti/printarena $track >[2=1] |
531c9e5a6cSDavid du Colombier				sed -e 's/.*name=([^ =]+).*/\1/' -e 1q }
541c9e5a6cSDavid du Colombier		case *
551c9e5a6cSDavid du Colombier			name=NOT-A-VENTI-ARENA
561c9e5a6cSDavid du Colombier		}
571c9e5a6cSDavid du Colombier		kill printarena | rc	# printarena leaves a process behind
581c9e5a6cSDavid du Colombier
591c9e5a6cSDavid du Colombier		echo -n first track is $"name'; is that right? '
601c9e5a6cSDavid du Colombier		switch (`{read}) {
611c9e5a6cSDavid du Colombier		case [yY]*
621c9e5a6cSDavid du Colombier			skipping=no
631c9e5a6cSDavid du Colombier		case skip
641c9e5a6cSDavid du Colombier			skipping=yes
651c9e5a6cSDavid du Colombier		case *
661c9e5a6cSDavid du Colombier			echo aborting, arena is unchanged. >[1=2]
671c9e5a6cSDavid du Colombier			exit 'wrong track'
681c9e5a6cSDavid du Colombier		}
691c9e5a6cSDavid du Colombier	}
701c9e5a6cSDavid du Colombier
711c9e5a6cSDavid du Colombier	if (! ~ $skipping yes) {
721c9e5a6cSDavid du Colombier		# copy each track into its slot in the arena partition
731c9e5a6cSDavid du Colombier		venti/printarena $track >[2=1] | sed 1q | tr -d '\12'
741c9e5a6cSDavid du Colombier		kill printarena | rc	# printarena leaves a process behind
751c9e5a6cSDavid du Colombier
761c9e5a6cSDavid du Colombier		off = `{arenastart $arena}
771c9e5a6cSDavid du Colombier		# echo -n writing $track to $arenas at 8K-block offset $off:
781c9e5a6cSDavid du Colombier		sleep 3
791c9e5a6cSDavid du Colombier		echo
801c9e5a6cSDavid du Colombier		# argh!  something (cdfs?) appends 60K of *stuff* to each
811c9e5a6cSDavid du Colombier		# arena on optical disc.  restrain dd.
821c9e5a6cSDavid du Colombier		count=`{ echo $arenasize/$blocksize | bc }
83*ba8542f7SDavid du Colombier		pump -i 1048576 -o 65536 -d 10 <$track |
84*ba8542f7SDavid du Colombier			dd -quiet 1 -count $count -bs $blocksize -of $arenas \
85*ba8542f7SDavid du Colombier				-oseek $off
861c9e5a6cSDavid du Colombier		arena = `{hoc -e $arena+1}
871c9e5a6cSDavid du Colombier	}
881c9e5a6cSDavid du Colombier}
891c9e5a6cSDavid du Colombier# when all done, must run venti/checkarenas, fmtisect, fmtbloom, fmtindex,
901c9e5a6cSDavid du Colombier# and (the big one) venti/buildindex -b /cfg/pie/venti.conf
91