]> mj.ucw.cz Git - nsc-5.git/blob - m4/dnslib.m4
More v3.0 work.
[nsc-5.git] / m4 / dnslib.m4
1 dnl ###
2 dnl ### NSC 3.0 -- Library Functions For DNS Processing
3 dnl ### (c) 1997--2003 Martin Mares <mj@ucw.cz>
4 dnl ###
5 divert(-1)
6
7 # NSC version
8
9 define(`NSCVER', `NSC 2.99a')
10
11 # Current date and time
12
13 define(`CURRENT_DATE', translit(esyscmd(`date'),`
14 ',`'))
15
16 # Time conversion
17
18 define(MINUTES, `eval($1*60)')
19 define(HOURS, `eval($1*3600)')
20 define(DAYS, `eval($1*86400)')
21
22 # Since slashes can occur in zone names, we convert them to @'s
23
24 define(nsc_file_name, `translit($1,/,@)')
25
26 # Reverse an IP address
27
28 define(nsc_revIPa, `ifelse($#, 1, `$1', `nsc_revIPa(shift($@)).$1')')
29 define(nsc_revaddr, `nsc_revIPa(translit($1, `.', `,'))')
30
31 # Fix up dots in a name: if the name is not simple (i.e., it contains at least one dot),
32 # ensure that it ends with a dot.
33
34 define(nsc_corr_dot, `ifelse(substr($1,decr(len($1))),.,$1,$1`'ifelse(index($1,.),-1,,.))')
35
36 # Normalize IPv6 address
37
38 define(nsc_if_v6, `ifelse(index($1,:),-1,`$3',`$2')')
39
40 define(nsc_norm_v6, `nsc_norm_v6_z(dnl
41 ifelse(regexp($1,`::.*::'),-1,`ifelse(index($1,::),-1,`nsc_norm_v6_nn($1)',`nsc_norm_v6_cc($1)')',`nsc_bad_v6($1)'))')
42 # If there is no ::, check the number of :'s
43 define(nsc_norm_v6_nn, `ifelse(nsc_extract_colons($1),:::::::,$1,`nsc_bad_v6($1)')')
44 # Replace :: by the right number of :'s to get 8 (possibly empty) components
45 define(nsc_norm_v6_cc, `regexp($1,`\(.*\)::\(.*\)',`\1'nsc_n_times(eval(9-len(nsc_extract_colons($1))),:)`\2')')
46 # Delete everything except colons
47 define(nsc_extract_colons, `ifelse(index($1,:),-1,,`:nsc_extract_colons(regexp($1,`\(.*\):\(.*\)',`\1\2'))')')
48 # Repeat a given string N times
49 define(nsc_n_times, `ifelse($1,0,,`$2`'nsc_n_times(eval($1-1),`$2')')')
50 # Pad each component to 4 hex digits and convert them to lowercase
51 define(nsc_norm_v6_z, `nsc_norm_v6_digs(translit($1,:,`,'))')
52 define(nsc_norm_v6_digs, `nsc_norm_v6_dig($1)`'ifelse($#,1,,:`nsc_norm_v6_digs(shift($@))')')
53 define(nsc_norm_v6_dig, `ifelse(eval(len($1) > 4),1,`nsc_bad_v6($1)',`nsc_n_times(eval(4-len($1)),0)`'translit($1,A-F,a-f)')')
54 # Report a fatal error in IPv6 address
55 define(nsc_bad_v6, `nsc_fatal_error(`Invalid IPv6 address: '$1)')
56
57 # Reverse an IPv6 address or block
58
59 define(nsc_revaddr6, `substr(nsc_do_revaddr6(nsc_norm_v6($1)),1)')
60 define(nsc_do_revaddr6, `ifelse($1,,,substr($1,0,1),:,`nsc_do_revaddr6(substr($1,1))',`nsc_do_revaddr6(substr($1,2)).substr($1,1,1).substr($1,0,1)')')
61 define(nsc_revblock6, `nsc_do_revblock6(translit($1,/,`,'))')
62 define(nsc_do_revblock6, `substr(nsc_revaddr6($1),dnl
63 ifelse(eval($2%4),0,`eval(64-$2/2)',`nsc_fatal_error(`Prefixes must respect hex digit boundary')'))')
64
65 # Iteration
66
67 define(nsc_itera, `ifelse($1,,,`nsc_iter($1)')`'ifelse($#,1,,`nsc_itera(shift($@))')')
68 define(nsc_iterate, `define(`nsc_iter', defn(`$1'))nsc_itera(shift($@))')
69
70 # Generate name of reverse domain
71
72 define(REV, `nsc_if_v6($1,`nsc_revblock6($1).ip6.arpa',`nsc_revaddr($1).in-addr.arpa')')
73
74 # A for loop macro from m4 doc
75
76 define(`nsc_forloop',
77    `pushdef(`$1', `$2')nsc__forloop(`$1', `$2', `$3', `$4')popdef(`$1')')
78 define(`nsc__forloop',
79    `$4`'ifelse($1, `$3', ,
80    `define(`$1', incr($1))nsc__forloop(`$1', `$2', `$3', `$4')')')
81
82 # Reporting errors
83
84 define(`nsc_fatal_error', `errprint(`NSC error: $1
85 ')m4exit(1)')
86
87 # Default values of parameters
88
89 define(`NAMED_RESTART_CMD', `ndc reload')
90
91 define(`BIND_OPTIONS', `        # Other options can be added here via macro `BIND_OPTIONS'')
92
93 define(`ROOT', `/etc/named')
94 define(`CFDIR', `cf')
95 define(`ZONEDIR', `zone')
96 define(`BAKDIR', `bak')
97 define(`VERSDIR', `ver')
98 define(`ROOTCACHE', `root.cache')
99
100 define(`REFRESH', HOURS(8))
101 define(`RETRY', HOURS(2))
102 define(`EXPIRE', DAYS(14))
103 define(`MINTTL', DAYS(1))
104 define(`NSNAME', translit(esyscmd(`hostname -f'),`
105 ',`'))
106 define(`MAINTNAME', `root'.`nsc_corr_dot(NSNAME)')
107
108 # And finally we change comments to semicolons to be compatible with the zone files
109
110 changecom(;)
111
112 ; User-defined parts of configuration
113
114 include(CFDIR/config)