bin/update
changeset 28 647f6de0d0ac
parent 27 773c91a7547a
child 29 6fc1e0429518
--- a/bin/update	Mon Mar 19 12:18:52 2012 +0200
+++ b/bin/update	Mon Mar 19 12:47:26 2012 +0200
@@ -5,22 +5,31 @@
 
 ROOT=$(pwd)
 
-BIN=bin
+# resolve $0
+self=$0
+while [ -L $self ]; do
+    self=$(dirname $self)/$(readlink $self)
+done
+
+# bin dir
+BIN=$(dirname $self)
 PROCESS_ZONE=$BIN/process-zone
 EXPAND_ZONE=$BIN/expand-zone
 UPDATE_SERIAL=$BIN/update-serial
 
+# data files
 DATA=settings
 ZONES=zones
 SERIALS=$DATA
 
+# data args
 PROCESS_ARGS='--input-charset latin-1'
 
 FORWARD_MX=mail
 REVERSE_ZONE=194.197.235
 REVERSE_DOMAIN=paivola.fi
 
-
+# external progs
 NAMED_CHECKZONE=/usr/sbin/named-checkzone
 HG=hg
 RNDC=/usr/sbin/rndc
@@ -51,6 +60,7 @@
 
 General:
     -h      display this help text
+    -d DIR  datadir
 
 Logging:    
     -q      quiet
@@ -67,20 +77,22 @@
 Commit    
     -C      do not commit changes
     -c      commit changes
-    -m      commit message
+    -m MSG  commit message
 END
 }
 
 function parse_args {
     OPTIND=1
 
-    while getopts 'hqvDVpFSnCcm:' opt "$@"; do
+    while getopts 'hd:qvDVpFSnCcm:' opt "$@"; do
         case $opt in
             h)  
                 help_args $0
                 exit 0
             ;;
 
+            d)  ROOT="$OPTARG" ;;
+
             q)  LOG= ;;
             v)  LOG_INFO=y ;;
             D)  
@@ -201,10 +213,47 @@
     echo "$ROOT/$1"
 }
 
-## test
-[ -d $DATA ] || die "Missing settings: $DATA"
-[ -d $SERIALS ] || die "Missing serials: $SERIALS"
-[ -d $ZONES ] || die "Missing zones: $ZONES"
+## hg
+function hg {
+    local repo=$r
+
+    $HG -R $ROOT/$repo "$@"
+}
+
+function hg_modified {
+    local repo=$1
+
+    hg $repo id | grep -q '+'
+}
+
+function hg_user {
+    if [ ${SUDO_USER:-} ]; then
+        echo '-u' "$SUDO_USER"
+
+    elif [ $HOME ] && [ -e $HOME/.hgrc ]; then
+        log_debug "using .hgrc user"
+        echo ''
+
+    else
+        echo '-u' "$USER"
+    fi
+}
+
+function hg_diff {
+    local repo=$1
+
+    hg $repo diff
+}
+
+function hg_commit {
+    local repo=$1
+    local msg=$2
+    local user_opt=$(hg_user)
+    
+    log_debug "commit: $user_opt: $msg"
+    cmd hg $repo commit $user_opt -m "$msg"
+}
+
 
 ## functions
 function check_update {
@@ -228,7 +277,7 @@
 
         # check
 
-        if [ $dst -ot $dep ]; then
+        if [ $ROOT/$dst -ot $ROOT/$dep ]; then
             log_debug "  changed: $dep"
             update=y
         fi
@@ -245,26 +294,26 @@
     local tmp=$dst.new
 
     log_debug "update: $dst"
-    cmd "$@" > $tmp
+    cmd "$@" > $ROOT/$tmp
 
     # compare
-    if [ -e $dst ] && [ $UPDATE_DIFF ]; then
+    if [ -e $ROOT/$dst ] && [ $UPDATE_DIFF ]; then
         log_debug "  changes:"
 
         # terse
-        indent "        " diff --unified=1 $dst $tmp
+        indent "        " diff --unified=1 $ROOT/$dst $ROOT/$tmp
     fi
     
     if [ $UPDATE_NOOP ]; then
         # cleanup
         log_debug "  no-op"
 
-        cmd rm $tmp
+        cmd rm $ROOT/$tmp
     else
         # commit
         log_debug "  update"
 
-        cmd mv $tmp $dst
+        cmd mv $ROOT/$tmp $ROOT/$dst
     fi
 }
 
@@ -297,13 +346,13 @@
     local name=$1; shift
     local file=$SERIALS/$name.serial
     
-    local old=$(test -e $file && cat $file || echo '')
+    local old=$(test -e $ROOT/$file && cat $ROOT/$file || echo '')
 
     log_info "Updating $file..."
 
-    cmd $UPDATE_SERIAL $* $file
+    cmd $UPDATE_SERIAL $* $ROOT/$file
     
-    local new=$(cat $file)
+    local new=$(cat $ROOT/$file)
         
     log_debug "  $old -> $new"
 }
