--- 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