[mod.sources] UK-1.1 Sendmail Configuration Package. Part 3 of 3

sources-request@genrad.UUCP (05/15/85)

I've had a number of requests for this, since I announced it in net.mail

So, I'm sending it in 3 shar archives to mod.sources.  One warning:
Some of the shell scripts I use are BSD specific.  (E.g. I use "cat -n"
and "fmt" in places.)  I assumed that most people who have sendmail
are running 4.xBSD.

    Jim Crammond
    jim@hwcs.uucp
    uck!hwcs!jim
    jim@cs.hw.ac.uk    (soon)

------------- cut here --------------
#	This is a shell archive.
#	Remove everything above and including the cut line.
#	Then run the rest of the file through sh.
-----cut here-----cut here-----cut here-----cut here-----
#!/bin/sh
# shar:	Shell Archiver
#	Run the following text with /bin/sh to create:
#	chn
# This archive created: Fri May 10 14:42:50 1985
echo shar: creating directory chn
mkdir chn
chdir chn
echo shar: extracting MAKE '(6663 characters)'
cat << \SHAR_EOF > MAKE
#!/bin/sh
#
#  shell script to generate a sendmail <host>.chn file containing all
#  the routing information for this host from a set of per-mailer channel
#  files containing in this directory.
#

if [ $# -le 1 ]
then	echo	usage: make host files...
	exit
fi

host=$1
shift
rm -f $host.chn

echo -n > chn.classes
echo -n > S9

#
# sort out which files refer to which mailers
#
rm -f $$.ether $$.luucp $$.uucp $$.janet $$.bitnet $$.top

for i in $*
do
	case $i in
	*ether.chn)	cat $i >> $$.ether
			;;
	*luucp.chn)	cat $i >> $$.luucp
			;;
	*uucp.chn)	cat $i >> $$.uucp
			;;
	*janet.chn)	cat $i >> $$.janet
			;;
	*bitnet.chn)	cat $i >> $$.bitnet
			;;
	*top.chn)	cat $i >> $$.top
			;;
	esac
done

#
#  Standard format channel tables
#
for chnf in $$.ether $$.luucp
do
	if [ -f $chnf ]
	then
		awk '
BEGIN	{
	mailer=substr(FILENAME, index(FILENAME,".")+1)
	MINCLSIZE = 3
	if (mailer == "ether")
	{	print "# Ethernet"	>>"S9"
		classes = "PQR"
	}
	else if (mailer == "luucp")
	{	print "# Local UUCP"	>>"S9"
		classes = "LMN"
	}
	c = 1
	}

/^#/	{	break	}

/^\*/	{
	$1 = substr($1, 2)
	$2 = sprintf($2, "$2")
	printf "R$+@$+%s\t\t$@<$1>%s.%s\n", $1, $2, mailer	>>"S9"
	break
	}

	{
	i = index($1, ".")
	subdom = substr($1,1,i-1)
	restdom = substr($1,i+1)
	
	if (subdom == $2)
		direct[restdom] = direct[restdom] " " subdom
	else
		printf "R$+@%s\t\t$@<$1@%s>%s.%s\n", $1, $1, $2, mailer	>>"S9"
	}

END	{
	for (i in direct)
	{	n = split(direct[i], sub, " ")
		if (n >= MINCLSIZE && c <= length(classes))
		{	C = substr(classes, c, 1)
			c++
			printf "C%s%s\n", C , direct[i]	>>"chn.classes"
			printf "R$+@$=%s.%s\t\t$@<$1>$2.%s\n",C,i,mailer >>"S9"
		}
		else
		{	for (j=1; j<=n; j++)
				printf "R$+@%s.%s\t\t$@<$1>%s.%s\n", \
					sub[j], i, sub[j], mailer	>>"S9"
		}
	}
	print ""	>>"chn.classes"
	print ""	>>"S9"
	}
' $chnf

	fi
done

#
#  The Bitnet channel (bitnet links)
#
if [ -f $$.bitnet ]
then
	awk '
BEGIN	{
	print "# Bitnet sites"
	print "R$+@$+.bitnet		$@<$1>$2.bitnet"
	}

/^#/	{  break  }

	{  printf "R$+@%s\t\t$:<$1>%s.bitnet\n", $1, $2  }

END	{
	print ""
	}
