terom@575: ## vim: set ft=sh : terom@575: # terom@575: # Operations on zonefiles/hosts/whatever terom@575: terom@575: ## Hosts terom@575: ## Update hosts from verbatim from input zone data: terom@575: # terom@575: # copy_hosts $ZONES/$zone $DATA/$base terom@575: # terom@575: # Writes updated zone to $zone, deps on $base. terom@575: function copy_hosts { terom@575: local zone=$1 terom@575: local base=$2 terom@575: terom@575: if check_update $zone $base; then terom@575: log_update "Copying hosts $zone <- $base..." terom@575: terom@575: do_update $zone \ terom@575: cat $ROOT/$base terom@575: else terom@575: log_skip "Copying hosts $zone <- $base: not changed" terom@575: fi terom@575: } terom@575: terom@575: ## Generate hosts from input zone data using $BIN/process-zone: terom@575: # terom@575: # update_hosts $ZONES/$zone $DATA/$base terom@575: # terom@575: # Writes process-zone'd data to $zone, deps on $base. terom@575: function update_hosts { terom@575: local zone=$1; shift terom@575: local base=$1; shift terom@575: terom@575: if check_update $zone $base; then terom@575: log_update "Generating hosts $zone <- $base..." terom@575: terom@575: do_update $zone \ terom@575: $BIN/process-zone $PROCESS_ARGS $ROOT/$base "$@" terom@575: else terom@575: log_skip "Generating hosts $zone <- $base: not changed" terom@575: fi terom@575: } terom@575: terom@575: ## Generate new serial for zone using $BIN/update-serial, if the zone data has changed: terom@575: # terom@575: # update_serial $zone $deps... terom@575: # terom@575: # Supports SERIAL_FORCE/NOOP. terom@575: # Updates $SERIALS/$zone.serial. terom@575: function update_serial { terom@575: local zone=$1; shift terom@575: terom@575: local serial=$SERIALS/$zone.serial terom@575: terom@575: # test terom@575: if [ $SERIAL_FORCE ]; then terom@575: log_force "Updating $serial: forced" terom@575: terom@575: do_update_serial $serial terom@575: terom@575: elif ! check_update $serial "$@"; then terom@575: log_skip "Updating $serial: not changed" terom@575: terom@575: elif [ $SERIAL_NOOP ]; then terom@575: log_noop "Updating $serial: skipped" terom@575: terom@575: else terom@575: log_update "Updating $serial..." terom@575: terom@575: do_update_serial $serial terom@575: fi terom@575: } terom@575: terom@575: ## Link serial for zone from given base-zone: terom@575: # terom@575: # link_serial $zone $base terom@575: function link_serial { terom@575: local zone=$1 terom@575: local base=$2 terom@575: terom@575: local lnk=$SERIALS/$zone.serial terom@575: local tgt=$SERIALS/$base.serial terom@575: terom@575: if check_link $lnk $tgt; then terom@575: log_update "Linking $lnk -> $tgt..." terom@575: terom@575: do_link $lnk $tgt terom@575: terom@575: else terom@575: log_skip "Linking $lnk -> $tgt: not changed" terom@575: fi terom@575: } terom@575: terom@575: ## Update zone file verbatim from source: terom@575: # terom@575: # copy_zone $view $zone [$base] terom@575: # terom@575: # Copies changed $DATA/$base zone data to $ZONES/$view/$zone. terom@575: function copy_zone { terom@575: local view=$1 terom@575: local zone=$2 terom@575: local base=${3:-$zone} terom@575: terom@575: local out=$ZONES/$view/$zone terom@575: local src=$DATA/$base terom@575: terom@575: if check_update $out $src; then terom@575: log_update "Copying $out <- $src..." terom@575: terom@575: do_update $out \ terom@575: cat $ROOT/$src terom@575: else terom@575: log_skip "Copying $out <- $src: not changed" terom@575: fi terom@575: } terom@575: terom@575: ## Expand zone file from source using $BIN/expand-zone: terom@575: # terom@575: # update_zone $view $zone [$base] terom@575: # terom@575: # Processed $DATA/$base zone data through $BIN/expand-zone, writing output to $ZONES/$view/$zone. terom@575: function update_zone { terom@575: local view=$1 terom@575: local zone=$2 terom@575: local base=${3:-$zone} terom@575: terom@575: local out=$ZONES/$view/$zone terom@575: local src=$DATA/$base.zone terom@575: local lnk=$ZONES/$base terom@575: terom@575: local serial=$SERIALS/$base.serial terom@575: terom@575: if check_update $out $src $serial; then terom@575: log_update "Generating $out <- $src..." terom@575: terom@575: do_update $out \ terom@575: $BIN/expand-zone $ROOT/$src \ terom@575: --serial $ROOT/$serial \ terom@575: --expand zones=$(abspath $ZONES) \ terom@575: --expand view=$view terom@575: else terom@575: log_skip "Generating $out <- $src: not changed" terom@575: fi terom@575: } terom@575: terom@575: ## Link zone file to ues given shared zone. terom@575: # terom@575: # link_zone $view $zone [$base] terom@575: # terom@575: # Looks for shared zone at: terom@575: # $ZONES/$view/$base terom@575: # $ZONES/common/$base terom@575: function link_zone { terom@575: local view=$1 terom@575: local zone=$2 terom@575: local base=${3:-$zone} terom@575: terom@575: local out=$ZONES/$view/$zone terom@575: local tgt=$(choose_link $out $ZONES/$view/$base $ZONES/common/$base) terom@575: terom@575: if check_link $out $tgt; then terom@575: log_update "Linking $out -> $tgt..." terom@575: terom@575: do_link $out $tgt terom@575: terom@575: else terom@575: log_skip "Linking $out -> $tgt: not changed" terom@575: fi terom@575: } terom@575: terom@575: ## Test hosts zone for validity: terom@575: # terom@575: # check_hosts $DATA/$hosts --check-exempt ... terom@575: # terom@575: # Fails if the check fails. terom@575: function check_hosts { terom@575: local hosts=$1; shift 1 terom@575: terom@575: local cmd=($BIN/process-zone $PROCESS_ARGS $ROOT/$hosts --check-hosts "$@") terom@575: terom@575: if "${cmd[@]}" -q; then terom@575: log_skip "Check $hosts: OK" terom@575: else terom@575: log_error " Check $hosts: Failed" terom@575: terom@575: indent " " "${cmd[@]}" terom@575: terom@575: exit 1 terom@575: fi terom@575: } terom@575: terom@575: ## Test zone file for validity using named-checkzone: terom@575: # terom@575: # check_zone $view $zone $origin terom@575: # terom@575: # Uses the zonefile at $ZONES/$view/$zone, loading it with given initial $ORIGIN. terom@575: # Fails if the check fails. terom@575: function check_zone { terom@575: local view=$1 terom@575: local zone=$2 terom@575: local origin=$3 terom@575: terom@575: local src=$ZONES/$view/$zone terom@575: terom@575: local cmd=($NAMED_CHECKZONE $origin $ROOT/$src) terom@575: terom@575: # test terom@575: # XXX: checkzone is very specific about the order of arguments, -q must be first terom@575: if $NAMED_CHECKZONE -q $origin $ROOT/$src; then terom@575: log_skip "Check $src ($origin): OK" terom@575: else terom@575: log_error " Check $src ($origin): Failed:" terom@575: terom@575: indent " " "${cmd[@]}" terom@575: terom@575: exit 1 terom@575: fi terom@575: } terom@575: terom@575: ## Load update zonefiles into bind: terom@575: # terom@575: # deploy_zones terom@575: # terom@575: # Invokes `rndc reload`, showing its output. terom@575: function deploy_zones { terom@575: local msg="Reload zones" terom@575: terom@575: if [ $DEPLOY_SKIP ]; then terom@575: log_skip "$msg: skipped" terom@575: terom@575: elif [ ! -r $RNDC_KEY ]; then terom@575: log_error " $msg: rndc: permission denied: $RNDC_KEY" terom@575: terom@575: else terom@575: log_update "$msg..." terom@575: terom@575: # run terom@575: indent " rndc: " \ terom@575: $RNDC reload terom@575: fi terom@575: } terom@575: ## Commit changes in $DATA to version control: terom@575: # terom@575: # commit_data terom@575: # terom@575: # Invokes `hg commit` in the $REPO, first showing the diff. terom@575: function commit_data { terom@575: local repo=$REPO terom@575: local commit_msg="$COMMIT_MSG" terom@575: terom@575: local msg="Commit changes in $repo" terom@575: terom@575: # operate? terom@575: if [ $COMMIT_FORCE ]; then terom@575: log_force "$msg..." terom@575: terom@575: do_commit "$commit_msg" terom@575: terom@575: elif ! hg_modified; then terom@575: log_skip "$msg: no changes" terom@575: terom@575: elif [ $COMMIT_SKIP ]; then terom@575: log_noop "$msg: skipped" terom@575: terom@575: else terom@575: log_update "$msg..." terom@575: terom@575: do_commit "$commit_msg" terom@575: fi terom@575: } terom@575: