lib/pvl/hosts/update.sh
changeset 627 a81206440be2
child 628 b10ad946d01d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/pvl/hosts/update.sh	Thu Feb 26 21:38:09 2015 +0200
@@ -0,0 +1,152 @@
+update_GETOPTS='sSrR'
+
+UPDATE_SERIAL=
+UPDATE_RELOAD=
+
+function update_help {
+    cat <<END
+Update:
+    -s      force update serials
+    -S      do not update serial
+
+    -r      force reload zones/dhcp
+    -R      do not reload zones/dhcp
+END
+}
+
+function update_opt {
+    local opt=$1
+    local optarg="$2"
+
+    case $opt in
+        s)  UPDATE_SERIAL=1 ;;
+        S)  UPDATE_SERIAL=0 ;;
+
+        r)  UPDATE_RELOAD=1 ;;
+        R)  UPDATE_RELOAD=0 ;;
+               
+        n)
+            UPDATE_SERIAL=0
+            UPDATE_RELOAD=0
+        ;;
+        *)  return 1
+    esac
+}
+
+function update_setup {
+    for dir in etc etc/zones etc/hosts; do
+        [ -d $dir ] || die "$dir: missing source directory"
+    done
+    
+    apply_dir       $VAR
+
+    for dir in $VAR/dhcp $VAR/zones $VAR/include-cache $VAR/serials; do
+        apply_dir   $dir
+    done
+    for dir in $VAR/dhcp/hosts; do
+        apply_dir   $dir
+    done
+    for dir in $VAR/zones/includes $VAR/zones/forward $VAR/zones/reverse; do
+        apply_dir   $dir
+    done
+}
+
+function update_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..."
+        commit  $SRV
+}
+
+function update_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 update_reload {
+    ## 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 update_main {
+    ## Setup source/output dirs
+    update_setup
+   
+    ## Commit source dirs
+    update_commit
+
+    ## Update output from sources
+    update_update
+
+    ## Reload output
+    update_reload
+}