' $$.bitnet >>S9

fi

#
#   The UUCP channel
#
if [ -f $$.uucp ]
then
	sed -e '/^#/d' -e '/^$/d' $$.uucp | (sort +1; echo 'x.y z!x!%s') |
	awk '
BEGIN	{
	MINCLSIZE = 3
	classes = "UVWXYZ"
	c = 1
	m = 0
	print "# UUCP sites"						>>"S9"
	print "# convert to uucp addresses and try to find a match"	>>"S9"
	print "R$+@$+			$:$>13$1@$2"			>>"S9"
	print ""							>>"S9"
	}

	{
	i = index($1, ".")
	subdom = substr($1,1,i-1)
	restdom = substr($1,i+1)
	
	p = index($2, subdom)
	ps = subdom "!%s"

	if (p == 1 && $2 == ps)
		direct[restdom] = direct[restdom] " " subdom
	else if (p > 1 && substr($2, p) == ps)
	{	path = substr($2, 1, p-1)
		if (path != lastpath || restdom != lastrest)
		{	if (m >= MINCLSIZE && c <= length(classes))
			{	j = index(lastpath, "!")
				host = substr(lastpath,1,j-1)
				addr = substr(lastpath,j+1)

				rclass = ""
				for (j=1; j<=m; j++)
					rclass = rclass " " sub[j]

				C = substr(classes, c, 1)
				c++
				printf "C%s%s\n", C, rclass	>>"chn.classes"
				printf "R$=%s.%s!$+\t\t$@<%s$1!$2>%s.uucp\n", \
					C, lastrest, addr, host		>>"S9.2"
			}
			else
			{	for (i=1; i<=m; i++)
				{	j = index(lastpath, "!")
					host = substr(lastpath,1,j-1)
					addr = substr(lastpath,j+1) sub[i]
					printf "R%s.%s!$+\t\t$@<%s!$1>%s.uucp\n",\
					  sub[i], lastrest, addr, host	>>"S9.2"
				}
			}
			lastpath = path
			lastrest = restdom
			m = 0
		}
		sub[++m] = subdom
	}
	else
	{	i = index($2, "!")
		host = substr($2,1,i-1)
		addr = substr($2,i+1)
		addr = sprintf(addr,"$1")
		printf "R%s!$+\t\t$@<%s>%s.uucp\n", $1, addr, host	>>"S9.2"
	}
	}

END	{
	for (i in direct)
	{	n = split(direct[i],sub," ")
		if (n >= MINCLSIZE && c <= length(classes))
		{	C = substr(classes, c, 1)
			c++
			printf "C%s%s\n", C , direct[i]	>>"chn.classes"
			printf "R$=%s.%s!$+\t\t$@<$2>$1.uucp\n", C, i	>>"S9"
		}
		else
		{	for (j=1; j<=n; j++)
				printf "R%s.%s!$+\t\t$@<$1>%s.uucp\n", \
					sub[j], i, sub[j]		>>"S9"
		}
	}
	print ""	>>"chn.classes"
	print ""	>>"S9.2"
	print "# no match in uucp - change back to domain style"	>>"S9.2"
	print "R$+!$+			$:$>12$1!$2"			>>"S9.2"
	print ""	>>"S9.2"
	}
'
	cat S9.2 >> S9
	rm -f S9.2
fi

#
#   The Janet channel
#
if [ -f $$.janet ]
then
	awk '
BEGIN	{
	print "# Janet sites"						>>"S9"
	print "# convert domain order to NRS style"			>>"S9"
	print "R$+@$+			$:$>14$1@$2"			>>"S9"
	print ""							>>"S9"
	}

/^#/	{	break	}

	{
	if ( $1 == "uk.ac." $2 )	#  general rule will catch this
		break

	if ( $1 == "uk.co." $2 )	#  general rule will catch this
		break

	printf "R$+@%s\t\t$@<$1>%s.janet\n", $1, $2			>>"S9"
	}

END	{
	print ""	>>"chn.classes"
	print ""							>>"S9"
	print "# pass all other uk addresses to hhmail to route"	>>"S9"
	print "R$+@uk.ac.$+\t\t$@<$1>$2.janet"				>>"S9"
	print "R$+@uk.co.$+\t\t$@<$1>$2.janet"				>>"S9"
	print ""							>>"S9"
	print "# convert domain order back to 822 style"		>>"S9"
	print "R$+@$+			$:$>14$1@$2"			>>"S9"
	print ""							>>"S9"
	}
