#!/bin/rc
rfork ne
path=/bin
fn fatal {
echo $*
exit $"*
}
fn must {
$* || fatal $"*^': '^$status
}
flags=()
force=false
while (~ $1 -*) {
switch ($1) {
case -f
force=true
case -s -c
flags=($flags $1 $2)
shift
case -*
usage
}
shift
}
if (! ~ $#* 1)
fatal 'usage: contrib/pull [-c file] [-s file] name' >[1=2]
#remove "user" from "user/replica"
name=`{basename $1}
repl=/dist/replica/$name
if (! test -x $repl)
fatal no such replica: $name
. $repl
# set this here as we redefine s when we compare sizes
if (~ $#serverchg 0) {
serverchg=$s/$name/chg
clientchg=$c/client/$name.chg
}
if (~ $#serveriso 0)
serveriso=$s/$name/iso.bz2
must servermount
# check if we are updated
if (~ $force false && cmp $clientlog $serverlog >/dev/null >[2=1] ) {
exit ''
}
# check changes
if ( test -e $serverchg) {
n=`{ls -l $clientchg >[2]/dev/null |awk '{print $6}'}
s=`{ls -l $serverchg >[2]/dev/null |awk '{print $6}'}
if (~ $n 0 || ~ $#n 0 || test $s -lt $n) {
must fcp $serverchg $clientchg
cat $clientchg
}
if not {
m=`{echo $n-1024 | hoc}
if(~ $m -*)
m=0
cmp -s $serverchg $clientchg $m $m
x=$status
switch($x){
case *': EOF'
tail +^$n^c $serverchg >>$clientchg
tail +^$n^c $clientchg
case *': differ'
fcp $serverchg $clientchg
cat $clientchg
}
}
}
# if the iso exists override some variables
# and mount it so we can pull from there
clientiso=/tmp/$name.iso
if (test -e $serveriso) {
must fcp $serveriso $clientiso.bz2
must bunzip2 < $clientiso.bz2 > $clientiso
rm -f $clientiso.bz2
must 9660srv 9660.$name
must mount -c /srv/9660.$name /n/dist $clientiso
serverroot=/n/dist
serverlog=/n/dist/$name.log
}
# download the log
n=`{ls -l $clientlog >[2]/dev/null |awk '{print $6}'}
s=`{ls -l $serverlog >[2]/dev/null |awk '{print $6}'}
if(~ $n 0 || ~ $#n 0 || test $s -lt $n){
if(test -e $clientlog) must rm $clientlog
must fcp $serverlog $clientlog
}
if not{
m=`{echo $n-1024 | hoc}
if(~ $m -*)
m=0
cmp -s $serverlog $clientlog $m $m
x=$status
switch($x){
case *': EOF'
must tail +^$n^c $serverlog >>$clientlog
case *': differ'
must rm $clientlog
must fcp $serverlog $clientlog
case ''
;
case *
fatal cmp: $x
}
}
# normally we'd do this after applylog, but we want
# applylog to be the last thing in this script, so we'll
# do it here instead, compacting changes from the
# _last_ applylog.
ndb=`{echo $clientdb | sed 's;(.*)/(.*);\1/_\2;'}
must replica/compactdb $clientdb >$ndb
mv $ndb $clientdb
# now call applylog
replica/applylog -v $flags $clientdb $clientroot $serverroot <$clientlog
unmount /n/dist >/dev/null >[2=1]
rm -f /srv/9660.$name
rm -f $clientiso
|