# HG changeset patch # User Tero Marttila # Date 1387238813 -7200 # Node ID 4ad9c9b7cd0e17d3100de255e233a4f354b6c4f3 # Parent 77df429f63a3d56ca12b3b96870faa4ad01a7792 update: many things diff -r 77df429f63a3 -r 4ad9c9b7cd0e bin/update --- a/bin/update Tue Dec 17 01:17:49 2013 +0200 +++ b/bin/update Tue Dec 17 02:06:53 2013 +0200 @@ -49,41 +49,49 @@ log "Updating forward host zones..." for hosts in $(list_files etc/hosts); do - update_hosts_forward var/zones/hosts/$hosts $hosts \ - etc/hosts/$hosts + update_hosts_forward "var/zones/hosts/$hosts" "$hosts" \ + "etc/hosts/$hosts" done log "Updating DHCP hosts..." for hosts in $(list_files etc/hosts); do - update_hosts_dhcp var/dhcp/$hosts.conf \ - etc/hosts/$hosts + update_hosts_dhcp "var/dhcp/$hosts.conf" \ + "etc/hosts/$hosts" done log "Updating reverse host zones..." update_hosts_reverse var/zones/hosts/194.197.235 194.197.235.0/24 \ - etc/hosts/paivola.fi etc/hosts/*.paivola.fi + "etc/hosts/paivola.fi" etc/hosts/*.paivola.fi + + update_hosts_reverse var/zones/hosts/10 10.0.0.0/8 \ + "etc/hosts/*.pvl" update_hosts_reverse var/zones/hosts/10.0 10.0.0.0/16 \ - etc/hosts/test.pvl - + "etc/hosts/test.pvl" + + update_hosts_reverse var/zones/hosts/192.168 192.168.0.0/16 \ + "etc/hosts/*.pvl" + update_hosts_reverse var/zones/hosts/fdc4:4cef:395a fdc4:4cef:395a::/48 \ - etc/hosts/test.pvl + "etc/hosts/test.pvl" } function run_zones { log "Copying zone includes..." for zone in $(list_files etc/zones/includes); do - copy var/zones/includes/$zone etc/zones/includes/$zone + copy "var/zones/includes/$zone" "etc/zones/includes/$zone" done log "Updating zone serials..." for zone in $(list_files etc/zones); do - update_serial var/serials/$zone etc/zones/$zone + update_serial "var/serials/$zone" "etc/zones/$zone" \ + $(zone_includes var/include-cache/$zone etc/zones/$zone var/zones) + done log "Updating zones..." for zone in $(list_files etc/zones); do - update_zone var/zones/$zone etc/zones/$zone var/serials/$zone + update_zone "var/zones/$zone" "etc/zones/$zone" "var/serials/$zone" done log "Testing zones..." @@ -114,7 +122,7 @@ done ## Output dirs - for dir in var var/dhcp var/zones var/serials; do + for dir in var var/dhcp var/zones var/serials var/include-cache; do ensure_dir $dir done diff -r 77df429f63a3 -r 4ad9c9b7cd0e lib/update.args --- a/lib/update.args Tue Dec 17 01:17:49 2013 +0200 +++ b/lib/update.args Tue Dec 17 02:06:53 2013 +0200 @@ -109,7 +109,7 @@ UPDATE_NOOP=y # implies -Sp UPDATE_DIFF=y - SERIAL_NOUPDATE=y + SERIAL_NOOP=y COMMIT_SKIP=y RELOAD_NOOP=y ;; diff -r 77df429f63a3 -r 4ad9c9b7cd0e lib/update.log --- a/lib/update.log Tue Dec 17 01:17:49 2013 +0200 +++ b/lib/update.log Tue Dec 17 02:06:53 2013 +0200 @@ -83,6 +83,10 @@ log_debug "$prefix: $*" } +function warn { + log_warn "$(func_caller): $*" +} + # Log with func_caller at log_error and exit, intended for internal errors... function fail { log_error "$(func_caller): $*" diff -r 77df429f63a3 -r 4ad9c9b7cd0e lib/update.operations --- a/lib/update.operations Tue Dec 17 01:17:49 2013 +0200 +++ b/lib/update.operations Tue Dec 17 02:06:53 2013 +0200 @@ -4,13 +4,13 @@ # Operations on zonefiles/hosts/whatever function link { - local out=$1 - local tgt=$2 + local out="$1" + local tgt="$2" - if check_link $out $tgt; then + if check_link "$out" "$tgt"; then log_update "Linking $out -> $tgt..." - do_link $out $tgt + do_link "$out" "$tgt" else log_skip "Linking $out -> $tgt: not changed" @@ -18,14 +18,14 @@ } function copy { - local out=$1 - local src=$2 + local out="$1" + local src="$2" - if check_update $out $src; then + if check_update "$out" "$src"; then log_update "Copying $out <- $src..." - do_update $out \ - cat $src + do_update "$out" \ + cat "$src" else log_skip "Copying $out <- $src: not changed" fi @@ -36,53 +36,36 @@ # check $src $cmd $args... # function check { - local src=$1; shift - local cmd=$1; shift + local src="$1"; shift + local cmd="$1"; shift - if cmd_test $cmd -q "$@"; then + if cmd_test "$cmd" -q "$@"; then log_skip "Check $src: OK" else log_error " Check $src: Failed" - indent " " $cmd "$@" + indent " " "$cmd" "$@" exit 1 fi } -## Hosts -## Update hosts from verbatim from input zone data: -# -# copy_hosts $ZONES/$zone $DATA/$base -# -# Writes updated zone to $zone, deps on $base. -function copy_hosts { - local zone=$1 - local base=$2 - - # XXX: filenames given directly - local out=$zone - local src=$base - - copy $out $src -} - ## Generate forward zone from hosts hosts using pvl.hosts-dns: # # update_hosts_forward out/hosts/$hosts $hosts in/hosts/$hosts function update_hosts_forward { - local out=$1; shift - local domain=$1; shift - local src=$1; shift + local out="$1"; shift + local domain="$1"; shift + local src="$1"; shift - if check_update $out $src "$@"; then + if check_update "$out" "$src" "$@"; then log_update "Generating forward hosts zone $out <- $src..." - do_update $out $OPT/bin/pvl.hosts-dns \ + do_update "$out" $OPT/bin/pvl.hosts-dns \ --hosts-charset=$CHARSET \ - --forward-zone=$domain \ - $src "$@" + --forward-zone="$domain" \ + "$src" "$@" else log_skip "Generating forward hosts $out <- $src: not changed" @@ -108,17 +91,17 @@ # # update_hosts_reverse out/hosts/$reverse $reverse in/hosts/$hosts function update_hosts_reverse { - local out=$1; shift - local reverse=$1; shift - local src=$1; shift + local out="$1"; shift + local reverse="$1"; shift + local src="$1"; shift - if check_update $out $src "$@"; then + if check_update "$out" "$src" "$@"; then log_update "Generating reverse hosts zone $out <- $src..." - do_update $out $OPT/bin/pvl.hosts-dns \ + do_update "$out" $OPT/bin/pvl.hosts-dns \ --hosts-charset=$CHARSET \ - --reverse-zone=$reverse \ - $src "$@" + --reverse-zone="$reverse" \ + "$src" "$@" else log_skip "Generating reverse hosts $out <- $src: not changed" @@ -131,15 +114,15 @@ # # Shows old/new serial on debug. function do_update_serial { - local serial=$1 + local serial="$1" # read - local old=$(test -e $serial && cat $serial || echo '') + local old=$(test -e "$serial" && cat "$serial" || echo '') - cmd $OPT/bin/pvl.dns-serial $serial + cmd $OPT/bin/pvl.dns-serial "$serial" # read - local new=$(cat $serial) + local new=$(cat "$serial") debug " $old -> $new" } @@ -152,15 +135,15 @@ # Supports SERIAL_FORCE/NOOP. # Updates $SERIALS/$zone.serial. function update_serial { - local serial=$1; shift + local serial="$1"; shift # test if [ $SERIAL_FORCE ]; then log_force "Updating $serial: forced" - do_update_serial $serial + do_update_serial "$serial" - elif ! check_update $serial "$@"; then + elif ! check_update "$serial" "$@"; then log_skip "Updating $serial: not changed" elif [ $SERIAL_NOOP ]; then @@ -169,113 +152,28 @@ else log_update "Updating $serial..." - do_update_serial $serial + do_update_serial "$serial" fi } -## Link serial for zone from given base-zone: +## Generate zone file from source using pvl.dns-zone: # -# link_serial $zone $base -function link_serial { - local zone=$1 - local base=$2 - - local out=$SERIALS/$zone.serial - local tgt=$SERIALS/$base.serial - - link $out $tgt -} - -## Update zone file verbatim from source: -# -# copy_zone $view $zone [$base] -# -# Copies changed $DATA/$base zone data to $ZONES/$view/$zone. -function copy_zone { - local view=$1 - local zone=$2 - local base=${3:-$zone} - - local out=$ZONES/$view/$zone - local src=$DATA/$base +# update_zone out/zones/$zone in/zones/$zone var/serials/$zone +function update_zone { + local out="$1" + local src="$2" + local serial="$3" - copy $out $src -} - -## Return the first zone that exists under $DATA/$name.zone -# -# base=$(choose_zone $name...) -function choose_zone { - # look - for name in "$@"; do - if [ $name ] && [ -e $DATA/$name.zone ]; then - echo $name - return 0 - fi - done - - # failed to find - die "Unable to find zone in $DATA/*.zone: $@" -} - -## Expand zone file from source using pvl.dns-zone: -# -# update_zone $view $zone [$base] -function update_zone { - local out=$1 - local src=$2 - local serial=$3 - - if check_update $out $src $serial; then + if check_update "$out" "$src" "$serial"; then log_update "Generating $out <- $src..." - do_update $out $OPT/bin/pvl.dns-zone $src \ - --serial $(cat $serial) + do_update "$out" $OPT/bin/pvl.dns-zone "$src" \ + --serial $(cat "$serial") else log_skip "Generating $out <- $src: not changed" fi } -## Link zone file to ues given shared zone. -# -# link_zone $view $zone [$base] -# -# Looks for shared zone at: -# $ZONES/$view/$base -# $ZONES/common/$base -function link_zone { - local view=$1 - local zone=$2 - local base=${3:-$zone} - - local out=$ZONES/$view/$zone - local tgt=$(choose_link $out $ZONES/$view/$base $ZONES/common/$base) - - link $out $tgt -} - -## Link dhcp file directly from data to $DHCP -function link_dhcp_conf { - local conf=$1 - local base=${2:-$conf} - - local out=$DHCP/$conf.conf - local tgt=$(choose_link $out $DHCP/$base.conf $DHCP_DATA/$base.conf) - - link $out $tgt -} - -## Copy dhcp conf from data to $DHCP -function copy_dhcp_conf { - local conf=$1 - local base=${2:-$conf} - - local out=$DHCP/$conf.conf - local src=$DHCP_DATA/$base.conf - - copy $out $src -} - ## Test hosts zone for validity using pvl.hosts-check: # # check_hosts .../hosts diff -r 77df429f63a3 -r 4ad9c9b7cd0e lib/update.updates --- a/lib/update.updates Tue Dec 17 01:17:49 2013 +0200 +++ b/lib/update.updates Tue Dec 17 02:06:53 2013 +0200 @@ -10,7 +10,7 @@ # Returns true if the output file needs to be updated. function check_update { # target - local out=$1; shift + local out="$1"; shift debug "$out" @@ -21,7 +21,7 @@ debug " update: unknown deps" update=y - elif [ ! -e $out ]; then + elif [ ! -e "$out" ]; then debug " update: dest missing" update=y @@ -37,9 +37,9 @@ # check if [ ! -e "$dep" ]; then - fail "$out: Missing source: $dep" + warn "$out: Missing source: $dep" - elif [ $out -ot "$dep" ]; then + elif [ "$out" -ot "$dep" ]; then debug " update: $dep" update=y else @@ -60,18 +60,18 @@ # Writes output to a temporary .new file, optionally shows a diff of changes, and commits # the new version to $out (unless noop'd). function do_update { - local out=$1; shift - local tmp=$out.new + local out="$1"; shift + local tmp="$out.new" debug "$out" - cmd "$@" > $tmp + cmd "$@" > "$tmp" # compare - if [ -e $out ] && [ $UPDATE_DIFF ]; then + if [ -e "$out" ] && [ $UPDATE_DIFF ]; then debug " changes:" # terse - indent " " diff --unified=1 $out $tmp || true + indent " " diff --unified=1 "$out" "$tmp" || true fi # deploy @@ -79,33 +79,15 @@ # cleanup debug " no-op" - cmd rm $tmp + cmd rm "$tmp" else # commit debug " deploy" - cmd mv $tmp $out + cmd mv "$tmp" "$out" fi } -## Look for a link target: -# -# find_link $lnk $tgt... -# -# Outputs the first given target to exist, skipping any that are the same as the given $lnk. -# If no $tgt matches, outputs the last one, or '-'. -function choose_link { - local lnk=$1; shift - local tgt=- - - for tgt in "$@"; do - [ $tgt != $out ] && [ -e $tgt ] && break - done - - echo $tgt -} - - ## Compare symlink to target: # # check_link $lnk $tgt && do_link $lnk $tgt || ... @@ -113,12 +95,12 @@ # Tests if the symlink exists, and the target matches. # Fails if the target does not exist. function check_link { - local lnk=$1 - local tgt=$2 + local lnk="$1" + local tgt="$2" - [ ! -e $tgt ] && fail "$tgt: target does not exist" + [ ! -e "$tgt" ] && fail "$tgt: target does not exist" - [ ! -e $lnk ] || [ $(readlink $lnk) != $tgt ] + [ ! -e "$lnk" ] || [ $(readlink "$lnk") != "$tgt" ] } ## Update symlink to point to target: @@ -126,9 +108,28 @@ # do_link $lnk $tgt # function do_link { - local lnk=$1 - local tgt=$2 + local lnk="$1" + local tgt="$2" - cmd ln -sf $tgt $lnk + cmd ln -sf "$tgt" "$lnk" } +## Read include paths from file +function read_zone_includes { + cmd sed -n -E 's/^\$INCLUDE\s+"(.+)"/\1/p' "$@" +} + +## (cached) include paths for zone file +function zone_includes { + local cache="$1" + local src="$2" + local dir="$3" + + if [ ! -e "$cache" -o "$cache" -ot "$src" ]; then + read_zone_includes "$src" > "$cache" + fi + + while read include; do + echo -n "$dir/$include " + done < "$cache" +} diff -r 77df429f63a3 -r 4ad9c9b7cd0e lib/update.utils --- a/lib/update.utils Tue Dec 17 01:17:49 2013 +0200 +++ b/lib/update.utils Tue Dec 17 02:06:53 2013 +0200 @@ -30,7 +30,7 @@ # # Output is kept on stdout, exit status is that of the given command. function indent () { - local indent=$1; shift + local indent="$1"; shift "$@" | sed "s/^/$indent/" @@ -41,11 +41,11 @@ ### FS utils # Create dir if not exists. function ensure_dir { - local dir=$1 + local dir="$1" - if [ ! -d $dir ]; then + if [ ! -d "$dir" ]; then log_warn "Creating output dir: $dir" - cmd mkdir $dir + cmd mkdir "$dir" fi } @@ -55,7 +55,7 @@ # # XXX: improve...? function abspath () { - local path=$1 + local path="$1" echo "$SRV/$path" } @@ -65,13 +65,13 @@ # list_files $dir $glob # function list_files { - local dir=$1 - local glob=${2:-*} + local dir="$1" + local glob="${2:-*}" local name= for file in $dir/$glob; do # only files - [ -f $file ] || continue + [ -f "$file" ] || continue # strip prefix name=${file#$dir/}