' $$.janet

fi

#
#   The Bitnet channel (arpa and uucp relaying)
#
if [ -f $$.bitnet ]
then
	cat >>S9 <<'EOF'
# arpa and uucp relays via Bitnet
R$+@$+.arpa		$@<$1@$2.arpa>smtpuser@wiscvm.barpa
R$+@$+.uucp		$@<$1@$2.uucp>uucp@psuvax1.buucp

EOF
fi

#
#   Top Level Domain relaying
#
awk '
BEGIN	{
	print "#"
	print "# top level domain - relaying sites"
	print "#"
	print "# This is a list of default relaying sites for"
	print "# addresses that dont match anything above."
	print "#"
	print ""
	}

/^#/	{  break  }

	{
	if (length($1) < 4)
		tabs = "\t\t\t"
	else
		tabs = "\t\t"
	printf "R$+.%s%s$:$1.%s@%s\n", $1, tabs, $1, $2
	}
' $$.top >> S9

#
#  The header
#
cat > $host.chn <<EOF
###############################################################################
###############################################################################
#####
#####	@(#)$host.chn	UK-1.1 sendmail configuration		22/4/85
#####
#####	The mailer selection and routing
#####
###############################################################################
###############################################################################

# classes
EOF

#
#  the classes
#
while read class group
do
	echo "$group" | fmt | sed "s/^/$class/"
done < chn.classes >> $host.chn

#
#  the rules
#
cat - S9 >> $host.chn <<'EOF'

############################
#  Ruleset 9  --  routing  #
############################

#
#  This rule takes a full domain address and returns a
#  "address@host.network" triple.
#

S9
EOF

cat >> $host.chn <<'EOF'

R$+@$+@$+		$1%$2@$3		address cleanup
R$+			$@$>9$1			retry

EOF

rm -f chn.classes S9 $$.*

echo $host.chn made
exit
SHAR_EOF
if test 6663 -ne "`wc -c MAKE`"
then
echo shar: error transmitting MAKE '(should have been 6663 characters)'
fi
echo shar: extracting README '(2671 characters)'
cat << \SHAR_EOF > README
General
-------
This directory contains per-mailer channel (routing) tables from which
the <host>.chn file can be generated.

In general, these files have a list of domain names on the LHS and
the "host to send to" on the RHS, e.g:

	usc.ac.uk		vax1

which specifies that addresses of the form "user@usc.ac.uk" should
be send to the host "vax1"

However, the actual format of the channel tables depends on the mailer,
(see below) and is determined by the file name.

For example, any file whose name ends with "janet.chn" is assumed to be
a janet mailer channel table.


Channel Table Formats
---------------------
ether.chn  and  luucp.chn:
	These have the format described above; a domain name on the LHS
	and a hostname to send/relay to on the RHS.

uucp.chn:
	This has a slightly different RHS syntax which the same as that
	produced by pathalias(1), e.g.:

		usc.ac.uk		vax2!vax1!%s

	where %s is the user part of the address (converted to uucp form).

janet.chn:
	The LHS domain name is in big-endian form in this table.
	The RHS is a "hostname" to send to.
	If a janet channel table is specified, then by default
	all uk.ac.<name> domains are assumed to be routed to <name>.

bitnet.chn:
	This has the same format as the ether and luucp channel tables.
	If a bitnet channel table is specified, then by default all
	<name>.bitnet domains are routed to <name> (actual routing is done
	by the bitnet mailer).

top.chn:
	This has a domain name on the RHS, for example.:

		ac.uk			ukc.ac.uk

	which states that any address that ends in "ac.uk", which did not
	match a domain name in one of the mailer channel tables, is sent to
	ukc.ac.uk.


Examples
--------
The archive Examples.a contains sample mailer channel files.


How to make the <host>.chn file
-------------------------------
1. Create a mailer channel file for each mailer you have.
   This is best done by extracting sample channel files from Examples.a
   and editing them to contain the relevent data for this host.

2. Run "MAKE host file1 file2... " to create the <host>.chn file. 
   	e.g.   MAKE hwcs luucp.chn ukuucp.chn

   This shell script does a lot of work so be prepared to wait!


