X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=m4%2Fdnslib.m4;h=5997262bc58f1b2eb6c3e051a3adfdf5c4dbf298;hb=8ee88613458f9f6249e03d6dfdd2c79e549ffd81;hp=9c4d0a47d410e2714f9394b5d623d61de6520031;hpb=ded4fe1add43222e47f4105aac673428c60c4f2e;p=nsc-5.git diff --git a/m4/dnslib.m4 b/m4/dnslib.m4 index 9c4d0a4..5997262 100644 --- a/m4/dnslib.m4 +++ b/m4/dnslib.m4 @@ -1,30 +1,117 @@ dnl ### -dnl ### NSC 2.0 -- Library Functions For DNS Processing -dnl ### (c) 1997 Martin Mares +dnl ### NSC -- Library Functions For DNS Processing +dnl ### (c) 1997--2019 Martin Mares dnl ### divert(-1) +# NSC version + +define(`NSCVER', `NSC 5.0') + # Current date and time -define(`curdate', translit(esyscmd(`date'),` +define(`CURRENT_DATE', translit(esyscmd(`date'),` ',`')) # Time conversion -define(minutes, `eval($1*60)') -define(hours, `eval($1*3600)') -define(days, `eval($1*86400)') +define(MINUTES, `eval($1*60)') +define(HOURS, `eval($1*3600)') +define(DAYS, `eval($1*86400)') + +# Since slashes can occur in zone names, we convert them to @'s + +define(nsc_file_name, `translit($1,/,@)') + +# Reverse an IP address + +define(nsc_revIPa, `ifelse($#, 1, `$1', `nsc_revIPa(shift($@)).$1')') +define(nsc_revaddr, `nsc_revIPa(translit($1, `.', `,'))') + +# Fix up dots in a name: If the name is not simple (i.e., it contains at least one unescaped +# dot), ensure that it ends with a dot. Then unescape all escaped dots (\.). -# Reversal of IP address +define(nsc_name, `nsc_unescape_name(ifelse(substr($1,decr(len($1))),.,$1,$1`'ifelse(regexp($1,`[^\\]\.'),-1,,.)))') +define(nsc_unescape_name,`patsubst(`$1',\\\.,.)') -define(revIPa, `ifelse($#, 1, `$1', `revIPa(shift($@)).$1')') -define(revaddr, `revIPa(translit($1, `.', `,'))') +# Normalize IPv6 address -# Add explicit dot at the end if the name contains domain part +define(nsc_if_v6, `ifelse(index($1,:),-1,`$3',`$2')') -define(corr_dot, `$1`'ifelse(index($1,`.'),-1,,`.')') +define(nsc_norm_v6, `nsc_norm_v6_z(ifelse(regexp($1,`::.*::'),-1,`ifelse(index($1,::),-1,`nsc_norm_v6_nn($1)',`nsc_norm_v6_cc($1)')',`nsc_bad_v6($1)'))') +# If there is no ::, check the number of :'s +define(nsc_norm_v6_nn, `ifelse(nsc_extract_colons($1),:::::::,$1,`nsc_bad_v6($1)')') +# Replace :: by the right number of :'s to get 8 (possibly empty) components +define(nsc_norm_v6_cc, `regexp($1,`\(.*\)::\(.*\)',`\1'nsc_n_times(eval(9-len(nsc_extract_colons($1))),:)`\2')') +# Delete everything except colons +define(nsc_extract_colons, `ifelse(index($1,:),-1,,`:nsc_extract_colons(regexp($1,`\(.*\):\(.*\)',`\1\2'))')') +# Repeat a given string N times +define(nsc_n_times, `ifelse($1,0,,`$2`'nsc_n_times(eval($1-1),`$2')')') +# Pad each component to 4 hex digits and convert them to lowercase +define(nsc_norm_v6_z, `nsc_norm_v6_digs(translit($1,:,`,'))') +define(nsc_norm_v6_digs, `nsc_norm_v6_dig($1)`'ifelse($#,1,,:`nsc_norm_v6_digs(shift($@))')') +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)')') +# Report a fatal error in IPv6 address +define(nsc_bad_v6, `nsc_fatal_error(`Invalid IPv6 address: '$1)') + +# Reverse an IPv6 address or block + +define(nsc_revaddr6, `substr(nsc_do_revaddr6(nsc_norm_v6($1)),1)') +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)')') +define(nsc_revblock6, `nsc_do_revblock6(translit($1,/,`,'))') +define(nsc_do_revblock6, `substr(nsc_revaddr6($1),dnl +ifelse(eval($2%4),0,`eval(64-$2/2)',`nsc_fatal_error(`Prefixes must respect hex digit boundary')'))') # Iteration -define(itera, `ifelse($#, 1, `iter($1)', `iter($1)`'itera(shift($@))')') -define(iterate, `define(`iter', defn(`$1'))itera($2)') +define(nsc_itera, `ifelse($1,,,`nsc_iter($1)')`'ifelse($#,1,,`nsc_itera(shift($@))')') +define(nsc_iterate, `define(`nsc_iter', defn(`$1'))nsc_itera(shift($@))') + +# Generate name of reverse domain + +define(REV, `nsc_if_v6($1,`nsc_revblock6($1).ip6.arpa',`nsc_revaddr($1).in-addr.arpa')') + +# DNSSEC wrapper + +define(`USE_DNSSEC') +define(`DNSSEC', `define(`USE_DNSSEC',1)$1define(`USE_DNSSEC')') + +# A for loop macro from m4 doc + +define(`nsc_forloop', + `pushdef(`$1', `$2')nsc__forloop(`$1', `$2', `$3', `$4')popdef(`$1')') +define(`nsc__forloop', + `$4`'ifelse($1, `$3', , + `define(`$1', incr($1))nsc__forloop(`$1', `$2', `$3', `$4')')') + +# Reporting errors + +define(`nsc_fatal_error', `errprint(`NSC error: $1 +')m4exit(1)') + +# Default values of parameters + +define(`NAMED_RESTART_CMD', `rndc reload') + +define(`CFDIR', `cf') +define(`VERSDIR', `ver') + +define(`REFRESH', HOURS(8)) +define(`RETRY', HOURS(2)) +define(`EXPIRE', DAYS(14)) +define(`MINTTL', DAYS(1)) +define(`NSNAME', translit(esyscmd(`hostname -f'),` +',`')) +define(`MAINTNAME', `root'.`nsc_corr_dot(NSNAME)') + +define(`KEYGEN_OPTIONS', `-a RSASHA256 -b 1024') +define(`SIGNZONE_OPTIONS', `-e +'DAYS(365)) +define(`DSFROMKEY_OPTIONS', `') + +# And finally we change comments to semicolons to be compatible with the zone files + +changecom(;) + +; User-defined parts of configuration + +include(CFDIR/config)