bin/update
changeset 38 39799fc994e9
parent 37 f28db5535b10
child 39 57551a87a93e
equal deleted inserted replaced
37:f28db5535b10 38:39799fc994e9
    25 
    25 
    26 # data files
    26 # data files
    27 DATA=settings
    27 DATA=settings
    28 ZONES=zones
    28 ZONES=zones
    29 SERIALS=$DATA
    29 SERIALS=$DATA
    30 REPO=$DATA
    30 REPO=
    31 
    31 
    32 # data args
    32 # data args
    33 PROCESS_ARGS='--input-charset latin-1'
    33 PROCESS_ARGS='--input-charset latin-1'
    34 
    34 
    35 FORWARD_MX=mail
    35 FORWARD_MX=mail
   357     [ ! $sep ] && fail "Invalid args given: $@"
   357     [ ! $sep ] && fail "Invalid args given: $@"
   358 
   358 
   359     check_update $dst "${dep[@]}" && do_update $dst "${cmd[@]}" || true
   359     check_update $dst "${dep[@]}" && do_update $dst "${cmd[@]}" || true
   360 }
   360 }
   361 
   361 
       
   362 function check_link {
       
   363     local lnk=$1
       
   364     local tgt=$2
       
   365     
       
   366     [ ! -e $ROOT/$lnk ] || [ $(readlink $ROOT/$lnk) != $ROOT/$tgt ]
       
   367 }
       
   368 
       
   369 function do_link {
       
   370     local lnk=$1
       
   371     local tgt=$2
       
   372 
       
   373     cmd ln -sf $ROOT/$tgt $ROOT/$lnk
       
   374 }
       
   375 
       
   376 ## hosts
       
   377 # copy hosts input zone verbatim
       
   378 function copy_hosts {
       
   379     local zone=$1
       
   380     local base=$2
       
   381 
       
   382     log_debug "base: $base"
       
   383 
       
   384     if check_update $zone $base; then
       
   385         log_info "Copying hosts $zone <- $base..."
       
   386 
       
   387         do_update $zone \
       
   388             cat $ROOT/$base
       
   389     else
       
   390         log_info "Copying hosts $zone <- $base: not changed"
       
   391     fi
       
   392 }
       
   393 
       
   394 # generate hosts zone from input zone
       
   395 function update_hosts {
       
   396     local zone=$1; shift
       
   397     local base=$1; shift
       
   398 
       
   399     if check_update $zone $base; then
       
   400         log_info "Generating hosts $zone <- $base..."
       
   401 
       
   402         do_update $zone \
       
   403             $PROCESS_ZONE $PROCESS_ARGS $ROOT/$base "$@"
       
   404     else
       
   405         log_info "Generating hosts $zone <- $base: not changed"
       
   406     fi
       
   407 }
       
   408 
   362 ## actions
   409 ## actions
   363 function update_zone_serial {
   410 # serial
   364     local name=$1; shift
   411 function update_serial {
   365     local file=$SERIALS/$name.serial
   412     local zone=$1; shift
   366     
   413     
   367     local old=$(test -e $ROOT/$file && cat $ROOT/$file || echo '')
   414     local serial=$SERIALS/$zone.serial
   368 
   415     
   369     log_info "Updating $file..."
   416     local old=$(test -e $ROOT/$serial && cat $ROOT/$serial || echo '')
   370 
   417 
   371     cmd $UPDATE_SERIAL $* $ROOT/$file
   418     log_info "Updating $serial..."
   372     
   419 
   373     local new=$(cat $ROOT/$file)
   420     cmd $UPDATE_SERIAL $* $ROOT/$serial
       
   421     
       
   422     local new=$(cat $ROOT/$serial)
   374         
   423         
   375     log_debug "  $old -> $new"
   424     log_debug "  $old -> $new"
   376 }
   425 }
   377 
   426 
   378 function link_zone_serial {
   427 function link_serial {
   379     local name=$1
   428     local zone=$1
   380     local base=$2
   429     local base=$2
   381 
   430 
   382     local lnk=$SERIALS/$name.serial
   431     local lnk=$SERIALS/$zone.serial
   383     local tgt=$SERIALS/$base.serial
   432     local tgt=$SERIALS/$base.serial
   384 
   433 
   385     if [ -e $ROOT/$lnk ] && [ $(readlink $ROOT/$lnk) == $ROOT/$tgt ]; then
   434     if check_link $lnk $tgt; then
       
   435         log_info "Linking $lnk -> $tgt..."
       
   436 
       
   437         do_link $lnk $tgt
       
   438 
       
   439     else
   386         log_info "Linking $lnk -> $tgt: not changed"
   440         log_info "Linking $lnk -> $tgt: not changed"
   387 
   441     fi
   388     else
   442 }
   389         log_info "Linking $lnk -> $tgt..."
   443 
   390 
   444 # zone
   391         cmd ln -sf $ROOT/$tgt $ROOT/$lnk
   445 function copy_zone {
   392     fi
   446     local view=$1
   393 }
   447     local zone=$2
   394 
   448     local base=${3:-$zone}
   395 function update_zone_part {
   449 
   396     local zone=$1
   450     local out=$ZONES/$view/$zone
   397     local part=$2
   451     local src=$DATA/$base
   398 
   452 
   399     local name=$zone.zone.$part
   453     if check_update $out $src; then
   400     local src=$DATA/$name
   454         log_info "Copying $out <- $src..."
   401     local dst=$ZONES/$name
   455 
   402 
   456         do_update $out cat $ROOT/$src
   403 
   457     else
   404     if check_update $dst $src; then
   458         log_info "Copying $out <- $src: not changed"
   405         log_info "Copying zones/$name..."
       
   406 
       
   407         do_update $dst cat $ROOT/$src
       
   408     else
       
   409         log_info "Copying zones/$name: not changed"
       
   410     fi
   459     fi
   411 }
   460 }
   412 
   461 
   413 function update_zone {
   462 function update_zone {
   414     local zone=$1
   463     local view=$1
   415 
   464     local zone=$2
   416     local out=$ZONES/$zone
   465     local base=${3:-$zone}
   417     local in=$DATA/$zone.zone
   466 
   418     local serial=$SERIALS/$zone.serial
   467     local out=$ZONES/$view/$zone
   419 
   468     local src=$DATA/$base.zone
   420     if check_update $out $in $serial; then
   469     local lnk=$ZONES/$base
   421         log_info "Generating $out..." 
   470     local serial=$SERIALS/$base.serial
       
   471 
       
   472     log_debug "$out: from src $src"
       
   473 
       
   474     if [ ! -e $src ]; then
       
   475         fail "Missing source: $src"
       
   476 
       
   477     elif check_update $out $src $serial; then
       
   478         log_info "Generating $out <- $src..." 
   422 
   479 
   423         do_update $out \
   480         do_update $out \
   424             $EXPAND_ZONE $ROOT/$DATA/$zone.zone   \
   481             $EXPAND_ZONE $ROOT/$src                 \
   425                 --serial $ROOT/$SERIALS/$zone.serial  \
   482                 --serial $ROOT/$serial              \
   426                 --expand zones=$(abspath $ZONES)
       
   427     else
       
   428         log_info "Generating $out: not changed" 
       
   429     fi
       
   430 }
       
   431 
       
   432 function update_zone_view {
       
   433     local zone=$1
       
   434     local view=$2
       
   435 
       
   436     local out=$ZONES/$view/$zone
       
   437     local in=$DATA/$zone.zone
       
   438     local serial=$SERIALS/$zone.serial
       
   439 
       
   440     if check_update $out $in $serial; then
       
   441         log_info "Generating $out..."
       
   442 
       
   443         do_update $out \
       
   444             $EXPAND_ZONE $ROOT/$DATA/$zone.zone   \
       
   445                 --serial $ROOT/$SERIALS/$zone.serial  \
       
   446                 --expand zones=$(abspath $ZONES)    \
   483                 --expand zones=$(abspath $ZONES)    \
   447                 --expand view=$view
   484                 --expand view=$view
   448     else
   485     else
   449         log_info "Generating $out: not changed"
   486         log_info "Generating $out <- $src: not changed" 
   450     fi
   487     fi
   451 }
   488 }
   452 
   489 
   453 function link_zone_view {
   490 function link_zone {
   454     local zone=$1
   491     local view=$1
   455     local view=$2
   492     local zone=$2
   456     local base=$3
   493     local base=${3:-$zone}
   457     
   494 
   458     local lnk=$ZONES/$view/$zone
   495     local out=$ZONES/$view/$zone
   459     local tgt=
   496     
   460 
   497     for tgt in $ZONES/$view/$base $ZONES/common/$base; do
   461     # find tgt
   498         [ $tgt != $out ] && [ -e $tgt ] && break
   462     for path in "$ZONES/$view/$base" "$ZONES/$base"; do
       
   463         if [ -e "$ROOT/$path" ]; then
       
   464             log_debug "$view/$zone: base $base from $path"
       
   465             tgt="$path"
       
   466 
       
   467             break
       
   468         fi
       
   469     done
   499     done
   470 
   500 
   471     if [ ! $tgt ]; then
   501     log_debug "$out: from "
   472         die "$view/$zone: base $base not found!"
   502 
   473     fi
   503     if check_link $out $tgt; then
   474    
   504         log_info "Linking $out -> $tgt..."
   475     # link
   505 
   476     if [ -e $ROOT/$lnk ] && [ $(readlink $ROOT/$lnk) == $ROOT/$tgt ]; then
   506         do_link $out $tgt
   477         log_info "Linking $lnk -> $tgt: not changed"
   507     else
   478 
   508         log_info "Linking $out -> $tgt: not changed"
   479     else
   509     fi
   480         log_info "Linking $lnk -> $tgt..."
   510 }
   481 
   511 
   482         cmd ln -sf $ROOT/$tgt $ROOT/$lnk
   512 ## Tests
   483     fi
       
   484 }
       
   485 
       
   486 function update_hosts {
       
   487     local dst=$1; shift
       
   488     local src=$1; shift
       
   489 
       
   490 
       
   491     if check_update $dst $src; then
       
   492         log_info "Generating $dst..."
       
   493 
       
   494         do_update $dst $PROCESS_ZONE $PROCESS_ARGS $ROOT/$src "$@"
       
   495     else
       
   496         log_info "Generating $dst: not changed"
       
   497     fi
       
   498 }
       
   499 
       
   500 # feed `hg annotate -qd`'d version of input to process-zone --input-line-date
       
   501 # only applies commit'd data
       
   502 function update_hosts_meta {
       
   503     local dst=$1; shift
       
   504     local src=$1; shift
       
   505 
       
   506     if check_update $dst $src; then
       
   507         log_info "Generating $dst..."
       
   508         
       
   509         # via stdin
       
   510         $hg $DATA annotate -qd $ROOT/$src | \
       
   511             do_update $dst $PROCESS_ZONE $PROCESS_ARGS --input-line-date --meta-zone "$@"
       
   512     else
       
   513         log_info "Generating $dst: not changed"
       
   514     fi
       
   515 }
       
   516 
       
   517 function check_hosts {
   513 function check_hosts {
   518     local hosts=$1; shift 1
   514     local hosts=$1; shift 1
   519 
   515 
   520     local cmd=($PROCESS_ZONE $PROCESS_ARGS $ROOT/$hosts --check-hosts "$@")
   516     local cmd=($PROCESS_ZONE $PROCESS_ARGS $ROOT/$hosts --check-hosts "$@")
   521 
   517 
   529         exit 1
   525         exit 1
   530     fi
   526     fi
   531 }
   527 }
   532 
   528 
   533 function check_zone {
   529 function check_zone {
   534     local name=$1
   530     local view=$1
   535     local file=$2
   531     local zone=$2
   536 
   532     local origin=$3
   537     local cmd=($NAMED_CHECKZONE $name $ROOT/$file)
   533 
       
   534     local src=$ZONES/$view/$zone
       
   535 
       
   536     local cmd=($NAMED_CHECKZONE $origin $ROOT/$src)
   538 
   537 
   539     # test
   538     # test
   540     # XXX: checkzone is very specific about the order of arguments, -q must be first
   539     # XXX: checkzone is very specific about the order of arguments, -q must be first
   541     if $NAMED_CHECKZONE -q $name $ROOT/$file; then
   540     if $NAMED_CHECKZONE -q $origin $ROOT/$src; then
   542         log_info "Check $file($name): OK"
   541         log_info "Check $src ($origin): OK"
   543     else
   542     else
   544         log_error "  Check $file($name): Failed:"
   543         log_error "  Check $src ($origin): Failed:"
   545 
   544 
   546         indent "    " "${cmd[@]}"
   545         indent "    " "${cmd[@]}"
   547         
   546         
   548         exit 1
   547         exit 1
   549     fi
   548     fi
   550 }
   549 }
   551 
   550 
       
   551 ## Deploy
   552 # deploy new zone data to bind
   552 # deploy new zone data to bind
   553 function deploy_zones {
   553 function deploy_zones {
   554     indent "        rndc: " $RNDC reload
   554     indent "        rndc: " $RNDC reload
   555 }
   555 }
   556 
   556 
   580 
   580 
   581 function main {
   581 function main {
   582     # test tty
   582     # test tty
   583     [ -t 1 ] && IS_TTY=y
   583     [ -t 1 ] && IS_TTY=y
   584     
   584     
   585     local views=(internal external)
       
   586 
       
   587     parse_args "$@"
   585     parse_args "$@"
   588 
   586 
   589     ## test env
   587     ## test env
   590     [ -d $ROOT/$DATA ] || die "Missing data: $ROOT/$DATA"
   588     [ -d $ROOT/$DATA ] || die "Missing data: $ROOT/$DATA"
   591     ensure_dir  $ZONES
   589     ensure_dir  $ZONES
   592     
   590     
   593     # views
   591     # output dirs
   594     for view in "${views[@]}" "common" "hosts"; do
   592     local views=(internal external)
       
   593 
       
   594     for view in "${views[@]}" "common" "hosts" "includes"; do
   595         ensure_dir $ZONES/$view
   595         ensure_dir $ZONES/$view
   596     done
   596     done
   597 
   597 
   598     ## hosts
   598     ## hosts
   599     # test
   599     # test
   600     log "Testing hosts..."
   600     log "Testing hosts..."
   601         check_hosts     $DATA/paivola.txt --check-exempt ufc
   601         check_hosts     $DATA/paivola.txt --check-exempt ufc
   602 
   602 
   603     # update
   603     # update
   604     log "Generating host zones..."
   604     log "Generating host zones..."
   605         update_hosts    $ZONES/hosts/paivola.internal       $DATA/paivola.txt --forward-zone --forward-txt --forward-mx $FORWARD_MX
   605         #                   zone                            base                *args
   606         update_hosts    $ZONES/hosts/paivola.external       $DATA/paivola.txt --forward-zone
   606         update_hosts        $ZONES/hosts/paivola:internal   $DATA/paivola.txt   --forward-zone --forward-txt --forward-mx $FORWARD_MX
   607         update_hosts    $ZONES/hosts/194.197.235            $DATA/paivola.txt --reverse-zone $REVERSE_ZONE --reverse-domain $REVERSE_DOMAIN
   607         update_hosts        $ZONES/hosts/paivola:external   $DATA/paivola.txt   --forward-zone
       
   608         update_hosts        $ZONES/hosts/194.197.235        $DATA/paivola.txt   --reverse-zone $REVERSE_ZONE --reverse-domain $REVERSE_DOMAIN
   608 
   609 
   609         
   610         
   610         # XXX: foward
   611         update_hosts        $ZONES/hosts/10                 $DATA/pvl.txt       --reverse-zone 10 --reverse-domain pvl -q
   611         update_hosts    $ZONES/hosts/pvl                    $DATA/pvl.txt      --forward-zone
   612         update_hosts        $ZONES/hosts/192.168            $DATA/pvl.txt       --reverse-zone 192.168 --reverse-domain pvl -q
   612         update_hosts    $ZONES/hosts/10                     $DATA/pvl.txt      --reverse-zone 10 --reverse-domain pvl -q
   613 
   613         update_hosts    $ZONES/hosts/192.168                $DATA/pvl.txt      --reverse-zone 192.168 --reverse-domain pvl -q
   614         # XXX: unsupported --forward-zone with pvl.txt
   614 
   615         # update_hosts    $ZONES/hosts/pvl                    $DATA/pvl.txt      --forward-zone
       
   616         copy_hosts          $ZONES/hosts/pvl                $DATA/pvl.txt
   615 
   617 
   616     ## zones
   618     ## zones
   617     # parts
   619     # parts
   618     log "Copying zone parts..."
   620     log "Copying zone includes..."
   619         update_zone_part    paivola         auto
   621         #                   view            zone                    base
   620         update_zone_part    paivola         services
   622         copy_zone           includes        paivola:internal        paivola.zone.internal
   621         update_zone_part    paivola         internal
   623         copy_zone           includes        paivola:external        paivola.zone.external
   622         update_zone_part    paivola         external
   624         copy_zone           includes        paivola.auto            paivola.zone.auto
       
   625         copy_zone           includes        paivola.services        paivola.zone.services
   623 
   626 
   624     # serials
   627     # serials
   625     if [ $SERIAL_NOUPDATE ]; then
   628     if [ $SERIAL_NOUPDATE ]; then
   626         log "Updating serials: skipped"
   629         log "Updating serials: skipped"
   627 
   630 
   628     else
   631     else
   629         log "Updating serials..."
   632         log "Updating serials..."
   630 
   633 
   631         update_zone_serial  pvl
   634         #                   zone            base
   632         link_zone_serial    10          pvl
   635         update_serial       pvl
   633         link_zone_serial    192.168     pvl
   636         link_serial         10              pvl
   634 
   637         link_serial         192.168         pvl
   635         update_zone_serial  paivola
   638 
   636         update_zone_serial  194.197.235
   639         update_serial       paivola
   637     fi
   640         update_serial       194.197.235
   638 
   641     fi
   639     # headers
   642 
   640     log "Updating zones headers..."
   643     # zones
   641         update_zone_view    pvl                 internal
   644     log "Updating zones..."
   642         update_zone_view    paivola             internal
   645         #                   view        zone            base
   643         update_zone_view    paivola             external
   646         update_zone         internal    pvl
   644 
   647         update_zone         internal    paivola
   645         update_zone_view    10                  internal
   648         update_zone         external    paivola
   646         update_zone_view    192.168             internal
   649 
   647 
   650         update_zone         internal    10
   648         update_zone_view    194.197.235         common
   651         update_zone         internal    192.168
       
   652 
       
   653         update_zone         common      194.197.235
       
   654         link_zone           internal    194.197.235
       
   655         link_zone           external    194.197.235
   649 
   656 
   650     # test
   657     # test
   651     log "Testing zones..."
   658     log "Testing zones..."
   652         check_zone          paivola.fi                  $ZONES/external/paivola
   659         #                   view        zone            origin
   653         check_zone          paivola.fi                  $ZONES/internal/paivola
   660         check_zone          internal    paivola         paivola.fi
   654 
   661         check_zone          external    paivola         paivola.fi
   655         check_zone          10.in-addr.arpa             $ZONES/internal/10
   662 
   656         check_zone          192.168.in-addr.arpa        $ZONES/internal/192.168
   663         check_zone          internal    10              10.in-addr.arpa
   657         check_zone          235.197.194.in-addr.arpa    $ZONES/common/194.197.235
   664         check_zone          internal    192.168         192.168.in-addr.arpa
       
   665         check_zone          common      194.197.235     235.197.194.in-addr.arpa
   658 
   666 
   659     # extra zones...
   667     # extra zones...
   660     local base_zone=paivola
   668     local base=paivola
   661     local link_zones=(paivola.fi paivola.net paivola.org paivola.info paivola.mobi xn--pivl-load8j.fi)
   669     local link_zones=(paivola.fi paivola.net paivola.org paivola.info paivola.mobi xn--pivl-load8j.fi)
   662 
   670 
   663     log "Linking extra zones..."
   671     log "Linking zones..."
   664     for view in "${views[@]}"; do
   672     for view in "${views[@]}"; do
   665         for zone in "${link_zones[@]}"; do
   673         for zone in "${link_zones[@]}"; do
   666             link_zone_view  $zone   $view   $base_zone
   674             link_zone       $view       $zone           $base
   667             check_zone      $zone   $ZONES/$view/$zone
   675             check_zone      $view       $zone           $zone
   668         done
   676         done
   669 
       
   670         # reverse
       
   671         link_zone_view      194.197.235     $view   common/194.197.235
       
   672     done
   677     done
   673 
   678 
   674     ## deploy
   679     ## deploy
   675     if [ $DEPLOY_SKIP ]; then
   680     if [ $DEPLOY_SKIP ]; then
   676         log "Deploy zones: skipped"
   681         log "Deploy zones: skipped"