CHANGED = $(shell git diff --name-only --relative -- '*.zone' ) export GIT_AUTHOR_NAME = "Bind Makefile" #export GIT_AUTHOR_EMAIL = "$(shell whoami)@$(shell hostname -f)" #export GIT_COMMITTER_NAME = $(GIT_AUTHOR_NAME) #export GIT_COMMITTER_EMAIL = $(GIT_AUTHOR_EMAIL) all: rollover install: rollover rollover: autoserial diff check reload eof diff: @echo "Diff Zones... " @git diff -U0 -- $(CHANGED) \ | grep -a -v -E '^(diff |index |---|@@)' \ | sed -e 's/^[+]* .\/\([^ ]*\).*/=> \1/' autoserial: @for file in $(CHANGED); do \ perl -p -i -e 'if ($$p =~ /[\t\s]+IN[\t\s]+SOA[\t\s]+/) { $$stamp = sprintf("%4.4d%02.2d%02.2d", (localtime)[5]+1900, (localtime)[4]+1, (localtime)[3]); $$count = (/$$stamp([0-9]{2})/)? $$1 + 1: 1; s/[0-9]+/sprintf("%s%02.2d", $$stamp, $$count)/e; } $$p = $$_;' $$file; \ done check: @echo "Checking Configs... " @if ! named-checkconf /etc/bind/named.conf; then \ echo "FIX THE ERROR AND TRY AGAIN"; \ exit 1 ; \ fi @echo "Checking Zones... " @named-checkconf -j -p /etc/bind/named.conf \ | perl -e 'my $$zone = ""; while (<>) { if (/^\s+zone\s+\"(.*)\"/) { $$zone = $$1; } elsif (($$zone ne "") && /^\s+file\s+\"(.*?)\"/) { print "$$zone $$1\n"; $$zone = ""; } }' \ | sort \ | uniq \ | while read zone file; do \ echo "FOO: zone: $$zone file: $$file"; \ if [ -z "$$file" -o "$$zone" = "key" ] ; then \ continue ; \ fi ; \ if echo -n "$$zone" | grep -q -E '(sc-eur.com|db.root|named.dump|named.stats)'; then \ continue; \ fi; \ if ! named-checkzone -q -i "full" $$zone $$file; then \ named-checkzone -i "full" $$zone $$file; \ echo "FIX THE ERROR AND TRY AGAIN"; \ exit 1 ; \ fi; \ done #@echo "Checking CNAMEs and PTRs... " #@grep -l -E '.*(PTR|CNAME).*[^.]*[.][^.]*[^.]$$' *.* \ #| grep -v '\.sh$$' \ #| while read file; do \ # echo "$$file: DO NOT FORGET THE LAST DOT"; \ # grep -E '.*(PTR|CNAME).*[^.]*[.][^.]*[^.]$$' $$file; \ # exit 1 ; \ #done reload: @while [ "$$answer" = "" ]; do \ echo -n "Do you want to reload all zones ? [yes] "; \ read answer; \ case $$answer in \ [Yy]|[Yy][Ee][Ss]) \ answer="yes"; \ break; \ ;; \ [Nn]|[Nn][Oo]) \ answer="no"; \ break; \ ;; \ "") \ answer="yes"; \ break; \ ;; \ *) \ answer=""; \ ;; \ esac; \ done; \ if [ "$$answer" = "yes" ]; then \ etckeeper commit "Changed DNS Zones: $(CHANGED)" ; \ rndc reload; \ else \ echo "Server reload aborted"; \ exit 1 ; \ fi eof: @echo "DONE -- That's all folks!"