I'll update the NEWS one day.
#!/bin/bash
# NSC -- Makefile & Config file build script
-# (c) 1997--2000 Martin Mares <mj@ucw.cz>
+# (c) 1997--2003 Martin Mares <mj@ucw.cz>
-ROOT=/etc/named # Root dir of the whole package
-CF=cf # Place for all configuration files
-ZONES=zone # Place for all primary zone files
-BAX=bak # Place for all secondary zone files
-VERS=ver # Place for all primary version files
-NSC=m4 # Place for all scripts
-
-DOMAINS=$CF/domains # The master domain list
-MKFILE=Makefile # Makefile to generate
-CONFFILE=named.conf # Configuration file to generate
-CACHE=root.cache
+set -e
M4=`which gm4` || M4=`which m4` || ( echo "Unable to find M4!" ; exit 1 )
+DOMAINS=cf/domains
if [ ! -f $DOMAINS ] ; then
echo "Domain list file missing."
exit 1
fi
-m4 $NSC/dnslib.m4 $NSC/mkconf.m4 $DOMAINS >$CONFFILE -DZONEDIR=$ZONES -DBAKDIR=$BAX -DCACHE=$CACHE -DROOT=$ROOT
-m4 $NSC/dnslib.m4 $NSC/mkmf.m4 $DOMAINS >$MKFILE -DZONEDIR=$ZONES -DBAKDIR=$BAX -DCACHE=$CACHE -DVERSDIR=$VERS -DNSCDIR=$NSC -DCONF=$CONFFILE -DCFDIR=$CF -DM4=$M4
+
+$M4 m4/mkconf.m4 $DOMAINS >named.conf
+$M4 m4/mkmf.m4 $DOMAINS >Makefile -DM4=$M4
+# User configuration of the NSC
+
+define(`NAMED_RESTART_CMD', `echo ndc reload')
# Domain table for NSC at UCW
-OPTIONS()
-
# Various mandatory things
PRIMARY(localhost)
-REVERSE(0, localhost)
-REVERSE(255, localhost)
+REVERSE(0)
+REVERSE(255)
REVERSE(127.0.0, localhost)
PRIMARY(ucw.cz)
+REVERSE(81.31.5, ucw.cz)
+REVERSE(2001:ae8::/64, ucw.cz)
+PRIMARY(slady.cz)
+PRIMARY(slady.net)
+PRIMARY(pdesign.cz)
+PRIMARY(martin.mares.name)
-SECONDARY(sinus.cz, 194.213.32.2)
-
-REVERSE(62.168.0, ucw.cz)
+SECONDARY(werewolf.cz,194.108.93.231)
+SECONDARY(mks.cz,212.71.128.78)
+SECONDARY(resla.cz,212.71.128.78)
+SECONDARY(sebald-flex.cz,212.71.128.78)
+SECONDARY(bepof.cz,212.71.128.78)
+SECONDARY(cheb.cz,212.71.128.78)
+SECONDARY(alumexgroup.cz,212.71.128.78)
+SECONDARY(egraphics.cz,212.71.128.78)
+SECONDARY(chytej.cz,212.71.128.78)
+SECONDARY(drak.ucw.cz,212.71.128.78)
+SECONDARY(e-redakce.cz,212.71.128.78)
; From this domain file we generate all the mandatory records specified
; in RFC 1912, section 4.1:
; 1) Localhost zone containing `localhost A 127.0.0.1'
-; 2) 0.0.127.in-addr.arpa with `1.0 PTR localhost.'
+; 2) 0.0.127.in-addr.arpa with `1 PTR localhost.'
; 3) empty 255.in-addr.arpa
; 4) empty 0.in-addr.arpa
SOA(localhost)
-NS(nsname)
-RH(localhost.,127.0.0.1)
-localhost. A 127.0.0.1
+NS(NSNAME)
+ADDR(127.0.0.1)
+define(`DISABLE_LOCALHOST', `1')
-; Name server domain file for ucw.cz by MJ
+; Domain file for ucw.cz by MJ
-; 62.168.0.0 [8] Local arcnet
-; 62.168.0.8 [4] PTP link to GTS
-; 62.168.0.12 [4] PTP LL link to GTS
-; 62.168.0.16 [4] PTP link to Alcyone
+define(`jabip', `81.31.5.130')
+define(`ucwmx', `0 jabberwock')
-define(`ucwmx', `50 atrey.karlin.mff.cuni.cz, 60 k332.feld.cvut.cz, 100 server1.gts.cz, 110 server2.gts.cz')
-define(`MJNET', `62.168.0')
+define(`minttl', 300)
SOA(ucw.cz)
-NS(server1.gts.cz,hubserv.gts.cz)
+NS(jabberwock.ucw.cz,drak.ucw.cz,ns.parcon.cz)
+MX(ucwmx, 10 drak)
+DADDR(jabip)
+
+; Jabberwock, connected to CECOM
+H(jabberwock, jabip)
+MX(ucwmx)
+ALIAS(lariat,www,ftp,vrr,cvs)
+
+H(jabberwock6, 2001:ae8::248:54ff:fe64:60b1)
+
+; MJ's home network
+H(albireo, 81.27.194.19)
+MX(ucwmx)
+
+the.name.of.my.computer.is.longer.than.the.name.of.your.computers.isnt.it `CNAME' albireo
+
+; Pavel <pavel@ucw.cz>
+H(elf)
MX(ucwmx)
-H(albireo, MJNET.14, MJNET.1)
+H(bug)
MX(ucwmx)
-H(toaster, MJNET.3)
+; Dan <0rfelyus@ucw.cz>
+H(hobitin)
+MX(ucwmx)
+CNAME(stopari, jabberwock)
+
+; Vojta <vojtech@ucw.cz>
+H(twilight, 81.30.235.3)
+MX(0 twilight.ucw.cz, 10 twilight-upc.ucw.cz, 100 jabberwock.ucw.cz)
-H(alcyone-gw, MJNET.17)
-H(alcyone, MJNET.18)
+H(twilight-upc, 62.245.75.237)
-H(ucw-cb, MJNET.9)
-H(albireo-cb, MJNET.10)
+DH(m-v, jabip)
+MX(ucwmx)
+ALIAS(www.m-v)
-H(albireo-eth0, MJNET.21)
-H(abacus, MJNET.22)
+DH(lakarie, jabip)
+MX(ucwmx)
-H(ucw-gw, MJNET.13)
+; Erik Hamera <hamerae@cs.felk.cvut.cz>
+H(kanal, 62.24.67.123)
+MX(0 kanal)
+H(mamutik, 62.24.67.72)
-HH(elf)
-MX(5 atrey.karlin.mff.cuni.cz, 100 server1.gts.cz, 110 server2.gts.cz)
+; Johanka <johanka@ucw.cz>
+H(arc, 195.39.17.251)
-HH(bug)
-MX(5 atrey.karlin.mff.cuni.cz, 100 server1.gts.cz, 110 server2.gts.cz)
+; Mafi <mafi@ucw.cz>
+CNAME(mafi, ns1.foo.cz)
-HH(twilight)
-MX(5 atrey.karlin.mff.cuni.cz, 100 server1.gts.cz, 110 server2.gts.cz)
+; Drak <goran@ucw.cz>
+; (we're a secondary for Drak, so glue record is not needed)
+dnl H(drak, 212.71.128.78)
+H(drak)
+NS(drak.ucw.cz)
+NS(jabberwock.ucw.cz)
-the.name.of.my.computer.is.longer.than.any.name.of.a.computer.you.might.possibly.have CNAME mouse.gts.cz.
+; Spam Trap
+H(uu)
+MX(ucwmx)
+
+; Mail Extension Mapper
+H(x)
+MX(ucwmx)
dnl ###
-dnl ### NSC 2.0 -- Library Functions For DNS Processing
-dnl ### (c) 1997 Martin Mares <mj@gts.cz>
+dnl ### NSC 3.0 -- Library Functions For DNS Processing
+dnl ### (c) 1997--2003 Martin Mares <mj@ucw.cz>
dnl ###
divert(-1)
+# NSC version
+
+define(`NSCVER', `NSC 2.99a')
+
# 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)')
+
+# 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 dot),
+# ensure that it ends with a dot.
-# Reversal of IP address
+define(nsc_corr_dot, `ifelse(substr($1,decr(len($1))),.,$1,$1`'ifelse(index($1,.),-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(dnl
+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')')
+
+# 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 and user configuration
+
+define(`NAMED_RESTART_CMD', `ndc reload')
+
+define(`BIND_OPTIONS', ` # Other options can be added here via macro BIND_OPTIONS')
+
+define(`ROOT', `/etc/named')
+define(`CFDIR', `cf')
+define(`ZONEDIR', `zone')
+define(`BAKDIR', `bak')
+define(`VERSDIR', `ver')
+define(`ROOTCACHE', `root.cache')
+
+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)')
+
+include(CFDIR/config)
dnl ###
-dnl ### NSC 2.2 -- BIND Config File Builder
-dnl ### (c) 1997--1999 Martin Mares <mj@ucw.cz>
+dnl ### NSC -- BIND Config File Builder
+dnl ### (c) 1997--2003 Martin Mares <mj@ucw.cz>
dnl ###
+include(m4/dnslib.m4)
-# Definition of primary domain
+# Definition of primary domains
-define(`PRIMARY', `divert(0)zone "$1" in {
+define(`DO_PRIMARY', `divert(0)zone "$1" in {
type master;
- file "ZONEDIR/$1";
+ file "ZONEDIR/$2";
};
divert(-1)')
+define(`PRIMARY', `DO_PRIMARY($1,$1)')
+define(`REVERSE', `DO_PRIMARY(REV($1),nsc_if_v6($1,`nsc_revblock6($1)',`nsc_revaddr($1)'))')
+
# Definition of secondary domain
define(`SECONDARY', `divert(0)zone "$1" in {
divert(-1)')
-# Definition of reverse domain
-
-define(`REVERSE', `divert(0)zone "revaddr($1).in-addr.arpa" in {
- type master;
- file "ZONEDIR/revaddr($1)";
-};
-
-divert(-1)')
-
-# Definition of reverse sub-domain
-
-define(`PARTIAL', `SECONDARY(revaddr($1).in-addr.arpa,$3)')
-define(`PREVERSE', `REVERSE($1)')
-
# Definition of forwarders for both normal and slave mode
define(`FORWard', `patsubst(`$@',`,',`; ')')
define(`CONFIG', `divert(0)$1
divert(-1)')
-# BIND options
+# The preamble
+
+divert(0)dnl
+`#'
+`#' BIND configuration file
+`#' Generated by NSCVER (mkconf.m4) on CURRENT_DATE
+`#' Please don't edit manually
+`#'
-define(`OPTIONS', `divert(0)options {
+options {
directory "ROOT";
interface-interval 0;
-$1};
+BIND_OPTIONS
+};
zone "." in {
type hint;
- file "root.cache";
+ file "ROOTCACHE";
};
-divert(-1)')
-
-divert(0)dnl
-`#'
-`#' Name server configuration file
-`#' Generated by mkconf.m4 on curdate
-`#' Please don't edit manually
-`#'
-
divert(-1)
dnl ###
-dnl ### NSC 2.2 -- Makefile Builder
-dnl ### (c) 1997--1999 Martin Mares <mj@ucw.cz>
+dnl ### NSC -- Makefile Builder
+dnl ### (c) 1997--2003 Martin Mares <mj@ucw.cz>
dnl ###
+include(m4/dnslib.m4)
-# Things we allow to override
+# Definition of primary domains; secondaries we needn't take care of
-define(`named_restart_cmd', `ndc reload')
+define(`PRIMARIES', `')
-# List of all version files available
-
-define(`ALLVERS', CONF CACHE)
-define(`ADDVER', `define(`ALLVERS', ALLVERS` $1')')
-
-# Definition of primary domain
-
-define(`PRIMARY', `divert(0)VERSDIR/$1 ZONEDIR/$1: CFDIR/$1
- `$'(NSC) CFDIR/$1 >ZONEDIR/$1 -DVERS=VERSDIR/$1
-
-divert(-1)
-ADDVER(VERSDIR/$1)
-')
-
-# Definition of reverse domain
-
-define(`REVCF', ` patsubst(CFDIR/$1,`^cf/\(.*\)\+\(.*\)$',`ZONEDIR/\1+\2')')
-define(`REVERSi', `define(`ev',revaddr($1))define(`ew',`shift(shift($@))')
-divert(0)VERSDIR/ev ZONEDIR/ev:iterate(`REVCF', `ew')
- `$'(NSC)iterate(`REVCF', `ew') >ZONEDIR/ev -DVERS=VERSDIR/ev -DREVERSE=$2 -DREVBASE=$1
+define(`nsc_prepend_cf_one', ` 'CFDIR/`$1')
+define(`nsc_prepend_cf_multi', `nsc_iterate(`nsc_prepend_cf_one', $@)')
+define(`PRIMARY', `divert(0)ZONEDIR/$1:nsc_prepend_cf_multi($@) $(DDEPS)
+ `$'(NSC)nsc_prepend_cf_multi($@) >ZONEDIR/$1 -DVERS=VERSDIR/$1
divert(-1)
-ADDVER(VERSDIR/ev)
+define(`PRIMARIES', PRIMARIES ZONEDIR/$1)
')
-define(`REVERSE', `REVERSi($1,$@)')
-define(`PREVERSE', `REVERSi($1,patsubst($1,`^\(.*\)\..*$',`\1'),shift($@))')
-
-# Definition of partial reverse zone delegation (also called classless in-addr.arpa)
-
-define(`PARTIAL', `divert(0)ZONEDIR/$1+$2:
- `$'(PGEN) >ZONEDIR/$1+$2 -DBASE=revaddr($1) -DFROM=patsubst(`$1', `^.*\.\(.*\)$', `\1') -DCOUNT=$2 -DSERV=shift(shift($@))
-
-divert(-1)')
+define(`REVERSE', `PRIMARY(nsc_if_v6($1,`nsc_revblock6($1)',`nsc_revaddr($1)'), shift($@))')
# Insertion of raw makefile material
# Last words
-define(`cleanup', `divert(0)VERSDIR/.version: ALLVERS
- named_restart_cmd
+define(`nsc_cleanup', `divert(0)VERSDIR/.version: CFDIR/domains ROOTCACHE`'PRIMARIES
+ NAMED_RESTART_CMD
touch VERSDIR/.version
clean:
find BAKDIR ZONEDIR -type f -maxdepth 1 | xargs rm -f
clobber: clean
- rm -f Makefile CONF
+ rm -f Makefile named.conf
distclean: clobber
find VERSDIR -type f -maxdepth 1 | xargs rm -f
divert(0)dnl
`#'
`#' Nameserver Configuration Makefile
-`#' Generated by mkmf.m4 on curdate
+`#' Generated by NSCVER (mkmf.m4) on CURRENT_DATE
`#' Please don't edit manually
`#'
-NSC=M4 NSCDIR/dnslib.m4 NSCDIR/nsc.m4
-PGEN=m4 NSCDIR/dnslib.m4 NSCDIR/pgen.m4
+`M4'=M4
+NSC=$(`M4') m4/nsc.m4
+DDEPS=m4/nsc.m4 m4/dnslib.m4 cf/config
all: VERSDIR/.version
-m4wrap(`cleanup')
+m4wrap(`nsc_cleanup')
divert(-1)
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')
+++ /dev/null
-dnl ###
-dnl ### NSC 2.2 -- Partial Reverse Delegation Generator
-dnl ### (c) 1997--1999 Martin Mares <mj@ucw.cz>
-dnl ###
-dnl ### Usage: m4 nsc.m4 >zone-file -DBASE=domain -DFROM=first-addr -DCOUNT=count -DSERV=primary-server
-dnl ###
-
-define(`XTHEMALL', `ifelse(`$2',`1',,`$1 CNAME $1.BASE.in-addr.arpa.
-XTHEMALL(incr($1),decr($2))')')
-
-define(`partNS', ` ``NS'' $1
-')
-
-divert(0); Partial Reverse Delegation for COUNT entries starting with FROM in BASE.in-addr.arpa.
-; Generated by pgen.m4 on curdate. Please don't edit manually.
-
-`divert(0)'
-
-FROM ``NS'' `corr_dot(nsname)'
-iterate(`partNS', `SERV')
-XTHEMALL(incr(FROM),decr(COUNT))`divert(-1)'dnl
Begin3
Title: Name Server Configurator
-Version: 2.3
-Entered-date: 010627
+Version: 2.99a
+Entered-date: 031220
Description: Set of utilities and M4 scripts for easy maintenance of
- DNS server configuration and zone files. Requires GNU m4
- and BIND version 8.X or newer.
+ DNS zone files and also automatic generation of BIND 8/9 configuration
+ files. Requires GNU m4 and a Posix-compatible shell.
Keywords: named, bind, dns
Author: mj@ucw.cz (Martin Mares)
Maintained-by: mj@ucw.cz (Martin Mares)
-Primary-site: atrey.karlin.mff.cuni.cz pub/local/mj/net/nsc-2.3.tar.gz
-Alternate-site: metalab.unc.edu pub/Linux/system/network/management/nsc-2.3.tar.gz
+Primary-site: atrey.karlin.mff.cuni.cz pub/local/mj/net/nsc-2.99a.tar.gz
+Alternate-site: metalab.unc.edu pub/Linux/system/network/management/nsc-2.99a.tar.gz
Copying-policy: GPL
End
+;
; This file holds the information on root name servers needed to
; initialize cache of Internet domain name servers
; (e.g. reference this file in the "cache . <file>"
; configuration file of BIND domain name servers).
;
-; This file is made available by InterNIC registration services
-; under anonymous FTP as
-; file /domain/named.root
-; on server FTP.RS.INTERNIC.NET
-; -OR- under Gopher at RS.INTERNIC.NET
-; under menu InterNIC Registration Services (NSI)
-; submenu InterNIC Registration Archives
-; file named.root
+; This file is made available by the Internet Assigned Numbers Authority
+; (IANA) as
+; <URL:ftp://ftp.iana.org/iana/named.root>.
+;
+; A copy of this file is also available (for compatibility purposes)
+; from InterNIC registration services as
+; <URL:ftp://ftp.rs.internic.net/domain/named.root>
+;
+; New versions of this file are announced periodically on the
+; <namedroppers@internic.net>d <ietf@ietf.org> mailing lists.
;
-; last update: Aug 22, 1997
-; related version of root zone: 1997082200
+; last update: January 19, 1999
+; related version of root zone: 1999011900
;
;
; formerly NS.INTERNIC.NET
. 3600000 NS J.ROOT-SERVERS.NET.
J.ROOT-SERVERS.NET. 3600000 A 198.41.0.10
;
-; housed in LINX, operated by RIPE NCC
+; housed at LINX, operated by RIPE NCC
;
. 3600000 NS K.ROOT-SERVERS.NET.
-K.ROOT-SERVERS.NET. 3600000 A 193.0.14.129
+K.ROOT-SERVERS.NET. 3600000 A 193.0.14.129
;
; temporarily housed at ISI (IANA)
;