#!/bin/sh

#
# by Jan Kr"uger <Jan.Krueger@unix-ag.uni-hannover.de>
#

# this script can be used to generate multiple access databases
# adjust it to your needs

# source files:
# access - sendmail access.db used for all maps
# envelope_only - check only the envelope against this
# relay_only - check only the relay against this (ie for dialins)
# header_only - check only the header against this
#
# The (ingnored) RHS for spam_friends or haters is added by this script
# If there is no RHS in the access files, REJECT is added as default
# Subnets can be specified with 1.2.3.4/N syntax

DBDIR=/etc/mail/db
DBSRC=/etc/mail
DBTYPE=hash
# adjust this to friends or haters
FRIENDHATER=haters

# convert_subnets()
# convert mask/bits format into "subnet"-IPs
# unused bits in mask must be 0
# e.g. 128.1.1.1/1 does not work. Use 128.0.0.0/1
convert_subnets () {
nawk '
/^[0-9].*\/[0-9]+/ {
	split($1, subs, "/")
	ipbase = ""
	i = 1
	split(subs[1], byte, ".")
	for(bits = subs[2]; bits > 8; bits -= 8)
		ipbase = ipbase byte[i++] "."
	
	if(bits == 8)
		print ipbase byte[i]
	else
		for(ii = 0; ii < 2**(8 - bits); ii++)
		{
			$1 = ipbase (ii + byte[i])
			print
		}
	next
}
{ print }'
};

# add_default_rhs
# adds RHS "REJECT" if there is none
add_default_rhs () {
awk '
{
	if($1 != "" && $2 == "")
		print $1, "REJECT"
	else
		print
}'
};

# make spam_friends/haters
awk '{print $1, "x"}' $DBSRC/spam_$FRIENDHATER | \
	makemap $DBTYPE $DBDIR/spam_$FRIENDHATER

# make access from access and envelope_only
cat $DBSRC/access $DBSRC/envelope_only | \
	convert_subnets | add_default_rhs | \
	makemap $DBTYPE $DBDIR/access

# make relay_access from access and relay_only
cat $DBSRC/access $DBSRC/relay_only | \
	convert_subnets | add_default_rhs | \
	makemap $DBTYPE $DBDIR/relay_access

# make header_access from access and header_only
cat $DBSRC/access $DBSRC/header_only | \
	convert_subnets | add_default_rhs | \
	makemap $DBTYPE $DBDIR/header_access
