bin/update
changeset 8 dab145ee3f81
parent 7 f4457348faa0
child 9 beb4bef2498a
equal deleted inserted replaced
7:f4457348faa0 8:dab145ee3f81
    20 REVERSE_ZONE=194.197.235
    20 REVERSE_ZONE=194.197.235
    21 REVERSE_DOMAIN=paivola.fi
    21 REVERSE_DOMAIN=paivola.fi
    22 
    22 
    23 ## options
    23 ## options
    24 IS_TTY=
    24 IS_TTY=
       
    25 
       
    26 LOG=y
       
    27 LOG_INFO=
       
    28 LOG_DEBUG=
       
    29 LOG_CMD=
       
    30 
    25 UPDATE_FORCE=
    31 UPDATE_FORCE=
       
    32 UPDATE_NOOP=
       
    33 UPDATE_DIFF=
    26 SERIAL_NOUPDATE=
    34 SERIAL_NOUPDATE=
    27 
    35 
    28 function help_args {
    36 function help_args {
    29     local prog=$1
    37     local prog=$1
    30 
    38 
    31     cat <<END
    39     cat <<END
    32 Usage: $prog [options]
    40 Usage: $prog [options]
    33 
    41 
    34     -h      display this help text
    42     -h      display this help text
       
    43 
       
    44     -q      quiet
       
    45     -v      verbose
       
    46     -D      debug
       
    47     
       
    48     -d      show changes
       
    49 
    35     -F      force-updates without checking src mtime
    50     -F      force-updates without checking src mtime
       
    51     -n      no-op/mock-update; do not actually change anything; implies -S
    36     -S      do not update serial
    52     -S      do not update serial
    37 END
    53 END
    38 }
    54 }
    39 
    55 
    40 function parse_args {
    56 function parse_args {
    41     OPTIND=1
    57     OPTIND=1
    42 
    58 
    43     while getopts 'hFS' opt "$@"; do
    59     while getopts 'hqvDdFnS' opt "$@"; do
    44         case $opt in
    60         case $opt in
    45             h)  
    61             h)  
    46                 help_args $1
    62                 help_args $1
    47                 exit 0
    63                 exit 0
    48             ;;
    64             ;;
    49 
    65 
       
    66             q)  LOG= ;;
       
    67             v)  LOG_INFO=y ;;
       
    68             D)  
       
    69                 LOG_DEBUG=y 
       
    70                 LOG_CMD=y
       
    71                 
       
    72                 ;;
       
    73 
       
    74             d)  UPDATE_DIFF=y ;;
    50             F)  UPDATE_FORCE=y ;;
    75             F)  UPDATE_FORCE=y ;;
    51             S)  SERIAL_NOUPDATE=y ;;
    76             S)  SERIAL_NOUPDATE=y ;;
    52             
    77  
       
    78             n)  
       
    79                 # implies -S
       
    80                 UPDATE_NOOP=y 
       
    81                 SERIAL_NOUPDATE=y
       
    82                 ;;
       
    83 
       
    84            
    53             ?)  
    85             ?)  
    54                 die 
    86                 die 
    55             ;;
    87             ;;
    56         esac
    88         esac
    57 
    89 
    76 function log_error {
   108 function log_error {
    77     log_color 31 "$*"
   109     log_color 31 "$*"
    78 }
   110 }
    79 
   111 
    80 function log {
   112 function log {
    81     log_msg "$*"
   113     [ $LOG ] && log_msg "$*" || true
    82 }
   114 }
    83 
   115 
    84 function log_info {
   116 function log_info {
    85     log_color 36 "  $*"
   117     [ $LOG_INFO ] && log_color 36 "  $*" || true
    86 }
   118 }
    87 
   119 
    88 function log_debug {
   120 function log_debug {
    89     log_color 32 "    $*"
   121     [ $LOG_DEBUG ] && log_color 32 "    $*" || true
    90 }
   122 }
    91 
   123 
    92 function log_cmd {
   124 function log_cmd {
    93     log_color 35 "       \$ $*"
   125     [ $LOG_CMD ] && log_color 35 "        \$ $*" || true
       
   126 }
       
   127 
       
   128 # XXX: broken
       
   129 function log_stack {
       
   130     local level=1
       
   131 
       
   132     while info=$(caller $level); do
       
   133         echo $info | read line sub file
       
   134 
       
   135         log_msg "$file:$lineno $sub()"
       
   136 
       
   137         level=$(($level + 1))
       
   138     done
       
   139 }
       
   140 
       
   141 function fail {
       
   142     func=$(caller 1 | cut -d ' ' -f 2)
       
   143     
       
   144     log_error "$func: $*"
       
   145 
       
   146     exit 2
    94 }
   147 }
    95 
   148 
    96 function die {
   149 function die {
    97     log_error "$*"
   150     log_error "$*"
    98     exit 1
   151     exit 1
   111 
   164 
   112     cmd "$@"
   165     cmd "$@"
   113 }
   166 }
   114 
   167 
   115 function indent () {
   168 function indent () {
       
   169     local indent=$1; shift
       
   170 
   116     "$@" | (
   171     "$@" | (
   117         while read line; do
   172         while read line; do
   118             echo "    $line"
   173             echo "$indent$line"
   119         done
   174         done
   120     ) || exit $?
   175     ) || exit $?
   121 }
   176 }
   122 
   177 
   123 ## test
   178 ## test
   124 [ -d $SETTINGS ] || die "Missing settings: $SETTINGS"
   179 [ -d $SETTINGS ] || die "Missing settings: $SETTINGS"
   125 [ -d $SERIALS ] || die "Missing serials: $SERIALS"
   180 [ -d $SERIALS ] || die "Missing serials: $SERIALS"
   126 [ -d $ZONES ] || die "Missing zones: $ZONES"
   181 [ -d $ZONES ] || die "Missing zones: $ZONES"
   127 
   182 
   128 ## functions
   183 ## functions
       
   184 function check_update {
       
   185     # target
       
   186     local dst=$1; shift
       
   187 
       
   188     log_debug "$dst:"
       
   189 
       
   190     # need update?
       
   191     local update=
       
   192 
       
   193     if [ ! -e $dst ] || [ $UPDATE_FORCE ]; then
       
   194         log_debug "  update forced"
       
   195         update=y
       
   196     fi
       
   197 
       
   198     # check deps
       
   199     for dep in "$@"; do
       
   200         # don't bother checking if already figured out
       
   201         [ $update ] && continue
       
   202 
       
   203         # check
       
   204 
       
   205         if [ $dst -ot $dep ]; then
       
   206             log_debug "  changed: $dep"
       
   207             update=y
       
   208         fi
       
   209     done
       
   210 
       
   211     [ ! $update ] && log_debug "  up-to-date"
       
   212 
       
   213     # return
       
   214     [ $update ]
       
   215 }
       
   216 
       
   217 function do_update {
       
   218     local dst=$1; shift
       
   219     local tmp=$dst.new
       
   220 
       
   221     log_debug "  update: $dst"
       
   222     cmd "$@" > $tmp
       
   223 
       
   224     # compare
       
   225     if [ -e $dst ] && [ $UPDATE_DIFF ]; then
       
   226         log_debug "  changes:"
       
   227 
       
   228         # terse
       
   229         indent "        " diff --unified=1 $dst $tmp
       
   230     fi
       
   231     
       
   232     if [ $UPDATE_NOOP ]; then
       
   233         # cleanup
       
   234         log_debug "  no-op:"
       
   235 
       
   236         cmd rm $tmp
       
   237     else
       
   238         # commit
       
   239         log_debug "  done:"
       
   240 
       
   241         cmd mv $tmp $dst
       
   242     fi
       
   243 }
       
   244 
   129 function update {
   245 function update {
   130     local dst=$1
   246     local dst=$1; shift;
   131     local src=$2
   247 
   132     local tmp=$dst.new
   248     local sep=
   133 
   249     local dep=()
   134     shift 2
   250     local cmd=()
   135 
   251 
   136     if [ -z $src ] || [ $UPDATE_FORCE ] || [ $dst -ot $src ]; then
   252     for arg in "$@"; do
   137         log_debug "update: $dst <- $src"
   253         if [ $arg == '--' ]; then
   138         cmd "$@" $src > $tmp
   254             sep=y
   139 
       
   140         # compare
       
   141         if [ -e $dst ]; then
       
   142             # terse
       
   143             indent diff --unified=1 $dst $tmp
       
   144         fi
   255         fi
   145         
   256 
   146         # overwrite
   257         if [ $sep ]; then
   147         mv $tmp $dst
   258             cmd=("${cmd[@]:-}" "$arg")
   148 
   259         else
   149     else
   260             dep=("${dep[@]:-}" "$arg")
   150         log_debug "$dst <- $src: up-to-date"
   261         fi
   151     fi
   262     done
       
   263 
       
   264     [ ! $sep ] && fail "Invalid args given: $@"
       
   265 
       
   266     check_update $dst "${dep[@]}" && do_update $dst "${cmd[@]}" || true
   152 }
   267 }
   153 
   268 
   154 ## bin wrappers
   269 ## bin wrappers
   155 function update_serial {
   270 function update_serial {
   156     cmd $UPDATE_SERIAL $*
   271     local serial=$1; shift
       
   272     local old=$(cat $serial)
       
   273 
       
   274     log_info "Updating serial: $serial"
       
   275 
       
   276     cmd $UPDATE_SERIAL $* $serial
       
   277     
       
   278     local new=$(cat $serial)
       
   279         
       
   280     log_debug "  $old -> $new"
   157 }
   281 }
   158 
   282 
   159 function expand_zone {
   283 function expand_zone {
   160     local output=$1; shift
   284     local output=$1; shift
   161     local src=$1; shift
   285     local src=$1; shift
   162 
   286 
   163 
       
   164     update $output $src $EXPAND_ZONE "$@"
       
   165 }
   287 }
   166 
   288 
   167 function process_zone {
   289 function process_zone {
   168     local output=$1; shift
   290     local output=$1; shift
   169     local src=$1; shift
   291     local src=$1; shift
   170 
   292 
   171     update $output $src $PROCESS_ZONE $PROCESS_ARGS "$@"
   293     check_update $output $src && update $output $PROCESS_ZONE $PROCESS_ARGS "$@" $src
   172 }
   294 }
   173 
   295 
   174 ## actions
   296 ## actions
   175 function copy_zone_part {
   297 function copy_zone_part {
   176     local zone=$1
   298     local zone=$1
   177     local part=$2
   299     local part=$2
   178 
   300 
   179     local name=$zone.zone.$part
   301     local name=$zone.zone.$part
   180 
   302     local src=$SETTINGS/$name
   181     log_info "Copying zone $zone/$part: zones/$name"
   303     local dst=$ZONES/$name
   182 
   304 
   183     update $ZONES/$name $SETTINGS/$name cat
   305 
       
   306     if check_update $dst $src; then
       
   307         log_info "Copying zone $zone.$part..."
       
   308 
       
   309         do_update $output cat $src
       
   310     else
       
   311         log_info "Copying zone $zone.$part: not changed"
       
   312     fi
   184 }
   313 }
   185 
   314 
   186 function update_zone {
   315 function update_zone {
   187     local zone=$1
   316     local zone=$1
       
   317 
   188     local name=$zone.zone
   318     local name=$zone.zone
   189 
   319 
   190     log_info "Generating $zone zone headers: zones/$name" 
   320     local out=$ZONES/$name
   191 
   321     local in=$SETTINGS/$zone.zone
   192     expand_zone     $ZONES/$name    $SETTINGS/$zone.zone   \
   322     local serial=$SERIALS/$zone.serial
   193         --serial $SERIALS/$zone.serial  \
   323 
   194         --expand zones=$ROOT/$ZONES
   324     if check_update $out $in $serial; then
       
   325         log_info "Generating $zone zone headers..." 
       
   326 
       
   327         do_update $out \
       
   328             $EXPAND_ZONE $SETTINGS/$zone.zone   \
       
   329                 --serial $SERIALS/$zone.serial  \
       
   330                 --expand zones=$ROOT/$ZONES
       
   331     else
       
   332         log_info "Generating $zone zone headers: not changed" 
       
   333     fi
   195 }
   334 }
   196 
   335 
   197 function update_zone_view {
   336 function update_zone_view {
   198     local zone=$1
   337     local zone=$1
   199     local view=$2
   338     local view=$2
   200 
   339 
   201     local name=$view/$zone.zone
   340     local name=$view/$zone.zone
   202 
   341 
   203     log_info "Generating $zone:$view zone headers: zones/$name"
   342     local out=$ZONES/$name
   204 
   343     local in=$SETTINGS/$zone.zone
   205     expand_zone     $ZONES/$name    $SETTINGS/$zone.zone   \
   344     local serial=$SERIALS/$zone.serial
   206         --serial $SERIALS/$zone.serial  \
   345 
   207         --expand zones=$ROOT/$ZONES     \
   346     if check_update $out $in $serial; then
   208         --expand view=$view
   347         log_info "Generating $zone:$view zone headers..."
       
   348 
       
   349         do_update $out \
       
   350             $EXPAND_ZONE $SETTINGS/$zone.zone   \
       
   351                 --serial $SERIALS/$zone.serial  \
       
   352                 --expand zones=$ROOT/$ZONES     \
       
   353                 --expand view=$view
       
   354     else
       
   355         log_info "Generating $zone:$view zone headers: not changed"
       
   356     fi
       
   357 }
       
   358 
       
   359 function update_hosts {
       
   360     local dst=$1; shift
       
   361     local src=$1; shift
       
   362 
       
   363 
       
   364     if check_update $dst $src; then
       
   365         log_info "Generating $dst..."
       
   366 
       
   367         do_update $dst $PROCESS_ZONE $PROCESS_ARGS $src "$@"
       
   368     else
       
   369         log_info "Generating $dst: not changed"
       
   370     fi
   209 }
   371 }
   210 
   372 
   211 function main {
   373 function main {
   212     # test tty
   374     # test tty
   213     [ -t 1 ] && IS_TTY=y
   375     [ -t 1 ] && IS_TTY=y
   214 
   376 
   215     parse_args "$@"
   377     parse_args "$@"
   216 
   378 
       
   379     log "Updating serials..."
       
   380 
   217     if [ $SERIAL_NOUPDATE ]; then
   381     if [ $SERIAL_NOUPDATE ]; then
   218         log_debug "skipping serial-update"
   382         log_debug "skipping"
   219     else
   383     else
   220         log "Updating serials..."
   384         update_serial   $SERIALS/paivola.serial
   221             update_serial   $SERIALS/paivola.serial
   385         update_serial   $SERIALS/paivola-reverse.serial
   222             update_serial   $SERIALS/paivola-reverse.serial
       
   223     fi
   386     fi
   224 
   387 
   225     log "Generating host zones..."
   388     log "Generating host zones..."
   226         process_zone    $ZONES/external/paivola.zone.hosts  $SETTINGS/paivola.txt --forward-zone
   389         update_hosts    $ZONES/external/paivola.zone.hosts  $SETTINGS/paivola.txt --forward-zone
   227         process_zone    $ZONES/internal/paivola.zone.hosts  $SETTINGS/paivola.txt --forward-zone --forward-txt --forward-mx $FORWARD_MX
   390         update_hosts    $ZONES/internal/paivola.zone.hosts  $SETTINGS/paivola.txt --forward-zone --forward-txt --forward-mx $FORWARD_MX
   228         process_zone    $ZONES/paivola-reverse.zone.hosts   $SETTINGS/paivola.txt --reverse-zone $REVERSE_ZONE --reverse-domain $REVERSE_DOMAIN
   391         update_hosts    $ZONES/paivola-reverse.zone.hosts   $SETTINGS/paivola.txt --reverse-zone $REVERSE_ZONE --reverse-domain $REVERSE_DOMAIN
   229 
   392 
   230     log "Copying zone parts..."
   393     log "Copying zone parts..."
   231         copy_zone_part      paivola             auto
   394         copy_zone_part      paivola             auto
   232         copy_zone_part      paivola             services
   395         copy_zone_part      paivola             services
   233         copy_zone_part      paivola             internal
   396         copy_zone_part      paivola             internal
   234         copy_zone_part      paivola             external
   397         copy_zone_part      paivola             external
   235 
   398 
   236     log "Updating zones..."
   399     log "Updating zones headers..."
   237         update_zone         paivola-reverse
   400         update_zone         paivola-reverse
   238         update_zone_view    paivola             internal
   401         update_zone_view    paivola             internal
   239         update_zone_view    paivola             external
   402         update_zone_view    paivola             external
   240 }
   403 }
   241 
   404