terom@2: #!/bin/bash terom@2: # vim: set ft=sh : terom@2: terom@94: # Bootstrap terom@82: if [ $0 == './update' ]; then terom@82: SRV=$(pwd) terom@82: OPT=./opt terom@82: else terom@82: SRV=${SRV:-/srv/dns} terom@82: OPT=${SRV:-/srv/dns/opt} terom@82: cd $SRV terom@82: fi terom@2: terom@82: source lib/update terom@44: terom@95: function commit { terom@95: ## Commit terom@95: # pre-commit check terom@13: log "Testing hosts..." terom@82: for hosts in $(list_files etc/hosts); do terom@82: log_warn "TODO: check_hosts $hosts" terom@82: done terom@36: terom@95: # commit, unless noop'd terom@95: log "Commit..." terom@95: update_commit etc terom@95: } terom@95: terom@95: function update { terom@95: if hg_modified etc; then terom@95: serial=$(unix_time) terom@95: log_warn "Using local unix time for uncommited changes: $serial" terom@95: else terom@95: serial=$(hg_time etc) terom@95: log_update "Using HG commit timestamp: $serial" terom@95: fi terom@95: terom@89: ## Hosts terom@84: log "Updating forward host zones..." terom@93: for zone in $(list_dirs etc/hosts/forward); do terom@93: update_hosts_forward "var/zones/hosts/forward/$zone" "$zone" \ terom@93: etc/hosts/forward/$zone/* terom@82: done terom@36: terom@82: log "Updating DHCP hosts..." terom@98: for hosts in $(list etc/hosts/dhcp); do terom@98: update_hosts_dhcp "var/dhcp/hosts/$hosts.conf" $hosts \ terom@98: $(expand_files "etc/hosts/dhcp/$hosts") terom@82: done terom@84: terom@84: log "Updating reverse host zones..." terom@93: for zone in $(list_dirs etc/hosts/reverse); do terom@93: update_hosts_reverse "var/zones/hosts/reverse/$zone" "$zone" \ terom@93: etc/hosts/reverse/$zone/* terom@87: done terom@62: terom@89: ## Zones terom@38: log "Copying zone includes..." terom@82: for zone in $(list_files etc/zones/includes); do terom@85: copy "var/zones/includes/$zone" "etc/zones/includes/$zone" terom@82: done terom@18: terom@82: log "Updating zone serials..." terom@82: for zone in $(list_files etc/zones); do terom@95: update_serial "var/serials/$zone" $serial \ terom@91: "etc/zones/$zone" $(zone_includes var/include-cache/$zone etc/zones/$zone var/zones/) terom@82: done terom@13: terom@38: log "Updating zones..." terom@82: for zone in $(list_files etc/zones); do terom@95: update_zone "var/zones/$zone" "etc/zones/$zone" "var/serials/$zone" \ terom@95: $(zone_includes var/include-cache/$zone etc/zones/$zone var/zones/) terom@82: done terom@91: terom@91: log "Updating DHCP confs..." terom@91: for conf in $(list_files etc/dhcp); do terom@91: update_dhcp_conf "var/dhcp/$conf" "etc/dhcp/$conf" terom@91: done terom@94: } terom@94: terom@94: function deploy { terom@90: ## Check terom@10: log "Testing zones..." terom@82: for zone in $(list_files etc/zones); do terom@90: check_zone "var/zones/$zone" $zone terom@90: done terom@90: terom@91: log "Testing DHCP confs..." terom@90: for conf in var/dhcp/*.conf; do terom@90: check_dhcp $conf terom@82: done terom@66: terom@61: log "Reload zones..." terom@61: reload_zones terom@44: terom@66: log "Reload dhcp..." terom@66: reload_dhcp terom@66: terom@44: } terom@44: terom@44: ## Main entry point terom@44: function main { terom@44: parse_args "$@" terom@44: terom@62: ## Input dirs terom@87: for dir in etc etc/zones etc/hosts opt; do terom@82: [ -d $dir ] || die "Missing directory: $dir" terom@82: done terom@44: terom@44: ## Output dirs terom@91: ensure_dir var terom@95: for dir in var/dhcp var/zones var/include-cache var/serials; do terom@62: ensure_dir $dir terom@62: done terom@91: for dir in var/dhcp/hosts; do terom@91: ensure_dir $dir terom@91: done terom@93: for dir in var/zones/includes var/zones/hosts; do terom@93: ensure_dir $dir terom@93: done terom@93: for dir in var/zones/hosts/forward var/zones/hosts/reverse; do terom@82: ensure_dir $dir terom@30: done terom@30: terom@44: ## Go terom@95: commit terom@89: update terom@94: deploy terom@2: } terom@2: terom@7: main "$@"