update: unify [check/copy/update/link]_[hosts/zone/serial]
authorTero Marttila <terom@paivola.fi>
Tue, 20 Mar 2012 11:49:16 +0200
changeset 561 39799fc994e9
parent 560 f28db5535b10
child 562 57551a87a93e
update: unify [check/copy/update/link]_[hosts/zone/serial]
bin/update
--- a/bin/update	Mon Mar 19 17:48:04 2012 +0200
+++ b/bin/update	Tue Mar 20 11:49:16 2012 +0200
@@ -27,7 +27,7 @@
 DATA=settings
 ZONES=zones
 SERIALS=$DATA
-REPO=$DATA
+REPO=
 
 # data args
 PROCESS_ARGS='--input-charset latin-1'
@@ -359,161 +359,157 @@
     check_update $dst "${dep[@]}" && do_update $dst "${cmd[@]}" || true
 }
 
-## actions
-function update_zone_serial {
-    local name=$1; shift
-    local file=$SERIALS/$name.serial
+function check_link {
+    local lnk=$1
+    local tgt=$2
     
-    local old=$(test -e $ROOT/$file && cat $ROOT/$file || echo '')
+    [ ! -e $ROOT/$lnk ] || [ $(readlink $ROOT/$lnk) != $ROOT/$tgt ]
+}
 
-    log_info "Updating $file..."
+function do_link {
+    local lnk=$1
+    local tgt=$2
 
-    cmd $UPDATE_SERIAL $* $ROOT/$file
+    cmd ln -sf $ROOT/$tgt $ROOT/$lnk
+}
+
+## hosts
+# copy hosts input zone verbatim
+function copy_hosts {
+    local zone=$1
+    local base=$2
+
+    log_debug "base: $base"
+
+    if check_update $zone $base; then
+        log_info "Copying hosts $zone <- $base..."
+
+        do_update $zone \
+            cat $ROOT/$base
+    else
+        log_info "Copying hosts $zone <- $base: not changed"
+    fi
+}
+
+# generate hosts zone from input zone
+function update_hosts {
+    local zone=$1; shift
+    local base=$1; shift
+
+    if check_update $zone $base; then
+        log_info "Generating hosts $zone <- $base..."
+
+        do_update $zone \
+            $PROCESS_ZONE $PROCESS_ARGS $ROOT/$base "$@"
+    else
+        log_info "Generating hosts $zone <- $base: not changed"
+    fi
+}
+
+## actions
+# serial
+function update_serial {
+    local zone=$1; shift
     
-    local new=$(cat $ROOT/$file)
+    local serial=$SERIALS/$zone.serial
+    
+    local old=$(test -e $ROOT/$serial && cat $ROOT/$serial || echo '')
+
+    log_info "Updating $serial..."
+
+    cmd $UPDATE_SERIAL $* $ROOT/$serial
+    
+    local new=$(cat $ROOT/$serial)
         
     log_debug "  $old -> $new"
 }
 
-function link_zone_serial {
-    local name=$1
+function link_serial {
+    local zone=$1
     local base=$2
 
-    local lnk=$SERIALS/$name.serial
+    local lnk=$SERIALS/$zone.serial
     local tgt=$SERIALS/$base.serial
 
-    if [ -e $ROOT/$lnk ] && [ $(readlink $ROOT/$lnk) == $ROOT/$tgt ]; then
-        log_info "Linking $lnk -> $tgt: not changed"
+    if check_link $lnk $tgt; then
+        log_info "Linking $lnk -> $tgt..."
+
+        do_link $lnk $tgt
 
     else
-        log_info "Linking $lnk -> $tgt..."
-
-        cmd ln -sf $ROOT/$tgt $ROOT/$lnk
+        log_info "Linking $lnk -> $tgt: not changed"
     fi
 }
 
-function update_zone_part {
-    local zone=$1
-    local part=$2
+# zone
+function copy_zone {
+    local view=$1
+    local zone=$2
+    local base=${3:-$zone}
 
-    local name=$zone.zone.$part
-    local src=$DATA/$name
-    local dst=$ZONES/$name
-
+    local out=$ZONES/$view/$zone
+    local src=$DATA/$base
 
-    if check_update $dst $src; then
-        log_info "Copying zones/$name..."
+    if check_update $out $src; then
+        log_info "Copying $out <- $src..."
 
-        do_update $dst cat $ROOT/$src
+        do_update $out cat $ROOT/$src
     else
-        log_info "Copying zones/$name: not changed"
+        log_info "Copying $out <- $src: not changed"
     fi
 }
 
 function update_zone {
-    local zone=$1
+    local view=$1
+    local zone=$2
+    local base=${3:-$zone}
 
-    local out=$ZONES/$zone
-    local in=$DATA/$zone.zone
-    local serial=$SERIALS/$zone.serial
+    local out=$ZONES/$view/$zone
+    local src=$DATA/$base.zone
+    local lnk=$ZONES/$base
+    local serial=$SERIALS/$base.serial
 
-    if check_update $out $in $serial; then
-        log_info "Generating $out..." 
+    log_debug "$out: from src $src"
+
+    if [ ! -e $src ]; then
+        fail "Missing source: $src"
+
+    elif check_update $out $src $serial; then
+        log_info "Generating $out <- $src..." 
 
         do_update $out \
-            $EXPAND_ZONE $ROOT/$DATA/$zone.zone   \
-                --serial $ROOT/$SERIALS/$zone.serial  \
-                --expand zones=$(abspath $ZONES)
-    else
-        log_info "Generating $out: not changed" 
-    fi
-}
-
-function update_zone_view {
-    local zone=$1
-    local view=$2
-
-    local out=$ZONES/$view/$zone
-    local in=$DATA/$zone.zone
-    local serial=$SERIALS/$zone.serial
-
-    if check_update $out $in $serial; then
-        log_info "Generating $out..."
-
-        do_update $out \
-            $EXPAND_ZONE $ROOT/$DATA/$zone.zone   \
-                --serial $ROOT/$SERIALS/$zone.serial  \
+            $EXPAND_ZONE $ROOT/$src                 \
+                --serial $ROOT/$serial              \
                 --expand zones=$(abspath $ZONES)    \
                 --expand view=$view
     else
-        log_info "Generating $out: not changed"
+        log_info "Generating $out <- $src: not changed" 
     fi
 }
 
-function link_zone_view {
-    local zone=$1
-    local view=$2
-    local base=$3
-    
-    local lnk=$ZONES/$view/$zone
-    local tgt=
+function link_zone {
+    local view=$1
+    local zone=$2
+    local base=${3:-$zone}
 
-    # find tgt
-    for path in "$ZONES/$view/$base" "$ZONES/$base"; do
-        if [ -e "$ROOT/$path" ]; then
-            log_debug "$view/$zone: base $base from $path"
-            tgt="$path"
-
-            break
-        fi
+    local out=$ZONES/$view/$zone
+    
+    for tgt in $ZONES/$view/$base $ZONES/common/$base; do
+        [ $tgt != $out ] && [ -e $tgt ] && break
     done
 
-    if [ ! $tgt ]; then
-        die "$view/$zone: base $base not found!"
-    fi
-   
-    # link
-    if [ -e $ROOT/$lnk ] && [ $(readlink $ROOT/$lnk) == $ROOT/$tgt ]; then
-        log_info "Linking $lnk -> $tgt: not changed"
+    log_debug "$out: from "
 
+    if check_link $out $tgt; then
+        log_info "Linking $out -> $tgt..."
+
+        do_link $out $tgt
     else
-        log_info "Linking $lnk -> $tgt..."
-
-        cmd ln -sf $ROOT/$tgt $ROOT/$lnk
+        log_info "Linking $out -> $tgt: not changed"
     fi
 }
 
-function update_hosts {
-    local dst=$1; shift
-    local src=$1; shift
-
-
-    if check_update $dst $src; then
-        log_info "Generating $dst..."
-
-        do_update $dst $PROCESS_ZONE $PROCESS_ARGS $ROOT/$src "$@"
-    else
-        log_info "Generating $dst: not changed"
-    fi
-}
-
-# feed `hg annotate -qd`'d version of input to process-zone --input-line-date
-# only applies commit'd data
-function update_hosts_meta {
-    local dst=$1; shift
-    local src=$1; shift
-
-    if check_update $dst $src; then
-        log_info "Generating $dst..."
-        
-        # via stdin
-        $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"
-    fi
-}
-
+## Tests
 function check_hosts {
     local hosts=$1; shift 1
 
@@ -531,17 +527,20 @@
 }
 
 function check_zone {
-    local name=$1
-    local file=$2
+    local view=$1
+    local zone=$2
+    local origin=$3
 
-    local cmd=($NAMED_CHECKZONE $name $ROOT/$file)
+    local src=$ZONES/$view/$zone
+
+    local cmd=($NAMED_CHECKZONE $origin $ROOT/$src)
 
     # test
     # XXX: checkzone is very specific about the order of arguments, -q must be first
-    if $NAMED_CHECKZONE -q $name $ROOT/$file; then
-        log_info "Check $file($name): OK"
+    if $NAMED_CHECKZONE -q $origin $ROOT/$src; then
+        log_info "Check $src ($origin): OK"
     else
-        log_error "  Check $file($name): Failed:"
+        log_error "  Check $src ($origin): Failed:"
 
         indent "    " "${cmd[@]}"
         
@@ -549,6 +548,7 @@
     fi
 }
 
+## Deploy
 # deploy new zone data to bind
 function deploy_zones {
     indent "        rndc: " $RNDC reload
@@ -582,16 +582,16 @@
     # test tty
     [ -t 1 ] && IS_TTY=y
     
-    local views=(internal external)
-
     parse_args "$@"
 
     ## test env
     [ -d $ROOT/$DATA ] || die "Missing data: $ROOT/$DATA"
     ensure_dir  $ZONES
     
-    # views
-    for view in "${views[@]}" "common" "hosts"; do
+    # output dirs
+    local views=(internal external)
+
+    for view in "${views[@]}" "common" "hosts" "includes"; do
         ensure_dir $ZONES/$view
     done
 
@@ -602,24 +602,27 @@
 
     # update
     log "Generating host zones..."
-        update_hosts    $ZONES/hosts/paivola.internal       $DATA/paivola.txt --forward-zone --forward-txt --forward-mx $FORWARD_MX
-        update_hosts    $ZONES/hosts/paivola.external       $DATA/paivola.txt --forward-zone
-        update_hosts    $ZONES/hosts/194.197.235            $DATA/paivola.txt --reverse-zone $REVERSE_ZONE --reverse-domain $REVERSE_DOMAIN
+        #                   zone                            base                *args
+        update_hosts        $ZONES/hosts/paivola:internal   $DATA/paivola.txt   --forward-zone --forward-txt --forward-mx $FORWARD_MX
+        update_hosts        $ZONES/hosts/paivola:external   $DATA/paivola.txt   --forward-zone
+        update_hosts        $ZONES/hosts/194.197.235        $DATA/paivola.txt   --reverse-zone $REVERSE_ZONE --reverse-domain $REVERSE_DOMAIN
 
         
-        # XXX: foward
-        update_hosts    $ZONES/hosts/pvl                    $DATA/pvl.txt      --forward-zone
-        update_hosts    $ZONES/hosts/10                     $DATA/pvl.txt      --reverse-zone 10 --reverse-domain pvl -q
-        update_hosts    $ZONES/hosts/192.168                $DATA/pvl.txt      --reverse-zone 192.168 --reverse-domain pvl -q
+        update_hosts        $ZONES/hosts/10                 $DATA/pvl.txt       --reverse-zone 10 --reverse-domain pvl -q
+        update_hosts        $ZONES/hosts/192.168            $DATA/pvl.txt       --reverse-zone 192.168 --reverse-domain pvl -q
 
+        # XXX: unsupported --forward-zone with pvl.txt
+        # update_hosts    $ZONES/hosts/pvl                    $DATA/pvl.txt      --forward-zone
+        copy_hosts          $ZONES/hosts/pvl                $DATA/pvl.txt
 
     ## zones
     # parts
-    log "Copying zone parts..."
-        update_zone_part    paivola         auto
-        update_zone_part    paivola         services
-        update_zone_part    paivola         internal
-        update_zone_part    paivola         external
+    log "Copying zone includes..."
+        #                   view            zone                    base
+        copy_zone           includes        paivola:internal        paivola.zone.internal
+        copy_zone           includes        paivola:external        paivola.zone.external
+        copy_zone           includes        paivola.auto            paivola.zone.auto
+        copy_zone           includes        paivola.services        paivola.zone.services
 
     # serials
     if [ $SERIAL_NOUPDATE ]; then
@@ -628,47 +631,49 @@
     else
         log "Updating serials..."
 
-        update_zone_serial  pvl
-        link_zone_serial    10          pvl
-        link_zone_serial    192.168     pvl
+        #                   zone            base
+        update_serial       pvl
+        link_serial         10              pvl
+        link_serial         192.168         pvl
 
-        update_zone_serial  paivola
-        update_zone_serial  194.197.235
+        update_serial       paivola
+        update_serial       194.197.235
     fi
 
-    # headers
-    log "Updating zones headers..."
-        update_zone_view    pvl                 internal
-        update_zone_view    paivola             internal
-        update_zone_view    paivola             external
+    # zones
+    log "Updating zones..."
+        #                   view        zone            base
+        update_zone         internal    pvl
+        update_zone         internal    paivola
+        update_zone         external    paivola
 
-        update_zone_view    10                  internal
-        update_zone_view    192.168             internal
+        update_zone         internal    10
+        update_zone         internal    192.168
 
-        update_zone_view    194.197.235         common
+        update_zone         common      194.197.235
+        link_zone           internal    194.197.235
+        link_zone           external    194.197.235
 
     # test
     log "Testing zones..."
-        check_zone          paivola.fi                  $ZONES/external/paivola
-        check_zone          paivola.fi                  $ZONES/internal/paivola
+        #                   view        zone            origin
+        check_zone          internal    paivola         paivola.fi
+        check_zone          external    paivola         paivola.fi
 
-        check_zone          10.in-addr.arpa             $ZONES/internal/10
-        check_zone          192.168.in-addr.arpa        $ZONES/internal/192.168
-        check_zone          235.197.194.in-addr.arpa    $ZONES/common/194.197.235
+        check_zone          internal    10              10.in-addr.arpa
+        check_zone          internal    192.168         192.168.in-addr.arpa
+        check_zone          common      194.197.235     235.197.194.in-addr.arpa
 
     # extra zones...
-    local base_zone=paivola
+    local base=paivola
     local link_zones=(paivola.fi paivola.net paivola.org paivola.info paivola.mobi xn--pivl-load8j.fi)
 
-    log "Linking extra zones..."
+    log "Linking zones..."
     for view in "${views[@]}"; do
         for zone in "${link_zones[@]}"; do
-            link_zone_view  $zone   $view   $base_zone
-            check_zone      $zone   $ZONES/$view/$zone
+            link_zone       $view       $zone           $base
+            check_zone      $view       $zone           $zone
         done
-
-        # reverse
-        link_zone_view      194.197.235     $view   common/194.197.235
     done
 
     ## deploy