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