bin/update
author Tero Marttila <terom@paivola.fi>
Thu, 19 Dec 2013 21:04:07 +0200
branchdns-new
changeset 93 1a313b7b6d40
parent 91 acb2fb235eb2
child 94 1b02d8075676
permissions -rwxr-xr-x
change how hosts forward zones are generated, to use a similar technique as for reverse zones, with both using etc/hosts/{forward,reverse} -> var/zones/hosts/{forward,reverse}
#!/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 zone in $(list_dirs etc/hosts/forward); do
        update_hosts_forward    "var/zones/hosts/forward/$zone"     "$zone" \
            etc/hosts/forward/$zone/*
    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/hosts/reverse); do
        update_hosts_reverse    "var/zones/hosts/reverse/$zone"     "$zone" \
            etc/hosts/reverse/$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; do
        ensure_dir  $dir
    done
    for dir in var/zones/hosts/forward var/zones/hosts/reverse; do
        ensure_dir  $dir
    done

    ## Go
    update
}

main "$@"