🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: comp.mail.sendmail
1 messages
1 total messages Started by Ian Crorie Fri, 20 Jan 1989 15:39
UK-2.1 part 1
#3100
Author: Ian Crorie
Date: Fri, 20 Jan 1989 15:39
1995 lines
50795 bytes
#!/bin/sh
# to extract, remove the header and type "sh filename"
if `test ! -s ./README`
then
echo "Writing ./README"
cat > ./README << '\Rogue\Monster\'

		Sendmail Configuration Package UK-2.1
		======== ============= ======= ======

This package provides you with tools to generates a fully domain based
sendmail configuration file from domain and channel tables in a format
similar to that used by MMDF.

Documentation explaining how to use the package is in the Docs directory.

System V users should use the shellscript 'Support/SysV.sh' to convert
BSD specific commands to System V commands.

-Jim Crammond, Jem Taylor	December 1988

\Rogue\Monster\
else
  echo "Will not over-write ./README"
fi
chmod 444 ./README
if [ `wc -c < ./README` -ne 487 ]
then
echo 'Got' `wc -c < ./README` ', Expected ' 487
fi
if `test ! -s ./Config`
then
echo "Writing ./Config"
cat > ./Config << '\Rogue\Monster\'
#!/bin/sh
#
#  shell script to process a UK-sendmail configuration file and
#  generate a directory containing the relevent m4 files together
#  with a .mc file and Makefile which are used to build a sendmail.cf
#  
if [ $# -ne 1 ]
then
	echo usage: $0 file
	exit 1
elif [ ! -f $1 ]
then
	echo $1: file not found
	exit 1
fi

config=`echo $1 | sed 's/^config.//'`
configfile=$1
domfiles=
dombldargs=
chnfiles=
chnbldargs=

homedir=`pwd`
configdir=$config
tabledir=$config

#
#  transform the configuration file, then read in the resulting file
#
(cat $1; echo) | sed -n '
/#/s/#.*//
/^$/d
: repeat
N
s/\n[	 ][	 ]*//
t repeat
P
D
' > /tmp/config.$$

exec < /tmp/config.$$

#
#  process the configuration file
#
while read cmd arg1 arg2
do
	case $cmd in
	configdir=*|tabledir=*|install=*)
		val=`expr $cmd : '.*/'`
		if [ $val -gt 0 ]
		then
			echo $cmd: must be a subdirectory of this directory
		else
			eval $cmd
		fi
		;;
	config=*|domain=*|postmaster=*)
		eval $cmd
		var=`expr $cmd : '\(.*\)=.*' | tr '[a-z]' '[A-Z]'`
		eval val=$`expr $cmd : '\(.*\)=.*'`
		echo "define(\`$var',\`$val')dnl" >> /tmp/config.$$.mc
		;;
	options=*)
		eval $cmd
		opts=`echo $options | tr '[a-z]' '[A-Z]'`
		oldifs=$IFS ; IFS="," ; set $opts ; IFS=$oldifs

		for i in $*
		do
			echo "define(\`$i')dnl" >> /tmp/config.$$.mc
		done
		;;
	domain)
		if [ "$arg1" != "std" ]
		then
			dombldargs="$dombldargs-$arg1"
		fi

		eval $arg2
		domfiles="$domfiles $file "
		dombldargs="$dombldargs $file "
		;;
	channel)
		chn=`echo $arg1 | tr '[a-z]' '[A-Z]'`
		file=
		ldomain='$J'
		ida=

		oldifs=$IFS ; IFS="," ; set $arg2 ; IFS=$oldifs

		for i in $*
		do
			case $i in
			file=*|ldomain=*)
				eval $i
				;;
			ida)	ida="-ida "
				;;
			sysname=*|pgm=*)
				eval $i
				var=${chn}`expr $i : '\(.*\)=.*' | tr '[a-z]' '[A-Z]'`
				eval val=$`expr $i : '\(.*\)=.*'`
				echo "define(\`$var',\`$val')dnl" >> /tmp/config.$$.mc
				;;
			*)	opt=${chn}`echo $i | tr '[a-z]' '[A-Z]'`
				echo "define(\`$opt')dnl" >> /tmp/config.$$.mc
				;;
			esac
		done

		chnfiles="$chnfiles $file "
		chnbldargs="$chnbldargs$ida-$arg1 $file "

		if [ $arg1 != "top" ]
		then
			echo "define(\`${chn}NAME',\`$ldomain')dnl" >> /tmp/config.$$.mc
		fi
		;;
	esac

done

rm /tmp/config.$$

#
#  add a makefile for compiling tables in the tables directory
#
if [ ! -d $tabledir ]
then
	echo -n "
Making directory $tabledir ... "
	mkdir $tabledir
	if [ $? -ne 0 ]
	then	echo mkdir failed, aborted
		exit 1
	fi
fi

cd $tabledir
echo -n "
creating $tabledir/$config.mk ... "

cat > $config.mk <<EOF
############################################################
#
#	Makefile to compile sendmail tables for $config
#
############################################################

DOMFILES=$domfiles
DOMBLDARGS=$dombldargs

CHNFILES=$chnfiles
CHNBLDARGS=$chnbldargs

$config:	$config-dom.m4 $config-chn.m4

$config-dom.m4:	$(DOMFILES) $config.mk
		../Dombuild -o $config-dom.m4 $(DOMBLDARGS) 

$config-chn.m4:	$(CHNFILES) $config.mk
		../Chnbuild -o $config-chn.m4 $(CHNBLDARGS)

edit:
		\$\${VISUAL-vi} $(CHNFILES)
		\$\${VISUAL-vi} $(DOMFILES)

tidy:
		-rm -f [0-9]*.*

check:		$(CHNFILES) $(DOMFILES)
		../Chncheck $(CHNFILES)
		../Domcheck $(DOMFILES)
EOF

cd $homedir

#
#  create the sendmail configuration directory
#
if [ ! -d $configdir ]
then
	echo -n "
Making directory $configdir ... "
	mkdir $configdir
	if [ $? -ne 0 ]
	then	echo mkdir failed, aborted
		exit 1
	fi
fi

cd $configdir
echo -n "
creating configuration files in $configdir ... "

#
#  copy the relevent m4 files into the directory
#
ar x ../Rules.a

if [ -f localise.sh ]
then	echo -n "
running localise.sh in $configdir ... "
	./localise.sh
fi

#
#  create the Makefile
#
cat >Makefile <<EOF
########################################################################
#
#	Makefile for Sendmail configuration files
#
#	@(#)Makefile	UK-2.1 sendmail configuartion		18/11/88
#
########################################################################
RULES=base.m4 rules.m4 mailers.m4 version.m4

TBLDIR=../$tabledir
DOM_M4FILE=$config-dom.m4
CHN_M4FILE=$config-chn.m4

.SUFFIXES: .mc .cf

.mc.cf:
	-@mv \$*.cf \$*.cf.old
	m4 \$*.mc > \$*.cf

$config:	$(TBLDIR)/$config.mk
		cd $(TBLDIR); make -f $config.mk $config
		make $config.cf

$(TBLDIR)/$config.mk:	../$configfile
		( cd ..; Config $configfile )

$config.cf:	$(RULES) $(DOM_M4FILE) $(CHN_M4FILE) $(TBLDIR)/$config.mk

$(DOM_M4FILE):	$(TBLDIR)/$(DOM_M4FILE)
		cp $(TBLDIR)/$(DOM_M4FILE) .

$(CHN_M4FILE):	$(TBLDIR)/$(CHN_M4FILE)
		cp $(TBLDIR)/$(CHN_M4FILE) .

install:
		sh ../Install.sh $install $config

test:
		/usr/lib/sendmail -bt -C$config.cf

