bin/update
changeset 31 2b7aad3466c6
parent 30 1a8bc67b1eb7
child 32 694dab02a6b0
--- a/bin/update	Mon Mar 19 13:11:30 2012 +0200
+++ b/bin/update	Mon Mar 19 13:39:53 2012 +0200
@@ -8,7 +8,13 @@
 # resolve $0
 self=$0
 while [ -L $self ]; do
-    self=$(dirname $self)/$(readlink $self)
+    tgt=$(readlink $self)
+
+    if [ "${tgt:0:1}" == "/" ]; then
+        self=$tgt
+    else
+        self=$(dirname $self)/$tgt
+    fi
 done
 
 # bin dir
@@ -21,6 +27,7 @@
 DATA=settings
 ZONES=zones
 SERIALS=$DATA
+REPO=$DATA
 
 # data args
 PROCESS_ARGS='--input-charset latin-1'
@@ -31,12 +38,13 @@
 
 # external progs
 NAMED_CHECKZONE=/usr/sbin/named-checkzone
-HG=hg
+HG=/usr/bin/hg
 RNDC=/usr/sbin/rndc
 
 ## options
 IS_TTY=
 
+LOG_WARN=y
 LOG=y
 LOG_INFO=
 LOG_DEBUG=
@@ -93,7 +101,11 @@
 
             d)  ROOT="$OPTARG" ;;
 
-            q)  LOG= ;;
+            q)  
+                LOG= 
+                LOG_WARN=
+                ;;
+
             v)  LOG_INFO=y ;;
             D)  
                 LOG_DEBUG=y
@@ -145,6 +157,10 @@
     log_color 31 "$*"
 }
 
+function log_warn {
+    [ $LOG_WARN ] && log_color 33 "$*" || true
+}
+
 function log {
     [ $LOG ] && log_msg "$*" || true
 }
@@ -207,6 +223,8 @@
     log_cmd "$@"
 
     "$@" | sed "s/^/$indent/"
+
+    return ${PIPESTATUS[0]}
 }
 
 function abspath () {
@@ -215,9 +233,9 @@
 
 ## hg
 function hg {
-    local repo=$r
+    local repo=$1; shift
 
-    $HG -R $ROOT/$repo "$@"
+    cmd $HG -R $ROOT/$repo "$@"
 }
 
 function hg_modified {
@@ -251,7 +269,7 @@
     local user_opt=$(hg_user)
     
     log_debug "commit: $user_opt: $msg"
-    cmd hg $repo commit $user_opt -m "$msg"
+    hg $repo commit $user_opt -m "$msg"
 }
 
 
@@ -425,8 +443,17 @@
     local base=$3
     
     local lnk=$ZONES/$view/$zone.zone
-    local tgt=$ZONES/$view/$base.zone
-
+    local tgt
+    
+    if [ $zone == $base ]; then
+        # out of view
+        log_debug "$view/$zone: base $base from root"
+        tgt=$ZONES/$base.zone
+    else
+        log_debug "$view/$zone: base $base from view"
+        tgt=$ZONES/$view/$base.zone
+    fi
+    
     if [ -e $ROOT/$lnk ] && [ $(readlink $ROOT/$lnk) == $ROOT/$tgt ]; then
         log_info "Linking $lnk -> $tgt: not changed"
 
@@ -505,12 +532,12 @@
 
 # deploy new zone data to bind
 function deploy_zones {
-    cmd $RNDC reload
+    indent "        rndc: " $RNDC reload
 }
 
 # commit data changes
 function commit_data {
-    local repo=$DATA
+    local repo=$1
 
     if hg_modified $repo; then
         log_info "Commit changes in $repo:"
@@ -523,16 +550,31 @@
     fi
 }
 
+function ensure_dir {
+    local dir=$1
+
+    if [ ! -d $ROOT/$dir ]; then
+        log_warn "Creating output dir: $dir"
+        cmd mkdir $ROOT/$dir
+    fi
+}
+
 function main {
     # test tty
     [ -t 1 ] && IS_TTY=y
+    
+    local views=(internal external)
 
     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"
+    ensure_dir  $ZONES
+    
+    # views
+    for view in "${views[@]}"; do
+        ensure_dir $ZONES/$view
+    done
 
     ## hosts
     # test
@@ -577,7 +619,6 @@
         check_zone          235.197.194.in-addr.arpa    $ZONES/paivola-reverse.zone
 
     # extra zones...
-    local views=(internal external)
     local base_zone=paivola
     local link_zones=(paivola.fi paivola.net paivola.org paivola.info paivola.mobi xn--pivl-load8j.fi)
 
@@ -587,6 +628,9 @@
             link_zone_view  $zone   $view   $base_zone
             check_zone      $zone   $ZONES/$view/$zone.zone
         done
+
+        # reverse
+        link_zone_view      paivola-reverse     $view   paivola-reverse
     done
 
     ## deploy
@@ -605,7 +649,7 @@
 
     else
         log "Commit data..."
-            commit_data
+            commit_data $REPO
     fi
 }