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 |