tero@628: #HOSTS_CHARSET='utf-8' tero@654: HOSTS_INCLUDE="etc/hosts" tero@628: tero@654: # absolute path! tero@654: ZONES_INCLUDE="$SRV/var/zones" tero@643: tero@628: NAMED_CHECKZONE=/usr/sbin/named-checkzone tero@628: tero@628: RNDC=/usr/sbin/rndc tero@628: RNDC_KEY=/etc/bind/rndc.key tero@628: tero@628: tero@628: ## Generate forward zone from hosts hosts using pvl.hosts-forward tero@628: # tero@628: # update_hosts_forward $out $src tero@628: function update_hosts_forward { tero@628: local out="$1" tero@628: local src="$2" tero@628: local srcs=($src/*) tero@628: local msg="$out: Generating forward hosts zone: $src" tero@628: tero@628: if apply_check "$out" "${srcs[@]}"; then tero@628: log_skip "$msg" tero@628: else tero@628: log_apply "$msg" tero@628: tero@628: apply_cmd "$out" $OPT/bin/pvl.hosts-forward \ tero@628: --hosts-include="$HOSTS_INCLUDE" \ tero@628: "$src" tero@628: fi tero@628: } tero@628: tero@628: ## Generate reverse zone from hosts hosts using pvl.hosts-reverse tero@628: # tero@628: # update_hosts_reverse $out $src tero@628: function update_hosts_reverse { tero@628: local out="$1" tero@628: local src="$2" tero@629: local srcs=$src/* tero@628: local msg="$out: Generating reverse hosts zone: $src" tero@628: tero@629: if apply_check "$out" $srcs; then tero@628: log_skip "$msg" tero@628: else tero@628: log_apply "$msg" tero@628: tero@628: apply_cmd "$out" $OPT/bin/pvl.hosts-reverse \ tero@628: --hosts-include="$HOSTS_INCLUDE" \ tero@628: "$src" tero@628: fi tero@628: } tero@628: tero@628: function update_zone_include { tero@628: local out="$1" tero@628: local src="$2" tero@628: local msg="$out: Copy zone include: $src" tero@628: tero@651: if apply_check "$out" "${@:2}"; then tero@628: log_skip "$msg" tero@628: else tero@628: log_apply "$msg" tero@628: tero@628: apply_cmd "$out" cat \ tero@628: "$src" tero@628: fi tero@628: } tero@628: tero@628: tero@648: ## Update list of zone $INCLUDEs from zone file tero@648: # tero@648: # update_zone_includes var/include-cache/$zone etc/zones/$zone tero@648: # tero@648: function update_zone_includes { tero@648: local out="$1" tero@628: local src="$2" tero@648: local includes="$ZONES_INCLUDE" tero@628: tero@648: if [ "$UPDATE_INCLUDES" = 1 ]; then tero@648: log_force "$out: Force zone includes: $src" tero@648: tero@648: elif apply_check "$out" "$src"; then tero@648: log_skip "$out: Skip zone includes: $src" tero@648: tero@648: return tero@648: tero@648: elif [ "$UPDATE_INCLUDES" = 0 ]; then tero@648: log_noop "$out: Noop zone includes: $src" tero@648: tero@648: return tero@648: else tero@648: log_apply "$out: Update zone includes: $src" tero@628: fi tero@628: tero@648: apply_cmd "$out" $OPT/bin/pvl.dns-includes \ tero@648: --include-path=$ZONES_INCLUDE \ tero@648: "$src" tero@628: } tero@628: tero@643: ## Update the cached .serial for the given zone, if the zone has changed: tero@628: # tero@643: # update_serial var/serials/$zone $serial $deps... tero@628: # tero@643: # Supports UPDATE_SERIAL= tero@628: function update_zone_serial { tero@628: local out="$1" tero@628: local serial="$2" tero@628: tero@628: local old=$(test -e "$out" && cat "$out" || echo '') tero@628: tero@628: # test tero@629: if [ "$UPDATE_SERIAL" = 1 ]; then tero@628: log_force "$out: Force serial $old <- $serial" tero@628: tero@628: elif apply_check "$out" "${@:3}"; then tero@628: log_skip "$out: Skip serial: $old <- $serial" tero@628: tero@628: return tero@628: tero@629: elif [ "$UPDATE_SERIAL" = 0 ]; then tero@628: log_noop "$out: Noop serial: $old <- $serial" tero@628: tero@628: return tero@628: tero@628: else tero@628: log_apply "$out: Update serial: $old <- $serial" tero@628: fi tero@628: tero@628: echo "$serial" > $out tero@628: } tero@628: tero@643: ## Generate zone file from source using pvl.dns-process: tero@628: # tero@643: # update_zone var/zones/$zone etc/zones/$zone var/serials/$zone tero@643: # tero@643: # Sets the SOA serial, and adjusts the $INCLUDE paths tero@628: function update_zone { tero@628: local out="$1" tero@628: local src="$2" tero@628: local serial="$3" tero@628: local serial_opt= tero@628: local msg="$out: Generate zone: $src" tero@628: tero@628: if [ -n "$serial" -a -f "$serial" ]; then tero@628: serial_opt="--serial=$(cat "$serial")" tero@629: elif [ "$UPDATE_SERIAL" = 0 ]; then tero@643: warn "$out: omit noop'd serial" tero@628: else tero@628: fail "$out: missing serial: $serial" tero@628: fi tero@628: tero@651: if apply_check "$out" "${@:2}"; then tero@628: log_skip "$msg" tero@628: else tero@628: log_apply "$msg" tero@628: tero@643: apply_cmd "$out" $OPT/bin/pvl.dns-process \ tero@628: $serial_opt \ tero@643: --include-path=$ZONES_INCLUDE \ tero@628: "$src" tero@628: fi tero@628: } tero@628: tero@628: ## Test zone file for validity using named-checkzone: tero@628: # tero@628: # check_zone ..../$zone $origin tero@628: function test_zone { tero@628: local zone=$1 tero@628: local origin=$2 tero@628: tero@628: log_check "$zone: Checking zone @$origin..." tero@628: tero@628: # checkzone is very specific about the order of arguments, -q must be first tero@628: test_cmd $zone \ tero@628: $NAMED_CHECKZONE $origin $zone tero@628: } tero@628: tero@628: # set by do_reload_zone if zone data has actually been reloaded tero@628: RELOAD_ZONES= tero@628: tero@628: ## Load update zonefiles into bind: tero@628: # tero@628: # reload_zones tero@628: # tero@628: # Invokes `rndc reload`, showing its output. tero@628: function reload_zones { tero@629: if [ "$UPDATE_RELOAD" = 1 ]; then tero@628: log_force "Reload zones" tero@628: tero@629: elif [ "$UPDATE_RELOAD" = 0 ]; then tero@628: log_noop "Skip reload zones" tero@628: tero@628: return tero@628: tero@628: elif [ ! -e "$RNDC" ]; then tero@628: warn "Skip with missing RNDC: $RNDC" tero@628: tero@628: return tero@628: tero@628: elif [ ! -e "$RNDC_KEY" ]; then tero@628: warn "Skip with missing RNDC_KEY: $RNDC_KEY" tero@628: tero@628: return tero@628: tero@628: elif [ ! -r $RNDC_KEY ]; then tero@628: error "Permission denied for RNDC_KEY: $RNDC_KEY" tero@628: tero@628: return 1 tero@628: tero@628: else tero@628: log_apply "Reload zones" tero@628: fi tero@628: tero@632: cmd_indent " rndc: " \ tero@628: $RNDC reload tero@628: tero@628: # set flag for dhcp tero@628: RELOAD_ZONES=1 tero@628: }