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 |
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" |