diff -r 773c91a7547a -r 647f6de0d0ac bin/update --- a/bin/update Mon Mar 19 12:18:52 2012 +0200 +++ b/bin/update Mon Mar 19 12:47:26 2012 +0200 @@ -5,22 +5,31 @@ ROOT=$(pwd) -BIN=bin +# resolve $0 +self=$0 +while [ -L $self ]; do + self=$(dirname $self)/$(readlink $self) +done + +# bin dir +BIN=$(dirname $self) PROCESS_ZONE=$BIN/process-zone EXPAND_ZONE=$BIN/expand-zone UPDATE_SERIAL=$BIN/update-serial +# data files DATA=settings ZONES=zones SERIALS=$DATA +# data args PROCESS_ARGS='--input-charset latin-1' FORWARD_MX=mail REVERSE_ZONE=194.197.235 REVERSE_DOMAIN=paivola.fi - +# external progs NAMED_CHECKZONE=/usr/sbin/named-checkzone HG=hg RNDC=/usr/sbin/rndc @@ -51,6 +60,7 @@ General: -h display this help text + -d DIR datadir Logging: -q quiet @@ -67,20 +77,22 @@ Commit -C do not commit changes -c commit changes - -m commit message + -m MSG commit message END } function parse_args { OPTIND=1 - while getopts 'hqvDVpFSnCcm:' opt "$@"; do + while getopts 'hd:qvDVpFSnCcm:' opt "$@"; do case $opt in h) help_args $0 exit 0 ;; + d) ROOT="$OPTARG" ;; + q) LOG= ;; v) LOG_INFO=y ;; D) @@ -201,10 +213,47 @@ echo "$ROOT/$1" } -## test -[ -d $DATA ] || die "Missing settings: $DATA" -[ -d $SERIALS ] || die "Missing serials: $SERIALS" -[ -d $ZONES ] || die "Missing zones: $ZONES" +## hg +function hg { + local repo=$r + + $HG -R $ROOT/$repo "$@" +} + +function hg_modified { + local repo=$1 + + hg $repo id | grep -q '+' +} + +function hg_user { + if [ ${SUDO_USER:-} ]; then + echo '-u' "$SUDO_USER" + + elif [ $HOME ] && [ -e $HOME/.hgrc ]; then + log_debug "using .hgrc user" + echo '' + + else + echo '-u' "$USER" + fi +} + +function hg_diff { + local repo=$1 + + hg $repo diff +} + +function hg_commit { + local repo=$1 + local msg=$2 + local user_opt=$(hg_user) + + log_debug "commit: $user_opt: $msg" + cmd hg $repo commit $user_opt -m "$msg" +} + ## functions function check_update { @@ -228,7 +277,7 @@ # check - if [ $dst -ot $dep ]; then + if [ $ROOT/$dst -ot $ROOT/$dep ]; then log_debug " changed: $dep" update=y fi @@ -245,26 +294,26 @@ local tmp=$dst.new log_debug "update: $dst" - cmd "$@" > $tmp + cmd "$@" > $ROOT/$tmp # compare - if [ -e $dst ] && [ $UPDATE_DIFF ]; then + if [ -e $ROOT/$dst ] && [ $UPDATE_DIFF ]; then log_debug " changes:" # terse - indent " " diff --unified=1 $dst $tmp + indent " " diff --unified=1 $ROOT/$dst $ROOT/$tmp fi if [ $UPDATE_NOOP ]; then # cleanup log_debug " no-op" - cmd rm $tmp + cmd rm $ROOT/$tmp else # commit log_debug " update" - cmd mv $tmp $dst + cmd mv $ROOT/$tmp $ROOT/$dst fi } @@ -297,13 +346,13 @@ local name=$1; shift local file=$SERIALS/$name.serial - local old=$(test -e $file && cat $file || echo '') + local old=$(test -e $ROOT/$file && cat $ROOT/$file || echo '') log_info "Updating $file..." - cmd $UPDATE_SERIAL $* $file + cmd $UPDATE_SERIAL $* $ROOT/$file - local new=$(cat $file) + local new=$(cat $ROOT/$file) log_debug " $old -> $new" } @@ -320,7 +369,7 @@ if check_update $dst $src; then log_info "Copying zones/$name..." - do_update $dst cat $src + do_update $dst cat $ROOT/$src else log_info "Copying zones/$name: not changed" fi @@ -339,8 +388,8 @@ log_info "Generating $out..." do_update $out \ - $EXPAND_ZONE $DATA/$zone.zone \ - --serial $SERIALS/$zone.serial \ + $EXPAND_ZONE $ROOT/$DATA/$zone.zone \ + --serial $ROOT/$SERIALS/$zone.serial \ --expand zones=$(abspath $ZONES) else log_info "Generating $out: not changed" @@ -361,8 +410,8 @@ log_info "Generating $out..." do_update $out \ - $EXPAND_ZONE $DATA/$zone.zone \ - --serial $SERIALS/$zone.serial \ + $EXPAND_ZONE $ROOT/$DATA/$zone.zone \ + --serial $ROOT/$SERIALS/$zone.serial \ --expand zones=$(abspath $ZONES) \ --expand view=$view else @@ -378,7 +427,7 @@ if check_update $dst $src; then log_info "Generating $dst..." - do_update $dst $PROCESS_ZONE $PROCESS_ARGS $src "$@" + do_update $dst $PROCESS_ZONE $PROCESS_ARGS $ROOT/$src "$@" else log_info "Generating $dst: not changed" fi @@ -394,7 +443,7 @@ log_info "Generating $dst..." # via stdin - $HG -R $DATA annotate -qd $src | \ + $hg $DATA annotate -qd $ROOT/$src | \ do_update $dst $PROCESS_ZONE $PROCESS_ARGS --input-line-date --meta-zone "$@" else log_info "Generating $dst: not changed" @@ -404,7 +453,7 @@ function check_hosts { local hosts=$1; shift 1 - local cmd=($PROCESS_ZONE $PROCESS_ARGS $hosts --check-hosts "$@") + local cmd=($PROCESS_ZONE $PROCESS_ARGS $ROOT/$hosts --check-hosts "$@") if "${cmd[@]}" -q; then log_info "Check $hosts: OK" @@ -421,11 +470,11 @@ local name=$1 local file=$2 - local cmd=($NAMED_CHECKZONE $name $file) + local cmd=($NAMED_CHECKZONE $name $ROOT/$file) # test # XXX: checkzone is very specific about the order of arguments, -q must be first - if $NAMED_CHECKZONE -q $name $file; then + if $NAMED_CHECKZONE -q $name $ROOT/$file; then log_info "Check $file($name): OK" else log_error " Check $file($name): Failed:" @@ -442,51 +491,17 @@ } # commit data changes -function hg_modified { - local repo=$1 - - $HG -R $repo id | grep -q '+' -} - -function hg_user { - if [ ${SUDO_USER:-} ]; then - echo '-u' "$SUDO_USER" - - elif [ $HOME ] && [ -e $HOME/.hgrc ]; then - log_debug "using .hgrc user" - echo '' - - else - echo '-u' "$USER" - fi -} - -function hg_diff { - local repo=$1 +function commit_data { + local repo=$DATA - $HG -R $repo diff -} + if hg_modified $repo; then + log_info "Commit changes in $repo:" -function hg_commit { - local repo=$1 - local msg=$2 - local user_opt=$(hg_user) - - log_debug "commit: $user_opt: $msg" - cmd $HG -R $repo commit $user_opt -m "$msg" -} + indent " " hg_diff $repo -function commit_data { - local data=$DATA - - if hg_modified $data; then - log_info "Commit changes in $data:" - - indent " " hg_diff $data - - hg_commit $data "$COMMIT_MSG" + hg_commit $repo "$COMMIT_MSG" else - log_info "Commit changes in $data: no changes" + log_info "Commit changes in $repo: no changes" fi } @@ -496,6 +511,11 @@ parse_args "$@" + ## test env + [ -d $ROOT/$DATA ] || die "Missing data: $ROOT/$DATA" + [ -d $ROOT/$SERIALS ] || die "Missing serials: $ROOT/$SERIALS" + [ -d $ROOT/$ZONES ] || die "Missing zones: $ROOT/$ZONES" + ## hosts # test log "Testing hosts..."