]> mj.ucw.cz Git - nsc-5.git/blob - m4/nsc.m4
cf7a81dcca1514f0d7a7f2074eca802b49e65c84
[nsc-5.git] / m4 / nsc.m4
1 dnl ###
2 dnl ### NSC -- Zone File Generator
3 dnl ### (c) 1997--2011 Martin Mares <mj@ucw.cz>
4 dnl ###
5 dnl ### Usage: m4 -DVERS=path-to-version-file nsc.m4 domain-source-files >zone-file
6 dnl ###    or: m4 -DHASHING nsc.m4 domain-source-files | md5sum
7 dnl ###
8 include(m4/dnslib.m4)
9
10 # Version number
11
12 ifdef(`HASHING', `define(`VERSION',`YYYYMMDDNN')', `
13
14 ifdef(`VERS',`',`nsc_fatal_error(`VERS macro not defined')')
15
16 define(TODAY_CODE, translit(esyscmd(`date +"%Y%m%d"'),`
17 ',`'))
18 sinclude(VERS)
19 # Backward compatibility with NSC 2.x version files
20 ifdef(`last_today_code', `define(`LAST_TODAY_CODE',last_today_code)undefine(`last_today_code')')
21 ifdef(`subver_num', `define(`SUBVER_NUM',subver_num)undefine(`subver_num')')
22 ifelse(TODAY_CODE, LAST_TODAY_CODE, `', `define(`SUBVER_NUM',1)')
23 syscmd(echo >VERS "`define'(`LAST_TODAY_CODE',TODAY_CODE) `define'(`SUBVER_NUM',incr(SUBVER_NUM))")
24 ifelse(eval(SUBVER_NUM > 99),1,`nsc_fatal_error(`Too many zone changes in a single day, you must tweak 'VERS` manually')')
25 define(`VERSION',TODAY_CODE`'format(`%02d', SUBVER_NUM))
26
27 ')
28
29 # Record names
30
31 define(nsc_set_name, `define(`CURRENT_NAME', nsc_corr_dot($1))define(`PRINT_NAME', CURRENT_NAME)')
32 define(nsc_emit_name, `ifdef(`PRINT_NAME', `PRINT_NAME`'undefine(`PRINT_NAME')', `')')
33 define(nsc_abs_name, `ifelse(CURRENT_NAME, translit(CURRENT_NAME,.,:), CURRENT_NAME.CURRENT_DOMAIN, CURRENT_NAME)')
34 define(nsc_abs_name_nodot, `define(`nsc_tmp', nsc_abs_name)substr(nsc_tmp,0,decr(len(nsc_tmp)))')
35
36 # SOA record
37
38 define(nsc_SOA, `
39 ifelse(CURRENT_DOMAIN,@,`',$ORIGIN CURRENT_DOMAIN)
40 $TTL    MINTTL
41 nsc_emit_name   `SOA'   nsc_corr_dot(NSNAME) MAINTNAME (
42                 VERSION REFRESH RETRY EXPIRE MINTTL )')
43 define(SOA, `ifdef(`CURRENT_DOMAIN',`ifdef(`REVERSE_MODE',,`nsc_fatal_error(`SOA record defined twice')')')dnl
44 define(`CURRENT_DOMAIN',ifelse($1,@,@,$1.))dnl
45 nsc_set_name(CURRENT_DOMAIN)dnl
46 ifdef(`REVERSE_MODE',,`nsc_SOA')')
47
48 # Reverse zones
49
50 define(REVERSE, `divert(-1)
51         define(`REVERSE_MODE', `')
52         nsc_if_v6($1,`
53                 define(`REVNET6', nsc_revblock6($1))
54         ',`
55                 define(`REVNET', `$1.')
56                 define(`REVLOW', `$2')
57                 define(`REVHIGH', `$3')
58         ')
59 ')
60
61 define(nsc_mk_PTR, `
62         divert`'$1      `PTR'   $2
63 divert(-1)
64 ')
65
66 define(nsc_auto_PTR4, `dnl
67 ifdef(`REVNET', `
68         ifelse(REVNET, substr($1, 0, len(REVNET)), `
69                 define(`REVX', substr($1, len(REVNET)))
70                 ifelse(REVLOW, `',
71                         `nsc_mk_PTR(nsc_revaddr(REVX), $2)',
72                         `
73                                 ifelse(eval((REVX >= REVLOW) && (REVX <= REVHIGH)), 1, `nsc_mk_PTR(REVX, $2)')
74                         ')
75                 ')
76         ')dnl
77 ')
78
79 define(nsc_auto_PTR6, `dnl
80 ifdef(`REVNET6', `
81         define(`REVA', nsc_revaddr6($1))
82         ifelse(REVNET6, substr(REVA, eval(63-len(REVNET6))), `
83                 nsc_mk_PTR(substr(REVA, 0, eval(62-len(REVNET6))), $2)
84                 ')
85         ')dnl
86 ')
87
88 # A records
89
90 define(nsc_AONLY, `nsc_emit_name        nsc_if_v6($1,`AAAA      nsc_norm_v6($1)',``A'   $1')
91 ')
92 define(nsc_A, `nsc_if_v6($1,`nsc_auto_PTR6',`nsc_auto_PTR4')($1,nsc_abs_name)nsc_AONLY($1)')
93 define(ADDR, `nsc_iterate(`nsc_A', $@)dnl')
94 define(DADDR, `nsc_iterate(`nsc_AONLY', $@)dnl')
95
96 # Host specification
97
98 define(H, `nsc_set_name($1)nsc_iterate(`nsc_A', shift($@))dnl')
99 define(DH, `nsc_set_name($1)nsc_iterate(`nsc_AONLY', shift($@))dnl')
100
101 # Subdomain specification and glue records
102
103 define(D, `nsc_set_name($1)dnl')
104 define(GLUE, `DH($@)')
105
106 # NS record
107
108 define(nsc_NS, `nsc_emit_name   `NS'    nsc_corr_dot($1)
109 ')
110 define(NS, `nsc_iterate(`nsc_NS', $@)dnl')
111
112 # MX record
113
114 define(nsc_MX, `nsc_emit_name   `MX'    nsc_corr_dot($1)
115 ')
116 define(MX, `nsc_iterate(`nsc_MX', $@)dnl')
117
118 # HINFO record
119
120 define(HI, `nsc_emit_name       HINFO   "$1" "$2"')
121
122 # ALIASing records
123
124 define(nsc_ALIAS, `$1   `CNAME' CURRENT_NAME
125 ')
126 define(ALIAS, `nsc_iterate(`nsc_ALIAS', $@)nsc_set_name(CURRENT_NAME)dnl')
127
128 # TXT records
129
130 define(TXT, `nsc_emit_name      `TXT'   "$1"')
131
132 # RP (responsible person) records
133
134 define(RP, `nsc_emit_name       `RP'    nsc_corr_dot($1) nsc_corr_dot($2)')
135
136 # SRV records
137
138 define(SRV, `_`'$1`'._`'$2`'.CURRENT_NAME       `SRV'   $3 $4 $5 nsc_corr_dot($6)`'nsc_set_name(CURRENT_NAME)')
139
140 # CNAME records
141
142 define(CNAME, `$1       `CNAME' nsc_corr_dot($2)')
143
144 # Explicit PTR records
145
146 define(PTR, `$1 `PTR'   nsc_corr_dot($2)')
147
148 # DS records (DNSSEC keys for subdomains)
149
150 define(DS, `ifdef(`REVERSE_MODE',,`nsc_DS')')
151 define(nsc_DS, `undivert(dss/nsc_abs_name_nodot)')
152
153 # Shortcut for classless reverse delegation of a block
154
155 define(REVBLOCK, `nsc_forloop(`i', $2, $3, `i'  `CNAME' `i'.$1
156 )D($1)
157 ')
158
159 # Cleanup actions
160
161 define(nsc_cleanup, `ifdef(`DISABLE_LOCALHOST',,`
162 ; Added automatically (required by RFC 1912)
163 localhost       A       127.0.0.1
164 ')')
165 m4wrap(`nsc_cleanup')
166
167 divert(0)dnl
168 `;;;' Primary zone file
169 `;;;' Generated by NSCVER (nsc.m4) on ifdef(`HASHING', ``CURRENT_DATE'', `CURRENT_DATE')
170 `;;;' Please do not edit manually
171 `;;;' `VERSION': VERSION
172 `'