]> mj.ucw.cz Git - nsc-5.git/blobdiff - m4/nsc.m4
First step to version 3.0. Changes too extensive to comment them.
[nsc-5.git] / m4 / nsc.m4
index f6828327ac80c43b0f6f5c0a5cf422264de1d48c..ad6fa7697806100823034475b86e753eebd357cb 100644 (file)
--- a/m4/nsc.m4
+++ b/m4/nsc.m4
 dnl ###
-dnl ### NSC 2.3 -- Zone File Generator
-dnl ### (c) 1997--2000 Martin Mares <mj@ucw.cz>
+dnl ### NSC -- Zone File Generator
+dnl ### (c) 1997--2003 Martin Mares <mj@ucw.cz>
 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, `divert; Primary file for the CURRENT_DOMAIN domain
+; Generated by NSCVER (nsc.m4) on CURRENT_DATE
+; Please do not edit manually
+
+$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')
 
-$TTL   minttl
-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', $@)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',,`
 localhost      A       127.0.0.1
-divert`'ifdef(`REVERSE',`
 ')')
-m4wrap(`cleanup')
-
-include(cf/config)
+m4wrap(`nsc_cleanup')