X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/zones/blobdiff_plain/0df6a57ca9beaf11bf4521aa5578bbce1f617ad5..69bbb181a3b0ca12644af37a61e350bf6a064a16:/Makefile diff --git a/Makefile b/Makefile index e2f30a7..d4b3669 100644 --- a/Makefile +++ b/Makefile @@ -1,44 +1,151 @@ -## Makefile for mdw's zones +### -*-makefile-*- +### +### Makefile for the DNS zones I maintain. +### +### (c) 2011 Mark Wooding -ZONE = zone +###-------------------------------------------------------------------------- +### Silent-rules machinery. -DISTORTED_ZONES = \ - distorted.org.uk.zone \ - 198.29.172.in-addr.arpa.zone \ - 199.29.172.in-addr.arpa.zone -HARLEQUIN_ZONES = \ - harlequin.org.uk.zone -ALL_ZONES = \ - $(DISTORTED_ZONES) \ - $(HARLEQUIN_ZONES) +V = 0 +v_tag = $(call v_tag_$V,$1) +v_tag_0 = @printf " %-6s %s\n" "$1" "$@"; -DOCS = distorted.tex -DOC_OUTPUTS = $(foreach suffix,dvi ps,\ - $(patsubst %.tex,%.$(suffix),$(DOCS))) +V_AT = $(V_AT_$V) +V_AT_0 = @ -all: $(ALL_ZONES) $(DOC_OUTPUTS) +###-------------------------------------------------------------------------- +### Programs and options. -publish:; mkdir publish +## Zone checking. +CHECKZONE = named-checkzone -i full \ + -k fail -M fail -n fail -S fail -W fail -install: all publish - for i in $(ALL_ZONES); do \ - cmp $$i publish/$$i >/dev/null 2>&1 && continue; \ - cp $$i publish/$$i.new && mv publish/$$i.new publish/$$i; \ - echo -n "$${i%.zone}: "; userv root named-reload $${i%.zone}; \ - done +## Zone installation. +MASTER = localhost +inside_MASTER = precision -$(DISTORTED_ZONES): distorted.org.uk.lisp hosts.lisp - $(ZONE) $< +ifeq ($(MASTER),localhost) +ZONEINST = userv zoneconf install +else +ZONEINST = ssh zoneconf@$(MASTER) +endif -$(HARLEQUIN_ZONES): harlequin.org.uk.lisp hosts.lisp - $(ZONE) $< +###-------------------------------------------------------------------------- +### Utility functions. -%.dvi: %.tex - latex $< - latex $< +dir-nosl = $(patsubst %/,%,$(dir $1)) -%.ps: %.dvi - dvips -o $@ $< +###-------------------------------------------------------------------------- +### Keeping all of the files straight. -clean: - rm -f $(ALL_ZONES) *.toc *.lof *.lot *.log *.dvi *.ps *.aux +## Establish a default target. We'll sort out what it does later. +all: +.PHONY: all + +## Things to clean. +CLEANFILES = +CLEANDIRS = +REALCLEANFILES = $(CLEANFILES) +REALCLEANDIRS = $(CLEANDIRS) + +## We work in terms of `zonesets'. Each one corresponds to a Lisp source +## file to be passed to `zone'. A zoneset has a number of different nets +## associated with it, in the variable zoneset_NETS, and we must run it +## through `zone' once for each net. The zoneset will make a number of +## zones, listed in zoneset_ZONES. +ZONESETS = + +###-------------------------------------------------------------------------- +### The distorted.org.uk zones. + +ZONESETS += distorted + +distorted_VIEWS = inside outside +distorted_outside_NETS = dmz jump +distorted_inside_NETS = any unsafe colo vpn + +distorted_all_ZONES += distorted.org.uk +distorted_all_ZONES += 199.29.172.in-addr.arpa + +###-------------------------------------------------------------------------- +### Other zones. + +## binswood.org.uk +ZONESETS += binswood +binswood_VIEWS = outside +binswood_all_ZONES += binswood.org.uk +binswood_all_ZONES += 27.165.10.in-addr.arpa + +## odin.gg +ZONESETS += odin +odin_VIEWS = outside +odin_all_ZONES = odin.gg + +###-------------------------------------------------------------------------- +### Zone construction machinery. + +ZONE = zone +V_ZONE = $(call v_tag,ZONE)$(ZONE) + +.SECONDEXPANSION: #sorry + +## For each net/zoneset pair, we make a stamp file net/zoneset.stamp to +## remember that we've made the corresponding zones. +ALL_ZONESTAMPS = $(foreach s,$(ZONESETS), \ + $(patsubst %,%/$s.zonestamp,$($s_VIEWS))) +$(ALL_ZONESTAMPS) : %.zonestamp : $$(notdir $$*).lisp hosts.lisp + $(V_AT)mkdir -p $(dir $*) + $(V_ZONE) -d$(dir $*) -fview/$(call dir-nosl,$*)$(hack \ + hack) $(addprefix -s, \ + $($(notdir $*)_$(call dir-nosl,$*)_NETS)) $< + $(V_AT)touch $@ +all: $(ALL_ZONESTAMPS) +CLEANFILES += $(sort $(foreach s,$(ZONESETS), \ + $(foreach v,$($s_VIEWS), \ + $v/*.zonestamp $v/*.zone))) +REALCLEANFILES += $(sort $(foreach s,$(ZONESETS), \ + $(foreach v,$($s_VIEWS), \ + $v/*.serial))) +REALCLEANDIRS += $(sort $(foreach s,$(ZONESETS),$($s_VIEWS))) + +## Now explain that each generated zone file depends on the corresponding +## zonestamp. This is where things start getting a little hairy. +$(foreach s,$(ZONESETS), \ + $(foreach v,$($s_VIEWS), \ + $(foreach z,$($s_all_ZONES) $($s_$v_ZONES), \ + $(eval $v/$z.zone: $v/$s.zonestamp)))) + +## Now we have to check the individual zone files. +ALL_ZONECHECKS = $(foreach s,$(ZONESETS), \ + $(foreach v,$($s_VIEWS), \ + $(foreach z,$($s_all_ZONES) $($s_$v_ZONES), \ + $v/$z.check))) +$(ALL_ZONECHECKS) : %.check : %.zone + $(call v_tag,CHECK)\ + { $(CHECKZONE) $(notdir $*) $^ || kill $$$$; } | \ + { grep -Ev 'loaded serial|OK' || :; } +check: $(ALL_ZONECHECKS) +.PHONY: check $(ALL_ZONECHECKS) + +## Finally we have to install the zone files. +ALL_INSTALLS = $(foreach s,$(ZONESETS), \ + $(foreach v,$($s_VIEWS), \ + $(foreach z,$($s_all_ZONES) $($s_$v_ZONES), \ + $v/$z.inst))) +$(ALL_INSTALLS) : %.inst : %.check + $(call v_tag,INST)$(ZONEINST) \ + $(call dir-nosl,$*) $(notdir $*) <$*.zone +install: $(ALL_INSTALLS) +.PHONY: install $(ALL_INSTALLS) + +## Files to clean. +clean: + rm -f $(CLEANFILES) + [ "$(CLEANDIRS)x" = x ] || rmdir $(CLEANDIRS) || : +realclean: + rm -f $(REALCLEANFILES) + [ "$(REALCLEANDIRS)x" = x ] || rmdir $(REALCLEANDIRS) || : +.PHONY: clean realclean + +###----- That's all, folks --------------------------------------------------