bin/update
author Tero Marttila <terom@paivola.fi>
Sun, 22 Dec 2013 15:33:32 +0200
changeset 98 a3734856e0fa
parent 95 a756f317d083
child 100 44c32fd60997
permissions -rwxr-xr-x
use hosts/dhcp/%** to create dhcp hosts configs
#!/bin/bash
# vim: set ft=sh :

# Bootstrap
if [ $0 == './update' ]; then
    SRV=$(pwd)
    OPT=./opt
else
    SRV=${SRV:-/srv/dns}
    OPT=${SRV:-/srv/dns/opt}
    cd $SRV
fi

source lib/update

function commit {
    ## Commit
    # pre-commit check
    log "Testing hosts..."
    for hosts in $(list_files etc/hosts); do
        log_warn "TODO: check_hosts $hosts"
    done

    # commit, unless noop'd
    log "Commit..."
        update_commit       etc
}

function update {
    if hg_modified etc; then
        serial=$(unix_time)
        log_warn "Using local unix time for uncommited changes: $serial"
    else
        serial=$(hg_time etc)
        log_update "Using HG commit timestamp: $serial"
    fi

    ## 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 etc/hosts/dhcp); do
        update_hosts_dhcp       "var/dhcp/hosts/$hosts.conf"        $hosts  \
            $(expand_files "etc/hosts/dhcp/$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"             $serial \
            "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" \
            $(zone_includes var/include-cache/$zone etc/zones/$zone var/zones/)
    done

    log "Updating DHCP confs..."
    for conf in $(list_files etc/dhcp); do
        update_dhcp_conf    "var/dhcp/$conf"                "etc/dhcp/$conf"
    done
}

function deploy {
    ## 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

    log "Reload zones..."
        reload_zones

    log "Reload dhcp..."
        reload_dhcp

}

## 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/include-cache var/serials; 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
    commit
    update
    deploy
}

main "$@"