Supported Mailers
-----------------
MAKE looks for tables for the following mailers:

	ether.chn	(ethernet)
	luucp.chn	(local uucp)
	uucp.chn	(uucp)
	janet.chn	(janet)
	bitnet.chn	(bitnet)
	top.chn		(top level relaying)

If you have other mailers not listed here, then you will need to add
some code the the MAKE shell script. Good Luck!


Note
----
Make sure that the domains on the RHS of the relaying rules (in top.chn)
eventually match some domain on the LHS of a rule in one of the mailer
channel tables.
SHAR_EOF
if test 2671 -ne "`wc -c README`"
then
echo shar: error transmitting README '(should have been 2671 characters)'
fi
echo shar: extracting Examples.a '(8558 characters)'
cat << \SHAR_EOF > Examples.a
!<arch>
ether.chn       483094477   217   10    100644  170       `
#
# Ethernet channel table
#  The domain name on the LHS is routed to the host on the RHS.
#	
bina.wisdom.bitnet	bina
haskel.wisdom.bitnet	haskel
deya.wisdom.bitnet	deya
luucp.chn       483094477   217   10    100644  170       `
#
# Local UUCP channel table
#  The domain name on the LHS is routed to the host on the RHS.
#	
ra.hwcs.uucp		ra
jove.hwcs.uucp		ra
odin.hwcs.uucp		ra
zeus.hwcs.uucp		ra
uucp.chn        483094477   217   10    100644  1043      `
# UUCP Channel Table
#  The domain name on the LHS is mapped to a path on the RHS.
#  If "%s" is included in the RHS then the user part goes here
#  e.g. jim@hwcs.ac.uk ->  hwcs!%s  -> hwcs!jim
#
cstvax.ed.ac.uk		cstvax!%s
cs.ucl.ac.uk		cstvax!ucl-cs!%s
glasgow.uucp		cstvax!glasgow!%s
paisley.uucp		cstvax!glasgow!paisley!%s
csbstand.uucp		cstvax!glasgow!csbstand!%s
glpsycho.uucp		cstvax!glasgow!glpsycho!%s
glhocus.uucp		cstvax!glasgow!glhocus!%s
dice.uucp		dice!%s
edcaad.uucp		edcaad!%s
gilles.uucp		edcaad!gilles!%s
kcl-cs.uucp		kcl-cs!%s
west44.uucp		kcl-cs!%s
ukc.ac.uk		kcl-cs!ukc!%s
westf.uucp		kcl-cs!westf!%s
mpgraph.uucp		kcl-cs!mpgraph!%s
camjenny.uucp		kcl-cs!camjenny!%s
root44.uucp		kcl-cs!root44!%s
rootis.uucp		kcl-cs!root44!rootis!%s
rootcl.uucp		kcl-cs!root44!rootcl!%s
hirst1.uucp		kcl-cs!hirst1!%s
camsteve.uucp		kcl-cs!camjenny!camsteve!%s
cuedvax.uucp		kcl-cs!camjenny!camsteve!cuedvax!%s
qmc-cs.uucp		kcl-cs!root44!qmc-cs!%s
spider.uucp		spider!%s
ulcs.uucp		ulcs!%s
# everything else goes to ukc for further routing

janet.chn       483094477   217   10    100644  6071      `
#
# Janet channel table
#   The domain name on the LHS is routed to the "host" on the RHS.
#   Note that the domain names on the LHS are in big-endian form.
#
#   Inclusion of this file automatically includes the following default rule:
#	uk.ac.<name>	->	<name>
#	uk.co.<name>	->	<name>
#
#   So, only mappings of, say, sitenames to actual hosts is really necessary
#   (and then only if the mapping is not provided in the NRS directory)
#   e.g.   uk.ac.york		york.minster
#
#   The rest is `optional'.
#
uk.ac.desy.dy.ga           desy.dy.ga
uk.ac.desy.dy.vb           desy.dy.vb
uk.ac.abdn                 abdn
uk.ac.aber.v               aber.v
uk.ac.aston.vaxa           aston.vaxa
uk.ac.aston.vaxb           aston.vaxb
uk.ac.aucc                 aucc
uk.ac.bedford              bedford
uk.ac.bbk.cs               bbk.cs
uk.ac.bbk.cu               bbk.cu
uk.ac.bham.phva            bham.phva
uk.ac.brad.cdc             brad.cdc
uk.ac.brad.comp            brad.comp
uk.ac.brad.eeng            brad.eeng
uk.ac.bris.csa             bris.csa
uk.ac.bris.esa             bris.esa
uk.ac.bris.gsa             bris.gsa
uk.ac.bris.msa             bris.msa
uk.ac.bris.pva             bris.pva
uk.ac.bris.qga             bris.qga
uk.ac.bris.qva             bris.qva
uk.ac.bris.qvb             bris.qvb
uk.ac.bris.qvc             bris.qvc
uk.ac.cam.cl               cam.cl
uk.ac.cam.cl-alvey         cam.cl-alvey
uk.ac.cam.cl-jenny         cam.cl-jenny
uk.ac.cam.cl-ring          cam.cl-ring
uk.ac.cam.cl-steve         cam.cl-steve
uk.ac.cam.cltripos         cam.cltripos
uk.ac.cam.eng-dsl          cam.eng-dsl
uk.ac.cam.eng-icf          cam.eng-icf
uk.ac.cam.eng-44           cam.eng-44
uk.ac.cam.jenny            cam.jenny
uk.ac.cam.phx              cam.phx
uk.ac.cran.cdga            cran.cdga
uk.ac.cran.cdvb            cran.cdvb
uk.ac.cran.cdva            cran.cdva
uk.ac.dund                 dund
uk.ac.dund.duns            dund.duns
uk.ac.uea.cpc.vax          uea.cpc.vax
uk.ac.uea.csa.vax          uea.csa.vax
uk.ac.uea.proteus          uea.proteus
uk.ac.uea.sp               uea.sp
uk.ac.ed                   ed
uk.ac.ed.aigr		   aigr
uk.ac.ed.aiva		   aiva
uk.ac.ed.bush              bush
uk.ac.ed.cstvax            cstvax
uk.ac.ed.ecsvax            ecsvax
uk.ac.ed.edai		   edai
uk.ac.ed.edee              edee
uk.ac.ed.edgr		   edgr
uk.ac.ed.edmrc		   edmrc
uk.ac.ed.edxa		   edxa
uk.ac.ed.emas              emas
uk.ac.ed.epistemi	   epistemi
uk.ac.ed.ercvax            ercvax
uk.ac.ed.eusip		   eusip
uk.ac.ed.geovax            geovax
uk.ac.ed.mcsu              mcsu
uk.ac.ed.mrcvax            mrcvax
uk.ac.ed.phyvax            phyvax
uk.ac.ex.da                ex.da
uk.ac.hull.cs.perq         hull.cs.perq
uk.ac.janet.news           janet.news
uk.ac.janet.nmu            janet.nmu
uk.ac.lancs.vax1           lancs.vax1
uk.ac.lancs.comp           lancs.comp
uk.ac.lancs.eng            lancs.eng
uk.ac.le.sabre             le.sabre
uk.ac.le.star              le.star
uk.ac.lon.arch.cu          lon.arch.cu
uk.ac.lon.educ.cu          lon.educ.cu
uk.ac.lon.neur.cu          lon.neur.cu
uk.ac.lon.pharm.cu         lon.pharm.cu
uk.ac.lon.rvc.cu           lon.rvc.cu
uk.ac.lut.multics          lut.multics
uk.ac.lse.vax1             lse.vax1
uk.ac.lse.vax2             lse.vax2
uk.ac.man.cgu              man.cgu
uk.ac.man.psy              man.psy
uk.ac.nott.vaxa            nott.vaxa
uk.ac.nott.icf             nott.icf
uk.ac.nott.hcig            nott.hcig
uk.ac.ox.prg               ox.prg
uk.ac.ox.prgg              ox.prgg
uk.ac.ox.prgv              ox.prgv
uk.ac.ox.vax1              ox.vax1
uk.ac.ox.vax2              ox.vax2
uk.ac.ox.vax3              ox.vax3
uk.ac.plym.a               plym.a
uk.ac.plym.b               plym.b
uk.ac.plym.d               plym.d
uk.ac.qec.cu               qec.cu
uk.ac.qmc                  qmc
uk.ac.qmc.cs               qmc.cs
uk.ac.rdg.am.cms           rdg.am.cms
uk.ac.rdg.am.uts           rdg.am.uts
uk.ac.rdg.cs               rdg.cs
uk.ac.rdg.micro            rdg.micro
uk.ac.rdg.psych            rdg.psych
uk.ac.rhc.vax              rhc.vax
uk.ac.rl.gb                rl.gb
uk.ac.rl.gd                rl.gd
uk.ac.rl.ge                rl.ge
uk.ac.rl.gf                rl.gf
uk.ac.rl.gk                rl.gk
uk.ac.rl.gm                rl.gm
uk.ac.rl.gr                rl.gr
uk.ac.rl.ib                rl.ib
uk.ac.rl.ic                rl.ic
uk.ac.rl.id                rl.id
uk.ac.rl.qb                rl.qb
uk.ac.rl.pa                rl.pa
uk.ac.rl.pb                rl.pb
uk.ac.rl.pc                rl.pc
uk.ac.rl.pd                rl.pd
uk.ac.rl.pe                rl.pe
uk.ac.rl.pf                rl.pf
uk.ac.rl.pg                rl.pg
uk.ac.rl.ph                rl.ph
uk.ac.rl.va                rl.va
uk.ac.rl.vb                rl.vb
uk.ac.rl.vc                rl.vc
uk.ac.rl.vd                rl.vd
uk.ac.rl.ve                rl.ve
uk.ac.rl.vf                rl.vf
uk.ac.rl.vg                rl.vg
uk.ac.rl.vi                rl.vi
uk.ac.rl.vs                rl.vs
uk.ac.salf.r-d             salf.r-d
uk.ac.salf.r-d-32          salf.r-d-32
uk.ac.co.ga                co.ga
uk.ac.soton.elprq1         soton.elprq1
uk.ac.st-and               st-and
uk.ac.stir.cs              stir.cs
uk.ac.stir.vaxa            stir.vaxa
uk.ac.stir.vaxb            stir.vaxb
uk.ac.swan.cv              swan.cv
uk.ac.swan.cs              swan.cs
uk.ac.ucl.brtl             ucl.brtl
uk.ac.ucl.cs               ucl.cs
uk.ac.ucl.tsperq           ucl.tsperq
uk.ac.ukc		   ukc
uk.ac.uwist.vaxa           uwist.vaxa
uk.ac.uwist.vaxb           uwist.vaxb
uk.ac.uwist.vaxc           uwist.vaxc
uk.ac.uwist.vaxd           uwist.vaxd
uk.ac.uwist.vaxdev         uwist.vaxdev
uk.ac.warwk.daisy          warwk.daisy
uk.ac.warwk.ga             warwk.ga
uk.ac.warwk.pa             warwk.pa
uk.ac.warwk.ubu            warwk.ubu
uk.ac.york                 york.minster
uk.ac.york.abbot           york.abbot
uk.ac.york.canon           york.canon
uk.ac.york.deacon          york.deacon
uk.ac.york.minster         york.minster
uk.ac.york.novice          york.novice

bitnet.chn      483094477   217   10    100644  402       `
#
# Bitnet channel table
#  Actual routing is done by the bitnet mailer itself.
#  Existance of this file automatically includes the following mappings:
#	<any>.bitnet   ->   <any>
#	<any>.arpa     ->   smtpuser@wiscvm   (see bitnetm.m4)
#	<any>.uucp     ->   uucp@psuvax1      (see bitnetm.m4)
#
#  So, only bitnet sites with other domain names should be included here
#  e.g.   ucbjade.cc		ucbjade
#
top.chn         483094477   217   10    100644  331       `
#  Top level domains
#  if address hasn't matched a domain name in any other table then
#  it should match something here. The RHS is a domain which specifies
#  where the message should be relayed for further routing.
#
uk		cs.ucl.ac.uk
uucp		ukc.ac.uk
arpa		ukc.ac.uk
csnet		csnet-relay.arpa
bitnet		wiscvm.arpa
dec		decwrl.arpa

SHAR_EOF
if test 8558 -ne "`wc -c Examples.a`"
then
echo shar: error transmitting Examples.a '(should have been 8558 characters)'
fi
echo shar: done with directory chn
chdir ..
#	End of shell archive
exit 0