edit check tidy: $(TBLDIR)/$config.mk
		cd $(TBLDIR); make -f $config.mk \$@

diff:		$config.cf $config.cf.old
		wc $config.cf.old $config.cf
		diff $config.cf.old $config.cf
EOF

#
#  create the config.mc file
#
mv /tmp/config.$$.mc $config.mc
cat >> $config.mc <<EOF
include(base.m4)
include(rules.m4)
include($config-dom.m4)
include($config-chn.m4)
include(mailers.m4)
EOF

echo
exit
\Rogue\Monster\
else
  echo "Will not over-write ./Config"
fi
chmod 555 ./Config
if [ `wc -c < ./Config` -ne 5014 ]
then
echo 'Got' `wc -c < ./Config` ', Expected ' 5014
fi
if `test ! -s ./Dombuild`
then
echo "Writing ./Dombuild"
cat > ./Dombuild << '\Rogue\Monster\'
#!/bin/sh
#
#  shell script to generate a sendmail dom-tbl.m4 file containing all
#  the domain information for this site from a set of domain tables.
#

if [ $# -le 1 ]
then	echo	usage: $0 [-ida file] files ... -top file
	exit
fi

rm -f $$.*
outf=dom-tbl.m4
strip="sed -e /#/s/#.*// -e /^\$/d"
classes="ABCEFGHIKLM"
cp /dev/null $$.S10

ida=
top=
rest=

while [ $# -gt 0 ]
do
	case $1 in
	-o)		outf=$2
			shift
			;;
	-ida)		ida="$ida $2"
			shift
			;;
	-top)		top="$top $2"
			shift
			;;
	*)		rest="$rest $1"
			;;
	esac
	shift
done

if [ -n "$ida" ]
then
	set $ida
	dbmfile=`basename $1 .dom`

	$strip $ida | awk '
NF==1	{ $2 = $1; $1 = substr($2, 1, index($2,".")-1) }	# shorthand
	{ print $1 "	" $2 }
	' |  dbm load - $dbmfile

	echo "OKA`pwd`/$dbmfile" > $$.S10
	echo 'R$+@$+		$:$1@$(A $2 $)		lookup db' >> $$.S10
fi

$strip $top | awk '{ printf "%s %s.TOP_LEVEL_DOM\n",$1,$1 }' > $$.top

$strip $$.top $rest | awk '
NR==1	{ MINCLSIZE = 3
	  c = 1
	  S10 = prefix "S10"
	  S11 = prefix "S11"
	  S12 = prefix "S12"
	  S13 = prefix "S13"
	  cl_outd = prefix "classf"
	}
NF==1	{ $2 = $1	# shorthand
	  $1 = substr($2, 1, index($2,".")-1)
	}
	{ i = index($2,".")
	  lpart = substr($2,1,i-1)

	  if ($1 != lpart)
	  	printf "R$*%s\t\t$1%s\n", $1, $2	>> S10
	  else
	  {	rpart = substr($2,i+1)
		domain[rpart] = domain[rpart] " " lpart
		n = split(rpart, doms, ".")
		rparts[rpart] = n
	  }
	}

END	{
	    for (i in rparts)
	    {	order[rparts[i]] = order[rparts[i]] " " i
		if (rparts[i] > maxn)
			maxn = rparts[i]
	    }

	    for (i=1; i <= maxn; i++)
	    {	m = split(order[i], rpts, " ")
		for (j=1; j<=m; j++)
		{   rhs = rpts[j]
	    	    d = split(domain[rhs], subdoms, " ")

		    if (rhs == "TOP_LEVEL_DOM")
			printf "\nCT%s\n", domain[rhs]		>cl_outd
		    else if (d >= MINCLSIZE && c <= length(classes))
		    {	C = substr(classes, c, 1)
			c++
			printf "\nD%s%s\n", C, rhs		>cl_outd
			printf "C%s%s\n", C, domain[rhs]	>cl_outd
			printf "R$*$=%s\t\t\t$@$1$2.$%s\t\tu@d -> u@d.%s\n", \
					C, C, rhs >S11
			printf "R$*$=%s.$%s\t\t$@$1$2\t\tu@d.%s -> u@d\n", \
					C, C, rhs >S12
			printf "R$*$=%s\t\t\t$@$1$2\n", C	>S13
			printf "R$*@$=%s.$+\t\t$@$>9$1@$2.$3\n", C >S13
		    }
		    else
		    {	for (k=1; k<=d; k++)
			{	printf "R$*%s\t\t$@$1%s.%s\n", subdoms[k], \
					subdoms[k], rhs  >S11
				printf "R$*%s.%s\t\t$@$1%s\n", subdoms[k], \
					rhs, subdoms[k]  >S12
				printf "R$*%s\t\t\t$@$1%s\n", \
					subdoms[k], subdoms[k]  >S13
				printf "R$*@%s.$+\t\t$@$>9$1@%s.$2\n", \
					subdoms[k], subdoms[k]  >S13
			}
		    }
		}
	    }
	}
' prefix=$$. classes=$classes -

#
#  The header
#
cat > $outf <<EOF
###############################################################################
#####
#####	@(#)$outf	UK-2.1 sendmail configuration		18/11/88
#####
#####	The domain database and rules
#####
###############################################################################

# classes
EOF

#
#  generate classes
#
while read class group
do
	echo $group | tr ' ' '\012' | fmt | sed "s/^/$class/"
done  < $$.classf >> $outf


#
#  Ruleset 10
#
cat - $$.S10 >> $outf <<'EOF'

##########################################
#  Ruleset 10  --  domain name aliasing  #
##########################################

S10
EOF

#
#  Ruleset 11
#
cat - $$.S11 >> $outf <<'EOF'

########################################################
#  Ruleset 11  --  Expand address to full domain name  #
########################################################

S11
R$*$=T			$@$1$2		already fully qualified
EOF

#
#  Ruleset 12
#
cat >> $outf <<'EOF'

ifdef(`LOCALSHOWUUCP',`
############################################################
#  Ruleset 12  --  Strip full domain name to minimum part  #
############################################################

S12
EOF
( tail -r $$.S12 ; echo "')" ) >> $outf

#
#  Ruleset 13
#
cat - $$.S13 >> $outf <<'EOF'

ifdef(`NRSFORMAT',`
###############################################################
#  Ruleset 13  --  Convert domains in NRS order to 822 order  #
###############################################################

S13
R$*$=T			$@$1$2
R$*@$=T.$+		$@$>9$1@$2.$3
EOF
echo "')" >> $outf

rm -f $$.*
exit
\Rogue\Monster\
else
  echo "Will not over-write ./Dombuild"
fi
chmod 555 ./Dombuild
if [ `wc -c < ./Dombuild` -ne 4163 ]
then
echo 'Got' `wc -c < ./Dombuild` ', Expected ' 4163
fi
if `test ! -s ./Chnbuild`
then
echo "Writing ./Chnbuild"
cat > ./Chnbuild << '\Rogue\Monster\'
#!/bin/sh
#
#  shell script to generate a sendmail chn-tbl.m4 file containing all
#  the routing information for this host from a set of channel tables.
#
if [ $# -le 1 ]
then	echo	"usage: $0 [-o outfile] -chn file..."
	exit
fi

#
#  first, create the awk programs that compile the channel tables
#

rm -f $$.*
outf=chn-tbl.m4

#
#  Standard format channel compiler
#
cat > $$.std.awk <<'EOF'
NR==1	{
	MINCLSIZE = 3
	c = 1
	mailer = substr(mailer, 2)
	cl_outl = prefix "classl"
	cl_outf = prefix "classf"
	printf "\n# %s (%s channel)\n", file, mailer
	}

NF==1	{ $2 = substr($1, 1, index($1,".")-1) }		# shorthand

/%s/	{
	# process wildcards
	lhs = sprintf($1,"$+","$+","$+")
	rhs = sprintf($1,"$2","$3","$4")
	dest = sprintf($2,"$2","$3","$4")
	printf "R$+@%s\t\t$@<$1@%s>%s.%s\n", lhs, rhs, dest, mailer >> S16
	break
	}

	{
	i = index($1, ".")
	subdom = substr($1,1,i-1)
	restdom = substr($1,i+1)

	if (subdom == $2 && restdom != "")
		link["$2/" restdom] = link["$2/" restdom] " " subdom
	else
		link[ $2 "/" restdom ] = link[ $2 "/" restdom ] " " subdom
	}

END	{
	for (i in link)
	{	j = index(i,"/")
		dest = substr(i, 1, j-1)
		rdom = substr(i, j+1)
		n = split(link[i], sub, " ")
		if (n >= MINCLSIZE && c <= length(classes))
		{	C = substr(classes, c, 1)
			c++
			printf "C%s%s\n", C , link[i]	>> cl_outf
			printf "R$+@$=%s.%s\t\t$@<$1@$2.%s>%s.%s\n", \
				C, rdom, rdom, dest, mailer
		}
		else
		{	host = dest
			for (j=1; j<=n; j++)
			{	if (dest == "$2") host = sub[j]
				printf "R$+@%s.%s\t\t$@<$1@%s.%s>%s.%s\n", \
					sub[j], rdom, sub[j], rdom, host, mailer
			}
		}
	}

	print "" >>cl_outf
	print substr(classes, c) > cl_outl
	}
EOF

#
#   Janet channel compiler
#
cat > $$.janet.awk <<'EOF'
NR==1	{
	printf "\n# %s (Janet channel)\n", file
	swap1 = sprintf("R$+@$+\t\t$:$>9$1@$2\t\tconvert to NRS style")
	swap2 = sprintf("R$+@$+\t\t$:$>9$1@$2\t\tconvert back to 822 style")
	}

NF==1	{ $2 = $1 }		# shorthand

/%s/	{
	if (wcnt++ == 0)  print swap1 >> S16

	# process wildcards
	lhs = sprintf($1,"$+","$+","$+")
	rhs = sprintf($1,"$2","$3","$4")
	dest = sprintf($2,"$2","$3","$4")
	if (rhs == dest)
		jntaddr = "$1@" dest
	else
		jntaddr = "$1%" rhs "@" dest
	printf "R$+@%s\t\t$@<%s>%s.janet\n", lhs, jntaddr, dest >> S16
	break
	}

	{
	if (cnt++ == 0)  print swap1

	if ($1 == $2)
		jntaddr = "$1@" $2
	else
		jntaddr = "$1%" $1 "@" $2
	printf "R$+@%s\t\t$@<%s>%s.janet\n", $1, jntaddr, $2
	}

END	{
	if (cnt > 0) print swap2
	if (wcnt > 0) print swap2 >> S16
	}
EOF

#
#  UUCP channel compiler
#
cat > $$.uucp.awk <<'EOF'
NR==1	{
	MINCLSIZE = 3
	c = 1
	link[""]=""
	cl_outl = prefix "classl"
	cl_outf = prefix "classf"
	printf "\n# %s (UUCP channel)\n", file
	printf "R$+@$+\t\t\t$:$>8$1@$2\t\tconvert to uucp addresses\n"
	}

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

	if (NF == 1) $2 = udest		# shorthand

	if (udest == $2)
		link[ "/" restdom ] = link[ "/" restdom ] " " subdom
	else
	{	pathl = length($2) - length(udest)
		if ( substr($2, pathl) == ("!" udest) )
		{	path = substr($2, 1, pathl-1)
			link[ path "/" restdom ] = link[ path "/" restdom ] " " subdom
		}
		else
		{	i = index($2, "!")
			host = substr($2,1,i-1)
			addr = sprintf( substr($2,i+1), "$1")
			printf "R%s!$+\t\t$@<%s>%s.uucp\n", $1, addr, host
		}
	}
	}

END	{
	for (i in link)
	{	j = index(i, "/")
		path = substr(i, 1, j-1)
		rdom = substr(i, j+1)
		p = index(path, "!")
		n = split(link[i], sub, " ")
		if (n >= MINCLSIZE && c <= length(classes))
		{	C = substr(classes, c, 1)
			c++
			printf "C%s%s\n", C, link[i]	>>cl_outf
			if (path == "")
			{	host = "$1"
				addr = ""
			}
			else if (p == 0)
			{	host = path
				addr = "$1!"
			}
			else
			{	host = substr(path,1,p-1)
				addr = substr(path,p+1) "!$1!"
			}
			printf "R$=%s.%s!$+\t\t$@<%s$2>%s.uucp\n", C, rdom, addr, host
		}
		else
		{	for (j=1; j<=n; j++)
			{	if (path == "")
				{	host = sub[j]
					addr = ""
				}
				else if (p == 0)
				{	host = path
					addr = sub[j] "!"
				}
				else
				{	host = substr(path,1,p-1)
					addr = substr(path,p+1) "!" sub[j] "!"
				}
				printf "R%s.%s!$+\t\t$@<%s$1>%s.uucp\n", \
						sub[j], rdom, addr, host
			}
		}
	}
	print "" >>cl_outf
	print substr(classes, c) > cl_outl
	print "\nR$+!$+\t\t\t$:$>7$1!$2\t\tconvert back to 822 style\n"
	}
EOF

#
#  News channel compiler
#
cat > $$.news.awk << 'EOF'
NR==1	{ printf "\n# %s (news channel)\n", file }
	{
	lhs = sprintf($1,"$+","$+","$+")
	rhs = sprintf($1,"$1","$2","$3")
	dest = sprintf($2,"$1","$2","$3")

	if (NF == 1)
		printf "R%s\t\t$@<%s>news\n", lhs, rhs
	else
		printf "R%s\t\t$@$>3 %s@%s\n", lhs, rhs, dest
	}
EOF


#
#  Top level domain relay compiler
#
cat > $$.top.awk <<'EOF'
NR==1	{
	MINCLSIZE = 3
	c = 1
	cl_outl = prefix "classl"
	cl_outf = prefix "classf"
	relay[""] = ""
	}
$1=="DEFAULT" || $1=="$=T"	{ default = $2 ; break }
$1=="ALL" || $1=="$+"		{ all = $2 ; break }

	{ relay[$2] = relay[$2] " " $1 }

END	{
	for (i in relay)
	{	n = split(relay[i], doms, " ")
		if (n >= MINCLSIZE && c <= length(classes))
		{	C = substr(classes, c, 1)
			c++
			printf "C%s%s\n", C, relay[i]	>> cl_outf
			printf "R$+@$+.$=%s\t\t$@$>16$1%%$2.$3@%s\n", C, i
		}
		else
		{	for (j=1; j<=n; j++)
				printf "R$+@$+.%s\t\t$@$>16$1%%$2.%s@%s\n", \
					doms[j], doms[j], i
		}
	}
	if (default)	printf "R$+@$+.$=T\t\t$@$>16$1%%$2.$3@%s\n", default
	if (all)	printf "R$+@$+\t\t$@$>16$1%%$2@%s\n", all

	print "" >>cl_outf
	print substr(classes, c) > cl_outl
	}
EOF

#---------------------------------------

#
#  awk scripts for compiling to ida databases
#
cat > $$.std.ida.awk <<'EOF'
NR==1	{
	mailer = substr(mailer, 2)
	printf "\n# %s (%s channel)\n", file, mailer
	printf "R$+@$+\t\t$:$(%s $2 $@ $1 $: $1@$2 $)\t\tlookup database\n",key
	printf "R<$+>$+.%s\t\t$@<$1>$2.%s\t\tfound a match\n", mailer,mailer
	}
NF==1	{ $2 = substr($1, 1, index($1,".")-1) }		# shorthand
	{ printf "%s\t<%%s@%s>%s.%s\n", $1, $1, $2, mailer > dbmf }
EOF

cat > $$.janet.ida.awk <<'EOF'
NR==1   {
	printf "\n# %s (Janet channel)\n", file
	printf "R$+@$+\t\t$:$>9$1@$2\t\tconvert to NRS style\n"
	printf "R$+@$+\t\t$:$(%s $2 $@ $1 $: $1@$2 $)\t\tlookup database\n",key
	printf "R<$+>$+.janet\t\t$@<$1>$2.janet\t\tfound a match\n"
	}
NF==1	{ $2 = $1 }		# shorthand
	{
	if ($1 == $2)
		jntaddr = "%s@" $2
	else
		jntaddr = "%s%%" $1 "@" $2

	printf "%s\t<%s>%s.janet\n", $1, jntaddr, $2 > dbmf
	}
END     { printf "\nR$+@$+\t\t$:$>9$1@$2\t\tconvert back to 822 style\n" }
EOF


#---------------------------------------

#
#  compile the tables; output goes into various files
#

strip="sed -e /#/s/#.*// -e /^\$/d"
classes="NOPQRSUVWXYZ"
dbkeys="BCDEFHIJ"
cp /dev/null $$.classf

while [ $# -gt 0 ]
do
	case $1 in

	-o)	outf=$2
		;;

	-local)	$strip -e 's/^LHOST\./$=w./' $2 | awk '
		{ printf "R$+@%s\t\t$@$1@$J\n", $1	   >> S15
		  printf "R$+@%s\t\t$@<$1@$J>error\n", $1  >> S17
		}'  S15=$$.S15  S17=$$.S17 -
		;;

	-ether|-tcp|-csnet|-decnet|-xerox)
		$strip $2 | awk -f $$.std.awk mailer=$1 file=$2 prefix=$$. \
			    classes=$classes S16=$$.S16 - >> $$.S17
		classes=`cat $$.classl`
		;;

	-janet)	$strip $2 | awk -f $$.janet.awk file=$2 S16=$$.S16 - >> $$.S17
		;;

	-uucp)	$strip $2 | awk -f $$.uucp.awk file=$2 prefix=$$. \
			    classes=$classes - >> $$.S17
		classes=`cat $$.classl`
		;;

	-news)	$strip $2 | awk -f $$.news.awk file=$2 - >> $$.S18
		;;

	-top)	$strip $2 | awk -f $$.top.awk prefix=$$. \
			    classes=$classes - >> $$.S16
		classes=`cat $$.classl`
		;;

	-ida)	shift
		key=`expr substr $dbkeys 1 1`
		dbkeys=`expr substr $dbkeys 2 26`
		dbmfile=`basename $2 .chn`

		case $1 in
		-janet)	$strip $2 | awk -f $$.janet.ida.awk file=$2 \
				key=$key dbmf=$dbmfile.ida - >> $$.S17
			;;

		*)	$strip $2 | awk -f $$.std.ida.awk mailer=$1 file=$2 \
				key=$key dbmf=$dbmfile.ida - >> $$.S17
			;;
		esac

		dbm load $dbmfile.ida $dbmfile
		echo "OK$key`pwd`/$dbmfile" >> $$.S17
		rm $dbmfile.ida
		;;

	*)	echo "usage: $0 [-o file] -chn file..."
		rm -f $$.*
		exit 1
		;;
	esac
	shift 2
