#!/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
t next
: next
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
