#!/bin/bash
# vim: set ft=sh :
set -ue
if [ $0 == './update' ]; then
SRV=$(pwd)
OPT=./opt
else
SRV=${SRV:-/srv/dns}
OPT=${SRV:-/srv/dns/opt}
cd $SRV
fi
# charset for files under etc/
CHARSET='utf-8'
# External bins
NAMED_CHECKZONE=/usr/sbin/named-checkzone
DHCPD=/usr/sbin/dhcpd
DHCPD_CONF=/etc/dhcp/dhcpd.conf
DHCPD_INIT=/etc/init.d/isc-dhcp-server
HG=/usr/bin/hg
HG_ARGS=(--config trusted.users=root)
RNDC=/usr/sbin/rndc
RNDC_KEY=/etc/bind/rndc.key
# Library includes
source lib/update
## Flags
# set by do_reload_zone if zone data has actually been reloaded
RELOAD_ZONES=
## Site settings, used as arguments to scripts
# Origin domain to generate reverse records for in --reverse-zone
REVERSE_DOMAIN=paivola.fi
## Do things
function update {
log "Testing hosts..."
for hosts in $(list_files etc/hosts); do
log_warn "TODO: check_hosts $hosts"
done
## Hosts
log "Updating forward host zones..."
for hosts in $(list_files etc/hosts); do
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/$hosts.conf" \
"etc/hosts/$hosts"
done
log "Updating reverse host zones..."
for zone in $(list_dirs etc/reverse-zones-hosts); do
update_hosts_reverse "var/zones/hosts/$zone" "$zone" \
etc/reverse-zones-hosts/$zone/*
done
## Zones
log "Copying zone includes..."
for zone in $(list_files etc/zones/includes); do
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" $(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"
done
log "Updating DHCP confs..."
for conf in $(list_files etc/dhcp); do
update_dhcp_conf "var/dhcp/$conf" "etc/dhcp/$conf"
done
## Check
log "Testing zones..."
for zone in $(list_files etc/zones); do
check_zone "var/zones/$zone" $zone
done
log "Testing DHCP confs..."
for conf in var/dhcp/*.conf; do
check_dhcp $conf
done
## Deploy
log "Reload zones..."
reload_zones
log "Reload dhcp..."
reload_dhcp
log "Commit..."
commit etc
}
## Main entry point
function main {
parse_args "$@"
## Input dirs
for dir in etc etc/zones etc/hosts opt; do
[ -d $dir ] || die "Missing directory: $dir"
done
## Output dirs
ensure_dir var
for dir in var/dhcp var/zones var/serials var/include-cache; do
ensure_dir $dir
done
for dir in var/dhcp/hosts; do
ensure_dir $dir
done
for dir in var/zones/includes var/zones/hosts var/zones/reverse-hosts; do
ensure_dir $dir
done
## Go
update
}
main "$@"