done

#---------------------------------------

#
#  now glue all the bits together
#

#
#  The header
#
cat > $outf <<EOF
###############################################################################
#####
#####	@(#)$outf	UK-2.1 sendmail configuration		18/11/88
#####
#####	The mailer selection and routing
#####
###############################################################################

# classes
EOF

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

#
#  the rules
#
cat - $$.S15 >> $outf <<'EOF'

###########################################
#  Ruleset 15  --  local domain handling  #
###########################################

#
#  This rule converts various forms of local domain names
#  into the standard ($J) name
#

S15
ifdef(`MULTIHOST',
`R$+@$=w.$J		$@$1@$J			host specific name')
EOF

cat - $$.S16 >> $outf <<'EOF'

#############################
#  Ruleset 16  --  routing  #
#############################

#
#  This rule trys to find an "<address>host.network" triple for a given
#  domain address.  Given a domain address "u@a.b.c.d", it calls the
#  channel matcher with u@a.b.c.d, and if nothing matched, it calls
#  the channel matcher again, with "u%a.b.c.d@b.c.d" and  "u%a.b.c.d@c.d".
#  If there's still no match, then the top level domain relaying is done
#  e.g. "u%a.b.c.d@d" -> "u%a.b.c.d@x.y.z" and the rule is retried.
#

S16
R$+@$+			$:$>17$1@$2		initial routing
R<$+>$+			$@<$1>$2		success, return triple

#  initial match failed, retry with successively higher level domains
R<$+@$+>		$:<$1%$2@$2>		u@a.b.c -> u%a.b.c@a.b.c
R<$+@$-.$+>		$>17$1@$3		retry routing
R<$+>$+			$@<$1>$2		success, return triple

#  match failed, attempt to match with "general" rules (wildcards);
#  if this fails then try matching top level domain to find relay domain
R<$+@$->		$:$>4$1			restore original address

EOF

cat - $$.S17 >> $outf <<'EOF'

######################################
#  Ruleset 17  --  channel matching  #
######################################

#
#  This rule takes a full domain address and trys to match it with a
#  domain given on the LHS of a rule.
#  If one matches, the "<address>host.network" triple given on the RHS
#  is returned.  Else  "<address>" is returned.
#

S17
R$+@$J			$@<$1@$J>error		unknown local subdomain error
EOF

#
#  complete ruleset 17
#
cat >> $outf <<'EOF'

R$+			$@<$1>			no match, return "<address>"
EOF

if [ -f $$.S18 ]
then	cat - $$.S18 >> $outf <<'EOF'

#############################################
#  Ruleset 18  --  newsgroup name matching  #
#############################################

#
#  This rule takes a local address and trys to match it with a
#  newsgroup name given on the LHS of a rule.
#  If one matches, the "<name>news" double given on the RHS
#  is returned. If a relayed newsgroup is found, ruleset 3 is
#  re-entered with name@relay. Else  "address" is returned.
#

S18
# send non-local addresses straight back
R$+@$+          	$@$1@$2         	not a local address

EOF
fi

rm -f $$.*
exit
\Rogue\Monster\
else
  echo "Will not over-write ./Chnbuild"
fi
chmod 555 ./Chnbuild
if [ `wc -c < ./Chnbuild` -ne 11085 ]
then
echo 'Got' `wc -c < ./Chnbuild` ', Expected ' 11085
fi
if `test ! -s ./Rules.a`
then
echo "Writing ./Rules.a"
cat > ./Rules.a << '\Rogue\Monster\'
!<arch>
base.m4         600449291   548   22    100444  3075      `
##################################################################
##################################################################
#####
#####		SENDMAIL CONFIGURATION FILE  UK-2.1
#####
##### Copyright (C) November 1988, Jim Crammond, Imperial College
#####				   Jem Taylor, Glasgow University
#####
#####	This configuration file maybe be freely distributed,
#####	provided that this notice and copyright is preserved.
#####	This software is provided as is without any warranty.
#####
##################################################################
##################################################################

##################################################################
`###'	CONFIG configuration file
##################################################################

# offical site domain name
DJ`'DOMAIN

# offical host domain name
ifdef(`MULTIHOST',`Dj$w.$J',`Dj$J')

# uucp hostname
ifdef(`UUCPNAME',DU`'UUCPSYSNAME)

