X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;ds=sidebyside;f=m4%2Fnsc.m4;h=32cb79319020480e01c31592cd991c6f5a7b3c6f;hb=2b2288dba593c3eab0c7c6bace1f34003c971858;hp=ca05641d667b0e43324d0c1c7fc25c2c9f68db18;hpb=becc65feda93e03b6bbe4d60c4b372b14b2f65e5;p=nsc-5.git diff --git a/m4/nsc.m4 b/m4/nsc.m4 index ca05641..32cb793 100644 --- a/m4/nsc.m4 +++ b/m4/nsc.m4 @@ -1,103 +1,148 @@ dnl ### -dnl ### NSC 2.0 -- Zone File Generator -dnl ### (c) 1997 Martin Mares +dnl ### NSC -- Zone File Generator +dnl ### (c) 1997--2003 Martin Mares dnl ### -dnl ### Usage: m4 nsc.m4 domain-source-files >zone-file -dnl ### Or: m4 nsc.m4 domain-source-files >rev-zone-file -DREVERSE=net-ip -DREVBASE=net-ip-to-SOA +dnl ### Usage: m4 nsc.m4 domain-source-files >zone-file -DVERS=path-to-version-file dnl ### +include(m4/dnslib.m4) -# Default values of zone parameters: +# Version number + +ifdef(`VERS',`',`nsc_fatal_error(`VERS macro not defined')') -define(refresh, hours(8)) -define(retry, hours(2)) -define(expire, days(7)) -define(minttl, days(1)) -define(nsname, translit(esyscmd(`hostname -f'),` +define(TODAY_CODE, translit(esyscmd(`date +"%Y%m%d"'),` ',`')) -define(maintname, `root'.`corr_dot(nsname)') +sinclude(VERS) +# Backward compatibility with NSC 2.x version files +ifdef(`last_today_code', `define(`LAST_TODAY_CODE',last_today_code)undefine(`last_today_code')') +ifdef(`subver_num', `define(`SUBVER_NUM',subver_num)undefine(`subver_num')') +ifelse(TODAY_CODE, LAST_TODAY_CODE, `', `define(`SUBVER_NUM',1)') +syscmd(echo >VERS "`define'(`LAST_TODAY_CODE',TODAY_CODE) `define'(`SUBVER_NUM',incr(SUBVER_NUM))") +ifelse(eval(SUBVER_NUM > 99),1,`nsc_fatal_error(`Too many zone changes in a single day, you must tweak 'VERS` manually')') +define(`VERSION',TODAY_CODE`'format(`%02d', SUBVER_NUM)) -# Domain name +# Record names -define(whole_domain, `ifdef(`REVERSE', `define(esrever,revaddr(REVBASE))esrever.in-addr.arpa', `Xdomain')')) -define(dotdomain, `ifelse(Xdomain,,,.Xdomain)') +define(nsc_set_name, `define(`CURRENT_NAME', nsc_corr_dot($1))define(`PRINT_NAME', CURRENT_NAME)') +define(nsc_emit_name, `ifdef(`PRINT_NAME', `PRINT_NAME`'undefine(`PRINT_NAME')', `')') +define(nsc_abs_name, `ifelse(CURRENT_NAME, translit(CURRENT_NAME,.,:), CURRENT_NAME.CURRENT_DOMAIN, CURRENT_NAME)') -# Generate reverse addressing if needed +# SOA record -define(stop_if_rev, `ifdef(`REVERSE', `divert(-1)')') -define(mk_PTR, `divert -revaddr(substr($1,incr(len(REVERSE)))) PTR $2`'ifelse(index($2,`.'),-1,`dotdomain.',`')') +define(nsc_SOA, ` +$ORIGIN CURRENT_DOMAIN +$TTL MINTTL +nsc_emit_name `SOA' nsc_corr_dot(NSNAME) MAINTNAME ( + VERSION REFRESH RETRY EXPIRE MINTTL )') +define(SOA, `ifdef(`CURRENT_DOMAIN',`ifdef(`REVERSE_MODE',,`nsc_fatal_error(`SOA record defined twice')')')dnl +define(`CURRENT_DOMAIN',$1.)dnl +nsc_set_name(CURRENT_DOMAIN)dnl +ifdef(`REVERSE_MODE',,`nsc_SOA')') + +# Reverse zones + +define(REVERSE, `divert(-1) + define(`REVERSE_MODE', `') + nsc_if_v6($1,` + define(`REVNET6', nsc_revblock6($1)) + ',` + define(`REVNET', `$1.') + define(`REVLOW', `$2') + define(`REVHIGH', `$3') + ') +') -define(mk_ptr, `ifelse(REVERSE, substr($1, 0, len(REVERSE)),`mk_PTR($1,$2)')') -define(emit_ptr, `ifdef(`REVERSE', `mk_ptr($1,$2)divert(-1)')') +define(nsc_mk_PTR, ` + divert`'$1 `PTR' $2 +divert(-1) +') -# Version number +define(nsc_auto_PTR4, `dnl +ifdef(`REVNET', ` + ifelse(REVNET, substr($1, 0, len(REVNET)), ` + define(`REVX', substr($1, len(REVNET))) + ifelse(REVLOW, `', + `nsc_mk_PTR(nsc_revaddr(REVX), $2)', + ` + ifelse(eval((REVX >= REVLOW) && (REVX <= REVHIGH)), 1, `nsc_mk_PTR(REVX, $2)') + ') + ') + ')dnl +') -define(ver_file, ifdef(`VERS',`VERS',`.nsc_version')) -define(today_code, translit(esyscmd(`date +"%Y%m%d"'),` -',`')) -sinclude(ver_file) -ifelse(today_code, last_today_code, `', `define(`subver_num',1)') -syscmd(echo >ver_file "`define'(`last_today_code',today_code) `define'(`subver_num', incr(subver_num))") -define(Subver_num, format(`%02d', subver_num)) -define(version,`today_code`'Subver_num') +define(nsc_auto_PTR6, `dnl +ifdef(`REVNET6', ` + define(`REVA', nsc_revaddr6($1)) + ifelse(REVNET6, substr(REVA, eval(63-len(REVNET6))), ` + nsc_mk_PTR(substr(REVA, 0, eval(62-len(REVNET6))), $2) + ') + ')dnl +') -# Host / Subdomain name +# A records -define(emit_name, `ifdef(`keep_addr', `keep_addr`'undefine(`keep_addr')', `$1')') +define(nsc_AONLY, `nsc_emit_name nsc_if_v6($1,`AAAA nsc_norm_v6($1)',``A' $1') +') +define(nsc_A, `nsc_if_v6($1,`nsc_auto_PTR6',`nsc_auto_PTR4')($1,nsc_abs_name)nsc_AONLY($1)') +define(ADDR, `nsc_iterate(`nsc_A', $@)dnl') +define(DADDR, `nsc_iterate(`nsc_AONLY', $@)dnl') -# SOA record +# Host specification -define(DO_SOA, `divert; Primary file for the whole_domain domain generated on curdate +define(H, `nsc_set_name($1)nsc_iterate(`nsc_A', shift($@))dnl') +define(DH, `nsc_set_name($1)nsc_iterate(`nsc_AONLY', shift($@))dnl') -corr_dot(whole_domain) `SOA' corr_dot(nsname) maintname ( - version refresh retry expire minttl )') -define(SOA, `ifdef(`Xdomain',`define(`Xdomain',$1)',`define(`Xdomain',$1)DO_SOA')') +# Subdomain specification and glue records + +define(D, `nsc_set_name($1)dnl') +define(GLUE, `DH($@)') # NS record -define(exNS, `emit_name `NS' corr_dot($1) +define(nsc_NS, `nsc_emit_name `NS' nsc_corr_dot($1) ') -define(NS, `iterate(`exNS', `$@')dnl') +define(NS, `nsc_iterate(`nsc_NS', $@)dnl') # MX record -define(exMX, `emit_name `MX' corr_dot($1) +define(nsc_MX, `nsc_emit_name `MX' nsc_corr_dot($1) ') -define(MX, `stop_if_rev`'iterate(`exMX', `$@')dnl') +define(MX, `nsc_iterate(`nsc_MX', $@)dnl') # HINFO record -define(HI, ` HINFO "$1" "$2"') +define(HI, `nsc_emit_name HINFO "$1" "$2"') -# Host records +# ALIASing records -define(exH, `emit_ptr($1, cname) A $1 +define(nsc_ALIAS, `$1 `CNAME' CURRENT_NAME ') -define(H, `define(`cname', $1)stop_if_rev`'$1`'iterate(`exH', `shift($@)')dnl') +define(ALIAS, `nsc_iterate(`nsc_ALIAS', $@)nsc_set_name(CURRENT_NAME)dnl') -# Reverse-only host records +# CNAME records -define(exRH, `emit_ptr($1, cname)') -define(RH, `define(`cname', $1)stop_if_rev`'iterate(`exRH', `shift($@)')dnl') +define(CNAME, `$1 `CNAME' nsc_corr_dot($2)') -# Domain records +# Explicit PTR records -define(D, `stop_if_rev`'define(`keep_addr', $1)define(`cname', $1)dnl') +define(PTR, `$1 `PTR' nsc_corr_dot($2)') -# Addressless entry (for example mail alias) +# Shortcut for classless reverse delegation of a block -define(HH, `define(`keep_addr', $1)define(`cname', $1)dnl') - -# ALIASing records - -define(exALIAS, `$1 CNAME cname +define(REVBLOCK, `nsc_forloop(`i', $2, $3, `i' `CNAME' `i'.$1 +)D($1) ') -define(ALIAS, `iterate(`exALIAS', `$@')dnl') # Cleanup actions -define(cleanup, ` +define(nsc_cleanup, `ifdef(`DISABLE_LOCALHOST',,` +; Added automatically (required by RFC 1912) localhost A 127.0.0.1 -divert`'ifdef(`REVERSE',` ')') -m4wrap(`cleanup') +m4wrap(`nsc_cleanup') + +divert(0)dnl +`;;;' Primary zone file +`;;;' Generated by NSCVER (nsc.m4) on CURRENT_DATE +`;;;' Please do not edit manually +`'