]> git.lizzy.rs Git - plan9front.git/blob - sys/lib/backup/restore
merge
[plan9front.git] / sys / lib / backup / restore
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).
7 rfork ne
8 if (test -e /sys/lib/backup/funcs)
9         .   /sys/lib/backup/funcs
10 switch ($#*) {
11 case 1
12 case 2
13         rdev=$2
14 case *
15         echo usage: $0 arena-num '[dev]' >[1=2]
16         exit usage
17 }
18 starena=$1
19 if (! ~ $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
25 unmount /mnt/cd >[2]/dev/null
26 sleep 1
27 kill cdfs | rc
28 sleep 1
29 cdfs -d $rdev || exit
30 cd /mnt/cd
31
32 #for (track in d[0-9]*)
33 #       venti/wrarena $track    # slow; takes about 12½ mins. per GB
34
35 arena = $starena
36 # set arenabase for arenastart
37 arenabase = `{ venti/printarenapart $arenas | sed -e 's/.*arenabase=//' -e 1q }
38 kill printarenapart | rc                # printarenapart leaves a process behind
39 # echo arenabase $arenabase
40
41 skipping=yes
42 for (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