############################################################
#
#	General configuration information
#
############################################################

DVUK-2.1
ifdef(`HISTORY',`include(version.m4)')

##########################
###   Special macros   ###
##########################

# my name
Dn`'POSTMASTER
# UNIX header format
DlFrom $g $d remote from $U
# delimiter (operator) characters (note '~' has been added)
Do.:%@!^=/[]~
# format of a total name
Dq$?x$x <$g>$|$g$.
# SMTP login message
De$j Sendmail $v/$V ready at $b

###################
###   Options   ###
###################

# location of alias file
OA/usr/lib/aliases
# default delivery mode (deliver in background)
Odbackground
# mail to me too (needed for multihost sites)
Om
# (don't) connect to "expensive" mailers
#Oc
# automatically do newaliases when aliases.dbm out of date
#OD
# temporary file mode 
OF0644
# default GID
Og1
# location of help file
OH/usr/lib/sendmail.hf
# log level
OL9
# default messages to old style
Oo
# Cc my postmaster on error replies I generate
#OP`'POSTMASTER
# queue directory
OQ/usr/spool/mqueue
# read timeout -- violates protocols
Or2h
# status file
OS/usr/lib/sendmail.st
# queue up everything before starting transmission
# Os
# default timeout interval
OT3d
# time zone names (V6 only)
# OtGMT,BST
# default UID
Ou1
# wizard's password
OWz3GvK.dPUxieQ
# load averages at which to start queuing/refuse connections
Ox8
OX12
# penalty per recipient
#Oy1000
# memory-poor environmenet
#OY
# boost for high-priority messages
#Oz1800
# penalty for being retried
#OZ0

###############################
###   Message precedences   ###
###############################

Pfirst-class=0
Pspecial-delivery=100
Pjunk=-100

#########################
###   Trusted users   ###
#########################

Troot
Tdaemon
Tuucp
Tmail

#############################
###   Format of headers   ###
#############################

H?F?From: $q
H?D?Date: $a
H?M?Message-Id: <$p.$t@$j>
H?F?Resent-From: $q
H?D?Resent-Date: $b
H?M?Resent-Message-Id: <$p.$t@$j>
HSubject:
HReceived: $?sfrom $s by $j; $b$.
HVia: $?S$S; $b$.
undefine(`unix')

rules.m4        595853294   548   22    100444  6941      `
###############################################################################
###############################################################################
#####
#####	@(#)rules.m4	UK-2.1 sendmail configuration		18/11/88
#####
#####		The rulesets
#####
###############################################################################
###############################################################################

###############################################
#  Ruleset 0  --  Select mailer to be used    #
###############################################
S0

# strip local domain name(s)
R$+@$J			$>3$1			process local part

ifdef(`NEWSNAME',
`#  compare local-part with newsgroup names 
R$+			$:$>18$1		newsgroups in local-part')

# local mail
R$-			$#local$:<$1>		local mail - maybe aliased
R~$-			$#binmail$:<$1>		local mail - no aliasing

#
# convert domain address into "<address>host.network" triple
#
R$+@$+			$:$>16$1@$2		routing and address conversion

#
# select mailer
#

# note that address part ($u) is returned as "<address>"; the brackets are
# subsequently removed in ruleset 4 (or 3 in the case of the smtp channel).
# Such addresses can then be ignored by the header rulesets which are called
# in BSD4.3 based sendmail.

ifdef(`ETHERNAME',
`R<$+>$+.ether		$#ether$@$2$:<$1>	local ethernet mail')
ifdef(`TCPNAME',
`R<$+>$+.tcp		$#tcp@$2$:<$1>		internet mail
R$+@[$+]		$#tcp$@[$2]$:<$1>	pass domain literals to tcp')
ifdef(`UUCPNAME',
`R<~$+>$+.uucp		<\\~$1>$2.uucp		band-aid for uuxqt
R<$+>$+.uucp		$#uucp$@$2$:<$1>	external uucp mail')
ifdef(`JANETNAME',
`R<$+>$+.janet		$#niftp$@$2$:<$1>	janet mail')
ifdef(`NEWSNAME',
`ifdef(`NEWSRELAYED',`',
`R<$+>news		$#news$:<$1>		network news')')
ifdef(`CSNETNAME',
`R<$+>$+.csnet		$#pmdf$@$2$:<$1>	csnet mail')
ifdef(`DECNETNAME',
`R<$+@$+>$+.decnet	$#mail11$@$3$:<$1>	decnet mail')
ifdef(`XEROXNAME',
`R<$+>$+.xerox		$#xerox$@$2$:<$1>	xerox mail')

R<$+>error		$#error$:Local Domain Unknown
R<$+>$+			$#error$:Configuration Error

# anything else with an "@" in is an error
R$+@$+			$#error$:Domain Unknown

# anything else - e.g. filenames, pipes etc goes to local mailer
R$+			$#local$:<$1>		local


###############################################
#  Ruleset 1  --  Sender Field Pre-rewriting  #
###############################################
S1
R$+@$J			$@$1			strip local domain name


##################################################
#  Ruleset 2  --  Recipient Field Pre-rewriting  #
##################################################
S2
R$+@$J			$@$1			strip local domain name


##########################################
#  Ruleset 3  --  Name Canonicalisation  #
##########################################
S3

#  handle special cases
R$-			$@$1			return "user"
R~$-			$@~$1			return "~ user"

#  basic textual canonicalisation
R$*<$*>$*		$2			basic RFC 822 parsing
R$+\ at\ $+		$1@$2			" at " -> "@" for RFC 822
R$+%$+			$1@$2			convert '%'s to '@'s
R$+@$+@$+		$1%$2@$3		then reduce to only one '@'

#  Address conversions.
R@$+:$+			$:$>5@$1:$2		RFC822 to Percent form
R$+::$+			$1!$2			decnet to uucp form
R$+!$+			$:$>7$1!$2		uucp to Percent form
ifdef(`NRSFORMAT',
`R$+@$+.$+		$:$>13$1@$2.$3		NRS ordering to 822 ordering')

#  Domain name expansion.
ifdef(`NAMESERVER',
`R$+@$+			$:$1@$[$2$]		canonical name from nameserver')
R$+@$+			$:$>11$1@$2		expand incomplete domain names
R$+@$+			$:$>10$1@$2		do domain name aliases

R$+@$+			$:$>15$1@$2		standardise local domain name

###############################################
#  Ruleset 4  --  Final Output Post-rewriting #
###############################################

#  header rewriting is done in the per-mailer rulesets.

S4
R<$+>			$:$1			remove brackets from $u addr
R$+@$+			$@$1@$2			already ok

#  this ensures that $u has at least one '@' in (if percent style)
R$+%$+			$1@$2			convert '%'s to '@'s
R$+@$+@$+		$1%$2@$3		then reduce to only one '@'


########################################################
#  Ruleset 5  --  RFC source routing -> Percent style  #
########################################################

#
#  convert a routed address in RFC822 form to Percent form
#  e.g. @ucl-cs.arpa,@kcl-cs.uucp:jim@hwcs.uucp  ->
#					jim%hwcs.uucp%kcl-cs.uucp@ucl-cs.arpa
#
S5

R$+,$+			$1:$2			@a,@b,@c:u%d -> @a:@b:@c:u%d
R$*@$*			$1%$2			@a:@b:@c:u@d -> %a:%b:%c:u%d

R%$+:$+			$:$2@$1			%a:%b:%c:u%d -> %b:%c:u%d@a
R%$+:$+@$+		$2@$1@$3		%b:%c:u%d@a  -> u%d@c@b@a
R$+@$+@$+		$1%$2@$3		u%d@c@b@a    -> u%d%c%b@a

ifdef(`TCPNAME',`
##############################################################
#  Ruleset 6  --  Percent style source routing -> RFC style  #
##############################################################

#
#  convert a routed address in the Percent form to RFC822 form
#  e.g.	jim%hwcs.uucp%kcl-cs.uucp@ucl-cs.arpa  ->
#				@ucl-cs.arpa,@kcl-cs.uucp:jim@hwcs.uucp
#	BEWARE!
#	This ruleset is only safe to use for transport addr in SMTP headers
#	because we cannot determine whether to add brackets and a phrase
#
S6

R$+@$+			$1%$2			u%d%c%b@a    -> u%d%c%b%a
R$+%$+%$+		$:@$3:$1@$2		u%d%c%b%a    -> @c%b%a:u@d
R$+%$+:$+		@$2:$1:$3		@c%b%a:u%d   -> @a:@b:@c:u@d
R$+:$+:$+		$1,$2:$3		@a:@b:@c:u@d -> @a,@b,@c:u@d
')

###############################################################
#  Ruleset 7  --  uucp style source routing -> Percent style  #
###############################################################

#
#  convert an address in uucp form to Percent form
#  e.g. kcl-cs.uucp!hwcs.uucp!jim -> jim%hwcs.uucp@kcl-cs.uucp
#
#  also converts mixed addresses, giving '@' and '%' priority over '!'
#  e.g. hwcs!jim%kcl-cs.uucp@ucl-cs.arpa -> jim%hwcs%kcl-cs.uucp@ucl-cs.arpa
#
S7

# handle mixed addresses (with '!'s, '@'s and maybe '%'s in)
R$+!$+%$+		$1!$2@$3		c!d!u%b@a -> c!d!u@b@a
R$+!$+@$+		$2@$1@$3		c!d!u@b@a -> u@d@c@b@a

# handle pure uucp addresses
R$+!$+			$:$2@$1			a!b!c!d!u -> b!c!d!u@a
R$+!$+@$+		$2@$1@$3		b!c!d!u@a -> u@d@c@b@a

R$+@$+@$+		$1%$2@$3		u@d@c@b@a -> u%d%c%b@a

###############################################################
#  Ruleset 8  --  Percent style to uucp style source routing  #
###############################################################

#
#  convert a Percent style address to uucp (domain1!domain2!user) form
#  e.g. jim%hwcs.uucp@kcl-cs.uucp -> kcl-cs.uucp!hwcs.uucp!jim
#
S8

R$+%$+			$1@$2			u%d%c%b@a -> u@d@c@b@a
R$+@$+			$:$2!$1			u@d@c@b@a -> d@c@b@a!u
R$+@$+!$+		$2!$1!$3		d@c@b@a!u -> a!b!c!d!u

ifdef(`NRSFORMAT',`
#####################################################
#  Ruleset 9  --  NRS <-> RFC822 domain conversion  #
#####################################################

#
# swap the order of the sub-domains around.
# e.g. steve@uk.ac.ucl-cs.44d => steve@44d.ucl-cs.ac.uk
#
# this assumes that no colons will appear in the rhs of the domain address
#
S9

R$*@$+.$+		$1@$2:$3		u@a.b.c.d -> u@a:b:c:d
R$*@$-:$+		$:$1@$3.$2		u@a:b:c:d -> u@b:c:d.a
R$*@$-:$+.$+		$1@$3.$2.$4		u@b:c:d.a -> u@d.c.b.a
')

mailers.m4      595853944   548   22    100444  6204      `
###############################################################################
###############################################################################
#####
#####	@(#)mailers.m4	UK-2.1 sendmail configuration		18/11/88
#####
#####		The Mailer specifications
#####
###############################################################################
###############################################################################


####################################################################
###
###		Local and Program Mailer specification
###
####################################################################

Mlocal,   P=/bin/mail, F=rnlsmFD, S=20, R=20, A=mail -d $u 
Mbinmail, P=/bin/mail, F=rnlsmFD, S=20, R=20, A=mail -d $u 
Mprog,    P=/bin/sh,   F=nlsFD,   S=20, R=20, A=sh -c $u 

S20
R<$+>			$@<$1>			return transport addr

R~$+			$1			remove '~' in To: line
R$+@[$+]		$@$1@[$2]		domain literals

ifdef(`LOCALSHOWUUCP',
`# we assume an address is a uucp address if it contains more than two
# hostnames (as opposed to domain names). This is not always right..
R$+%$-%$-@$+		$:$>12$1%$2%$3@$4	strip outer domain name
R$+%$-%$-@$+		$@$>8$1%$2%$3@$4	convert to uucp address')

ifdef(`LOCALSHOWNRS',
`R$+@$-.$+		$@$>9$1@$2.$3		convert to NRS ordering')

ifdef(`LOCALSHOWLDOMAIN',
`R$+@$+			$@$1@$2			return non-local address
ifdef(`LOCALSHOWNRS',
`R$+			$@$>9$1@$J		add local domain - NRS style',
`R$+			$@$1@$J			add local domain - 822 style')')

ifdef(`ETHERNAME',`
###################################################################
###
###		Ethernet Mailer specification
###
###################################################################

Mether,	P=[IPC], F=nsmFDMuXC, S=21, R=21, A=IPC $h

S21
R$+@$+			$@$1@$2			address ok
R$+			$@$1@ETHERNAME		add ether domain name')

ifdef(`TCPNAME',`
###################################################################
###
###		TCP Mailer specification
###
###################################################################

Mtcp,	P=[IPC], F=nsmFDMuXL, S=22, R=22, A=IPC $h, E=\r\n 

#
#  header addresses are kept in percent style, rather than 822 style as
#  sendmail can not produce a correct routed 822 address from another style
#
S22
R<$+>			$@$>6$1			transport addr in 822 style

R$+@$+			$@$1@$2			address ok
R$+			$@$1@TCPNAME		add tcp domain name')

ifdef(`UUCPNAME',`
###################################################################
###
###		UUCP Mailer specification
###
###################################################################

ifdef(`UUCPMUUCP',`
Muucp, F=nsmFDMuh, S=23, R=23, M=100000, ifdef(`UUCPAUTH',`
	P=/usr/lib/authorise, A=authorise uucp $g $h /usr/lib/uucp/',`
	P=/usr/lib/uucp/muucp, A=')muucp -r -gA -f$f@UUCPNAME -H$U $h $u

#
#  RFC 976 style.  Note, however, that addresses are kept in percent style,
#  rather than 822 style as sendmail can not produce a correct routed 822
#  address from another style
#
S23
R<$+>			$@<$1>			return transport addr

R$+@$+			$@$1@$2			address ok
R$+			$@$1@UUCPNAME		add uucp domain name',`
Muucp, F=sFDMuh, S=23, R=23, M=100000, ifdef(`UUCPAUTH',`
	P=/usr/lib/authorise, A=authorise uucp $g $h /usr/bin/',`
	P=/usr/bin/uux, A=')uux - -r -gA $h!rmail ($u)

#
#  Addresses are converted back to uucp style.
#
S23
R<$+>			$@<$1>			return transport addr

R$+@$+			$:$>8$1@$2		convert to uucp style
R$+!$+			$@$1!$2			address ok
R$+			$@UUCPNAME!$1		add uucp domain name')')

ifdef(`JANETNAME',`
###################################################################
###
###		Janet Mailer specification
###
###################################################################

ifdef(`JANETHHSEND',`
Mniftp, F=nsmFDMxu, S=24, R=24, M=100000, ifdef(`JANETAUTH',`
	P=/usr/lib/authorise, A=authorise janet $g $h /usr/lib/x25/',`
	P=/usr/lib/x25/hhsend, A=')hhsend $h $u',`
Mniftp, F=SnsmFDMxu, S=24, R=24, M=100000, ifdef(`JANETAUTH',`
	P=/usr/lib/authorise, A=authorise janet $g $h /usr/lib/niftp/',`
	P=/usr/lib/niftp/ni_send, A=')ni_send -f $g $h $u')

S24
R<$+>			$@<$1>			return transport addr

R$+@$+			$@$>9$1@$2		RFC822 -> NRS style

R$+			$:$1@JANETNAME		add janet domain name
R$+@$+			$@$>9$1@$2		RFC822 -> NRS style')

ifdef(`NEWSNAME',`
###################################################################
#####
#####           News Mailer specification
#####
###################################################################
ifdef(`NEWSRELAYED',`
# This host forwards all news messages to a relay',`
Mnews, P=/usr/lib/news/mail-news, F=nlsmFDMPuh, S=25, A=inews -f $g -n $u -h

S25
R<$+>			$@<$1>			return transport addr
R$+@$+			$@$1@$2			address ok
R$+			$@$1@NEWSNAME		add local domain')')

ifdef(`CSNETNAME',`
###################################################################
###
###		CSNet PhoneNet Mailer specification
###
###################################################################

Mpmdf, F=nsmFDM, S=26, R=26, M=100000, ifdef(`CSNETAUTH',`
	P=/usr/lib/authorise, A=authorise csnet $g $h /usr/local/lib/pmdf/',`
	P=/usr/local/lib/pmdf/pmdf-submit, A=')pmdf-submit -f $g $u

S26
R<$+>			$@<$1>			return transport addr

R$+@$+			$@$1@$2			address ok
R$+			$@$1@CSNETNAME		add csnet domain name')

ifdef(`DECNETNAME',`
###################################################################
#####
#####           DECNET Mailer specification
#####
###################################################################

Mmail11, F=nsmFDM, S=27, R=27, M=100000, ifdef(`DECNETAUTH',`
	P=/usr/lib/authorise, A=authorise decnet $g $h /usr/bin/',`
	P=/usr/bin/mail11, A=')mail11 $f $x $h $u

S27
R<$+>			$@<$1>			return transport addr
R$+@$+			$:$>8$1@$2		convert to uucp style
R$+!$+			$1::$2			and then to decnet style
#R$+			$@DECNETNAME::$1	add local decnet name')

ifdef(`XEROXNAME',`
###################################################################
#####
#####           Xerox Ethernet Mailer specification
#####
###################################################################

Mxerox, F=nsmFDSEuX, S=28, R=28, M=100000, ifdef(`XEROXAUTH',`
	P=/usr/lib/authorise, A=authorise xerox $g $h /usr/lib/',`
	P=/usr/lib/mxerox, A=')mxerox $u

S28
R$+@$+                  $@$1@$2                 address ok
R$+			$@$1@XEROXNAME		add local domain')
version.m4      596036916   548   22    100444  4451      `
#
#	@(#)version.m4	UK-2.1 sendmail configuration		18/11/88
#

#
#	UK-2.1  18/11/88	jim + jem
#	Ruleset 16 general rules replaced by "wildcard" matching rules
#	generated from the tables.
#	Added support for news channel and decnet and xerox mailers.
#	Janet channel can use niftp or hhcp. Removed support for bitnet mail.
#	Included various BSD4.3 options. Defined optional long Received header.
#	Catch configuration errors in S0.  Miscellaneous bugs fixed.
#
#	UK-2.0	28/8/88		jim
#	COMMENTS:
#	Experimental version. Ruleset 15 now returns normalised local domain
#	name ($J). This is called by S3; S0 now calls S3 iff domain is $J.
#	S1 strips $J so mailer specific local domain is always added.
#	Domain expansion (S11) is reworked - only explicit table entries are
#	expanded making the sorting simpler and more correct.
#	Support for nameserver and ida database lookup added.
#	Reworked handling of transport addresses through header rulesets -
#	they are enclosed in angle brackets which are removed in S4 (or S3). 
#	Received/Via fields now generated according to whether $s or $S is set.
# 	Added support for TCP channel (for Internet).
#	Janet channel now uses niftp rather than hhcp. Domain literal
#	support now moved to TCP channel (niftp doesn't allow them).
#
#	UK-1.4a 9/10/86		jim
#	COMMENTS:
#	Band-aid for BSD4.3 (& Sun 3.0). The transport address goes through
#	the header rulesets (big sigh) so have to do a kludge for uucp.
#	$a -> $b in Resent-Date field: this seems to be what you want.
#	change to $q: don't emit angle brackets if full name is unknown.
#	Applied similar BSD4.3 band-aid to the janet channel on 6/5/87.
#
#	UK-1.4  12/2/86		jim
#	COMMENTS:
#	Added code to catch unknown local subdomains as errors.
#	Added support for CSNet PhoneNet mailer.
#	Merged barpa and buucp mailers into one bsmtp mailer (bitnet).
#	Delay use of bitnet general rule in the same way as for janet.
#	Added Message-Id header specification; generated for non-local mail.
#	Changed local mailer specification to give fully qualified names
#	except on uucp bang paths where domain is stripped.
#	Changed "-f" argument to muucp from $f to $g.
#	Changed "h" mailer flag to "u" in Janet mailer.
#
#	UK-1.3  8/9/85		jim
#	COMMENTS:
#	Delay use of general rule for janet mailer until no specific
#	rule matches in uk domain.
#	NRS domain order handling now ifdef-ed NRSFORMAT; thus separating
#	it from Janet mailer specific code
#	Domain literals now accepted & passed to Janet mailer.
#	Set "metoo" option. Helps with multihost sites that talk SMTP.
#	Set "x" & "X" options (load averages) for newer versions of sendmail
#
#	UK-1.2	9/6/85		jim
#	COMMENTS:
#	Bug fix: SMTP won't talk between local hosts of a multihost site.
#	use $J to define site domain name, $j is the host domain name.
#	Renumbered rulesets:
#		Rulesets  0 -  4 :	basic rulesets
#		Rulesets  5 -  9 :	address conversions
#		Rulesets 10 - 13 :	domain name handling
#		Rulesets 15 - 17 :	channel routing
#		Rulesets 20 - 25 :	mailer specifications
#	Reorganised channel routing to allow multiple names for local domain
#	and to retry the main routing ruleset, with higher level domains
#	when no match is found, before trying top level domain relaying.
#	Each mailer channel can now have a different local domain name
#	(default is official name - $J).  Multihost stuff simplified.
#	New uucp front end program replaces uux. Produces the correct from line.
#	
#
#	UK-1.1	22/4/85		jim
#	COMMENTS:
#	Changed janet rules in ruleset 3 to cope properly with domain expansion.
#	Changed output of ruleset 9 (channel ruleset) so that ruleset 0
#	can parse multiple-token hostnames.  Support files for janet added.
#	Renamed janet mailer to "hhcp". Added 'n' mailer flag to prog mailer.
#	Added ruleset 8 to detect and convert NRS style domains to 822 style.
#
#	UK-1.0	26/3/85		jim
#	COMMENTS:
#	Some rearranging. Removed ruleset 8 (path optimisation) as it
#	optimised munged addresses away completely! 
#	Ruleset 4 ensures an '@' in Percent style address.
#	Uucp ruleset rewritten to get as close to the uucp transmission
#	standard as sendmail allows.
#
#	HW-5.0	26/2/85		jim
#	COMMENTS:
#	major restructuring: rewrote ruleset 3 which now converts
#	all addresses to one style. Added bitnet mailer and ether mailer
#	Rewrote all the mailer specs. Various other cleanups.
#
#	HW-4.0	5/12/84		jim
#	COMMENTS:
#	This is a complete rewrite based on some ideas borrowed from
#	mmdf.
#

\Rogue\Monster\
else
  echo "Will not over-write ./Rules.a"
fi
chmod 444 ./Rules.a
if [ `wc -c < ./Rules.a` -ne 20922 ]
then
echo 'Got' `wc -c < ./Rules.a` ', Expected ' 20922
fi
if `test ! -s ./Domcheck`
then
echo "Writing ./Domcheck"
cat > ./Domcheck << '\Rogue\Monster\'
#!/bin/sh
#
#	Domcheck - Check UK-Sendmail domain data files for obvious blunders
#
#	Copyright (c) 1988 Jem Taylor
#

if [ $# -lt 1 ]
then	echo	usage: $0 files...
	exit
fi

for i in $@
do
	sed -e 's/#.*//' -e '/^$/d' $i | awk '
BEGIN	{ bad=0; ok=1; format=ok }
/%s[ 	.]/||/%s$/ { printf "%s: line %d - %%s has no meaning in DOMAIN data\n", file, NR 
	  format=bad
	}
NF>2	{ printf "%s: line %d - %d columns of data\n", file, NR, NF
	  format=bad
	}
/[][<>|\\*(){}~`";:,?\/]/ {
	  printf "%s: line %d - bogus character\n", file, NR
	  format=bad
	}
	{ for ( i=1 ; i <=2 ; i++ )
	  {	if (substr($i,1,1)==".")
	  	{	printf "%s: line %d - leading dot column %d\n",\
					file, NR, i
			format=bad
		}
		if ( substr($i,length($i),1) == "." )
		{	printf "%s: line %d - trailing dot column %d\n",\
					file, NR, i
			format=bad
		}
	  }
	  if ( format == bad )
	  {	print "	" $0
	  	format=ok
	  	errval++
	  }
	}
END	{ if ( errval > 0 )
		printf "%d errors detected\n", errval
	  exit errval
	} ' file=$i -
done

# delete everything from first whitespace or first dot in domain declarations
duplicates=`sed -e '/^#/d' -e '/^$/d' $@ \
| awk '{ if (index($1,".")==0 && $1==substr($2,1,index($2,".")-1)) print $2 }'\
| sed -e 's/[. 	].*//' | sort | uniq -d`

if [ -n "$duplicates" ]
then
	echo '
================ Domain entries duplicated or conflicting ================'
	for i in $duplicates
	do
		echo "
--------------		$i		--------------"
		grep "^$i[. 	]" $@ | sed 's/:/:	/'
	done
	exit 99
fi
\Rogue\Monster\
else
  echo "Will not over-write ./Domcheck"
fi
chmod 555 ./Domcheck
if [ `wc -c < ./Domcheck` -ne 1491 ]
then
echo 'Got' `wc -c < ./Domcheck` ', Expected ' 1491
fi
if `test ! -s ./Chncheck`
then
echo "Writing ./Chncheck"
cat > ./Chncheck << '\Rogue\Monster\'
#!/bin/sh
#
#	Chncheck - syntax check UK-Sendmail channel tables for obvious errors.
#	Returns the number of errors found.
#
#	Copyright (c) 1988 Jem Taylor
#


if [ $# -lt 1 ]
then	echo	usage: $0 files...
	exit
fi
for i in $@
do
	sed -e 's/#.*//' -e '/^$/d' $i | awk '
BEGIN	{ bad=0; ok=1; format=ok }
NF>2	{ printf "%s: line %d - %d columns of data\n", file, NR, NF
	  format=bad
	}
/[][<>|\\(){}~`";:,?\/]/ {
	  printf "%s: line %d - bogus character\n", file, NR
	  format=bad
	}
	{ for ( i=1 ; i <=2 ; i++ )
	  {	if (substr($i,1,1)==".")
	  	{	printf "%s: line %d - leading dot column %d\n",\
					file, NR, i
			format=bad
		}
		if ( substr($i,length($i),1) == "." )
		{	printf "%s: line %d - trailing dot column %d\n",\
					file, NR, i
			format=bad
		}
	  }
	  if ( format == bad )
	  {	print "	" $0
	  	format=ok
	  	errval++
	  }
	}
END	{ if ( errval > 0 )
		printf "%d errors detected\n", errval
	  exit errval
	} ' file=$i -
done

#janet chan tends to blow this up because top domain is at front - adjust
#the 'ignore' list to suit your janet.chn; if you have no janet chan then
#delete the ignore list altogether. If you prefer, just exit here:
#exit

# delete everything after the first whitespace
duplicates=`sed -e '/^#/d' -e '/^$/d' -e 's/[ 	].*//' $@ | sort | uniq -d`

exitcode=0
if [ -n "$duplicates" ]
then	for i in $duplicates
	do	case $i in
		uk|com|edu|us|ie|irl|nz|au|gov|uucp|arpa|dk|se|no|earn)
			;;
		*)	echo "
---------	$i : duplicate or conflict	---------"
			egrep "^$i\$|^$i[ 	]" $@ | sed -e 's/:/:	/'
			echo
			exitcode=99
			;;
		esac
	done
	exit $exitcode
fi
\Rogue\Monster\
else
  echo "Will not over-write ./Chncheck"
fi
chmod 555 ./Chncheck
if [ `wc -c < ./Chncheck` -ne 1596 ]
then
echo 'Got' `wc -c < ./Chncheck` ', Expected ' 1596
fi
if `test ! -s ./Install.sh`
then
echo "Writing ./Install.sh"
cat > ./Install.sh << '\Rogue\Monster\'
#!/bin/sh
# install a new sendmail configuration file on a host on the network
# produce a freeze file and start a new daemon
# if -f is specified, a freeze file is not made.
# if -n is specified, only the daemon is started.
# if -s is specified, the remote host is assumed to have SysV ps.


dofreeze=true
docopy=true
bsd=true
verbose=+x

while [ $# -ge 1 ]
do
	case $1 in
	-f)	dofreeze=false
		;;
	-n)	docopy=false
		;;
	-s)	bsd=false
		;;
	-v)	verbose=-x
		;;
	*)	host=$1
		if [ $# -eq 2 ]
		then
			file=$2
			shift
		else
			file=$1.cf
		fi
		break
		;;
	esac
	shift
done

if [ $# -ne 1 ]
then
	echo 'usage: Install.sh [-f] [-n] [-s] host [file]'
	exit 1
fi


if $docopy
then
#
#	copy configuration file.  If successful, freeze it; otherwise
#	the host is probably down - remove the cf file and quit
#
	if (set $verbose; rcp $file $host:/usr/lib/sendmail.cf)
	then
		if $dofreeze
		then
			(set $verbose; rsh $host -n /usr/lib/sendmail -bz)
		fi
	else
		echo "$0: failed for $host - quitting"
		exit 1
	fi
fi

#
# kill off current sendmail daemon and start a new one
#
if $bsd
then
	pid=`rsh $host -n ps -ax | awk ' { if ($5 == "/usr/lib/sendmail" && $6 == "-bd") print $1 }'`
else
	pid=`rsh $host -n ps -ef | awk '/[0-9]:[0-9][0-9] \/usr\/lib\/sendmail -bd/ { print $2 }'`
fi

if [ "$pid" -gt 1 ]
then
	(set $verbose; rsh $host -n kill $pid)
	sleep 1
fi

(set $verbose; rsh $host -n /usr/lib/sendmail -bd -q1h)

exit 0
\Rogue\Monster\
else
  echo "Will not over-write ./Install.sh"
fi
chmod 555 ./Install.sh
if [ `wc -c < ./Install.sh` -ne 1425 ]
then
echo 'Got' `wc -c < ./Install.sh` ', Expected ' 1425
fi
echo "Finished archive 1 of 4"
exit
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads