xref: /plan9/sys/lib/backup/restore (revision ba8542f7a64cb018d856de588f59d755d599b1d2)
1#!/bin/rc
2# restore arena# [dev] - load venti with arenas on dev, stored one per track
3#	starting with arena#.  must have run fmtarenas before restoring
4#	the first arena in the partition.
5#	this must be run on the venti server, without venti running on the
6#	affected arena partition(s).
7rfork ne
8if (test -e /sys/lib/backup/funcs)
9	.   /sys/lib/backup/funcs
10switch ($#*) {
11case 1
12case 2
13	rdev=$2
14case *
15	echo usage: $0 arena-num '[dev]' >[1=2]
16	exit usage
17}
18starena=$1
19if (! ~ $starena [0-9] [0-9][0-9] [0-9][0-9][0-9]) {
20	echo $0: bad starting arena: $starena >[1=2]
21	exit bad-arena-num
22}
23
24# clear any dregs from a previous run
25unmount /mnt/cd >[2]/dev/null
26sleep 1
27kill cdfs | rc
28sleep 1
29cdfs -d $rdev || exit
30cd /mnt/cd
31
32#for (track in d[0-9]*)
33#	venti/wrarena $track	# slow; takes about 12½ mins. per GB
34
35arena = $starena
36# set arenabase for arenastart
37arenabase = `{ venti/printarenapart $arenas | sed -e 's/.*arenabase=//' -e 1q }
38kill printarenapart | rc		# printarenapart leaves a process behind
39# echo arenabase $arenabase
40
41skipping=yes
42for (track in d[0-9]*) {
43	if (~ track 'd[0-9]*') {
44		echo $0: no tracks in /mnt/cd >[1=2]
45		exit no-tracks
46	}
47	if (~ $skipping yes) {
48		# verify that first track is the expected one
49		type=`{file $track}
50		switch ($"type) {
51		case *': venti arena'
52			name=`{ venti/printarena $track >[2=1] |
53				sed -e 's/.*name=([^ =]+).*/\1/' -e 1q }
54		case *
55			name=NOT-A-VENTI-ARENA
56		}
57		kill printarena | rc	# printarena leaves a process behind
58
59		echo -n first track is $"name'; is that right? '
60		switch (`{read}) {
61		case [yY]*
62			skipping=no
63		case skip
64			skipping=yes
65		case *
66			echo aborting, arena is unchanged. >[1=2]
67			exit 'wrong track'
68		}
69	}
70
71	if (! ~ $skipping yes) {
72		# copy each track into its slot in the arena partition
73		venti/printarena $track >[2=1] | sed 1q | tr -d '\12'
74		kill printarena | rc	# printarena leaves a process behind
75
76		off = `{arenastart $arena}
77		# echo -n writing $track to $arenas at 8K-block offset $off:
78		sleep 3
79		echo
80		# argh!  something (cdfs?) appends 60K of *stuff* to each
81		# arena on optical disc.  restrain dd.
82		count=`{ echo $arenasize/$blocksize | bc }
83		pump -i 1048576 -o 65536 -d 10 <$track |
84			dd -quiet 1 -count $count -bs $blocksize -of $arenas \
85				-oseek $off
86		arena = `{hoc -e $arena+1}
87	}
88}
89# when all done, must run venti/checkarenas, fmtisect, fmtbloom, fmtindex,
90# and (the big one) venti/buildindex -b /cfg/pie/venti.conf
91