@@ -320,7 +369,7 @@
     if check_update $dst $src; then
         log_info "Copying zones/$name..."
 
-        do_update $dst cat $src
+        do_update $dst cat $ROOT/$src
     else
         log_info "Copying zones/$name: not changed"
     fi
@@ -339,8 +388,8 @@
         log_info "Generating $out..." 
 
         do_update $out \
-            $EXPAND_ZONE $DATA/$zone.zone   \
-                --serial $SERIALS/$zone.serial  \
+            $EXPAND_ZONE $ROOT/$DATA/$zone.zone   \
+                --serial $ROOT/$SERIALS/$zone.serial  \
                 --expand zones=$(abspath $ZONES)
     else
         log_info "Generating $out: not changed" 
@@ -361,8 +410,8 @@
         log_info "Generating $out..."
 
         do_update $out \
-            $EXPAND_ZONE $DATA/$zone.zone   \
-                --serial $SERIALS/$zone.serial  \
+            $EXPAND_ZONE $ROOT/$DATA/$zone.zone   \
+                --serial $ROOT/$SERIALS/$zone.serial  \
                 --expand zones=$(abspath $ZONES)    \
                 --expand view=$view
     else
@@ -378,7 +427,7 @@
     if check_update $dst $src; then
         log_info "Generating $dst..."
 
-        do_update $dst $PROCESS_ZONE $PROCESS_ARGS $src "$@"
+        do_update $dst $PROCESS_ZONE $PROCESS_ARGS $ROOT/$src "$@"
     else
         log_info "Generating $dst: not changed"
     fi
@@ -394,7 +443,7 @@
         log_info "Generating $dst..."
         
         # via stdin
-        $HG -R $DATA annotate -qd $src | \
+        $hg $DATA annotate -qd $ROOT/$src | \
             do_update $dst $PROCESS_ZONE $PROCESS_ARGS --input-line-date --meta-zone "$@"
     else
         log_info "Generating $dst: not changed"
@@ -404,7 +453,7 @@
 function check_hosts {
     local hosts=$1; shift 1
 
-    local cmd=($PROCESS_ZONE $PROCESS_ARGS $hosts --check-hosts "$@")
+    local cmd=($PROCESS_ZONE $PROCESS_ARGS $ROOT/$hosts --check-hosts "$@")
 
     if "${cmd[@]}" -q; then
         log_info "Check $hosts: OK"
@@ -421,11 +470,11 @@
     local name=$1
     local file=$2
 
-    local cmd=($NAMED_CHECKZONE $name $file)
+    local cmd=($NAMED_CHECKZONE $name $ROOT/$file)
 
     # test
     # XXX: checkzone is very specific about the order of arguments, -q must be first
-    if $NAMED_CHECKZONE -q $name $file; then
+    if $NAMED_CHECKZONE -q $name $ROOT/$file; then
         log_info "Check $file($name): OK"
     else
         log_error "  Check $file($name): Failed:"
@@ -442,51 +491,17 @@
 }
 
 # commit data changes
-function hg_modified {
-    local repo=$1
-
-    $HG -R $repo id | grep -q '+'
-}
-
-function hg_user {
-    if [ ${SUDO_USER:-} ]; then
-        echo '-u' "$SUDO_USER"
-
-    elif [ $HOME ] && [ -e $HOME/.hgrc ]; then
-        log_debug "using .hgrc user"
-        echo ''
-
-    else
-        echo '-u' "$USER"
-    fi
-}
-
-function hg_diff {
-    local repo=$1
+function commit_data {
+    local repo=$DATA
 
-    $HG -R $repo diff
-}
+    if hg_modified $repo; then
+        log_info "Commit changes in $repo:"
 
-function hg_commit {
-    local repo=$1
-    local msg=$2
-    local user_opt=$(hg_user)
-    
-    log_debug "commit: $user_opt: $msg"
-    cmd $HG -R $repo commit $user_opt -m "$msg"
-}
+        indent "    " hg_diff $repo
 
-function commit_data {
-    local data=$DATA
-
-    if hg_modified $data; then
-        log_info "Commit changes in $data:"
-
-        indent "    " hg_diff $data
-
-        hg_commit $data "$COMMIT_MSG"
+        hg_commit $repo "$COMMIT_MSG"
     else
-        log_info "Commit changes in $data: no changes"
+        log_info "Commit changes in $repo: no changes"
     fi
 }
 
@@ -496,6 +511,11 @@
 
     parse_args "$@"
 
+    ## test env
+    [ -d $ROOT/$DATA ] || die "Missing data: $ROOT/$DATA"
+    [ -d $ROOT/$SERIALS ] || die "Missing serials: $ROOT/$SERIALS"
+    [ -d $ROOT/$ZONES ] || die "Missing zones: $ROOT/$ZONES"
+
     ## hosts
     # test
     log "Testing hosts..."