summaryrefslogtreecommitdiff
path: root/rc/bin/replica
diff options
context:
space:
mode:
authorTaru Karttunen <taruti@taruti.net>2011-03-30 17:14:36 +0300
committerTaru Karttunen <taruti@taruti.net>2011-03-30 17:14:36 +0300
commit2959e1ede0ebc6fdffd7b8660f43c2ce14c9696f (patch)
treef6343b1ce11a8c87251dd27cf3d3e26b50693fa7 /rc/bin/replica
parente463eb40363ff4c68b1d903f4e0cdd0ac1c5977f (diff)
Import sources from 2011-03-30 iso image - rc
Diffstat (limited to 'rc/bin/replica')
-rwxr-xr-xrc/bin/replica/changes15
-rwxr-xr-xrc/bin/replica/defs55
-rwxr-xr-xrc/bin/replica/pull58
-rwxr-xr-xrc/bin/replica/push18
-rwxr-xr-xrc/bin/replica/scan18
-rwxr-xr-xrc/bin/replica/setupdirs34
6 files changed, 198 insertions, 0 deletions
diff --git a/rc/bin/replica/changes b/rc/bin/replica/changes
new file mode 100755
index 000000000..469fce866
--- /dev/null
+++ b/rc/bin/replica/changes
@@ -0,0 +1,15 @@
+#!/bin/rc
+
+rfork en
+
+fn usage {
+ echo 'usage: replica/changes replica-name [paths]' >[1=2]
+ exit usage
+}
+
+. /rc/bin/replica/defs $*
+
+need clientdb clientroot clientproto
+
+must clientmount
+exec replica/updatedb -p $clientproto -l -r $clientroot $clientexclude $clientdb $paths
diff --git a/rc/bin/replica/defs b/rc/bin/replica/defs
new file mode 100755
index 000000000..45b36419f
--- /dev/null
+++ b/rc/bin/replica/defs
@@ -0,0 +1,55 @@
+tmp=()
+
+fn fatal {
+ if(! ~ $#tmp 0)
+ rm -f $tmp
+ echo $* >[1=2]
+ exit $"*
+}
+
+fn must {
+ $* || fatal $"*^': '^$status
+}
+
+fn need {
+ for(i)
+ if(~ $$i UNCONFIGURED)
+ fatal $name^' does not set $'^$i
+}
+
+opt=()
+while(! ~ $#* 0 && ~ $1 -*){
+ if(~ $1 -s -c){ # take one argument
+ opt=($opt $1)
+ shift
+ }
+ opt=($opt $1)
+ shift
+}
+if(~ $1 --)
+ shift
+if(~ $#* 0)
+ usage
+name=$1
+shift
+paths=($*)
+
+if(! ~ $name /* ./* ../*)
+ name=$home/lib/replica/$name
+
+if(! test -x $name)
+ fatal no such replica $name
+
+cfgopt=()
+applyopt=()
+fn servermount { status='' }
+fn clientmount { status='' }
+fn serverupdate { status='' }
+for (i in clientroot clientproto clientdb clientexclude serverroot serverlog serverproto)
+ $i=UNCONFIGURED
+. $name
+
+if(! ~ $#serverexclude 0)
+ serverexclude=-x^$serverexclude
+if(! ~ $#clientexclude 0)
+ clientexclude=-x^$clientexclude
diff --git a/rc/bin/replica/pull b/rc/bin/replica/pull
new file mode 100755
index 000000000..5b1fcc1e2
--- /dev/null
+++ b/rc/bin/replica/pull
@@ -0,0 +1,58 @@
+#!/bin/rc
+
+rfork en
+
+fn usage {
+ echo 'usage: replica/pull [-nv] [-c name] [-s name] replica-name [paths]' >[1=2]
+ exit usage
+}
+
+. /rc/bin/replica/defs $*
+
+need clientlog serverlog clientdb clientroot serverroot
+
+# mount the server file system, update the log
+must servermount
+must serverupdate
+must clientmount
+
+# 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
+
+# mount the client file system, apply the log
+# this is the last thing in the script and is execed so that
+# if replica/pull is overwritten nothing bad will happen.
+# applylog takes care of itself as far as protection against being overwritten.
+exec replica/applylog $opt $applyopt $clientdb $clientroot $serverroot $paths <$clientlog
diff --git a/rc/bin/replica/push b/rc/bin/replica/push
new file mode 100755
index 000000000..635bc6b2c
--- /dev/null
+++ b/rc/bin/replica/push
@@ -0,0 +1,18 @@
+#!/bin/rc
+
+rfork en
+
+fn usage {
+ echo 'usage: replica/push [-nv] replica-name [paths]' >[1=2]
+ exit usage
+}
+
+. /rc/bin/replica/defs $*
+
+need clientproto clientexclude cfgopt clientdb clientroot serverroot paths
+
+must servermount
+must clientmount
+exec replica/applychanges -p $clientproto $clientexclude $opt $cfgopt \
+ $clientdb $clientroot $serverroot $paths
+
diff --git a/rc/bin/replica/scan b/rc/bin/replica/scan
new file mode 100755
index 000000000..c827eca92
--- /dev/null
+++ b/rc/bin/replica/scan
@@ -0,0 +1,18 @@
+#!/bin/rc
+
+rfork en
+
+fn usage {
+ echo 'usage: replica/scan replica-name [paths]' >[1=2]
+ exit usage
+}
+
+. /rc/bin/replica/defs $*
+
+need serverroot serverexclude serverproto serverdb serverlog
+
+must servermount
+replica/updatedb -r^$serverroot $serverexclude -p^$serverproto $serverdb >>$serverlog
+ndb=`{echo $serverdb | sed 's;(.*)/(.*);\1/n\2;'}
+odb=`{echo $serverdb | sed 's;(.*)/(.*);\1/_\2;'}
+replica/compactdb $serverdb >$ndb && mv $serverdb $odb && mv $ndb $serverdb
diff --git a/rc/bin/replica/setupdirs b/rc/bin/replica/setupdirs
new file mode 100755
index 000000000..75d47da47
--- /dev/null
+++ b/rc/bin/replica/setupdirs
@@ -0,0 +1,34 @@
+#!/bin/rc
+
+rfork en
+
+if(! ~ $#libreplica 1)
+ libreplica=$home/lib/replica
+
+fn usage {
+ echo 'usage: replica/setupdirs' >[1=2]
+ exit usage
+}
+
+fn fatal {
+ echo $* >[1=2]
+ exit $"*
+}
+
+fn must {
+ $* || fatal $"*^': '^$status
+}
+
+if(! ~ $#* 0)
+ usage
+
+for (i in \
+ $libreplica\
+ $libreplica/db\
+ $libreplica/db/client\
+ $libreplica/db/server\
+ $libreplica/log\
+ $libreplica/cfg)
+ if(! test -d $i)
+ must mkdir -p $i
+