#!/bin/sh

# set -x

#
# Configurateur de sendmail.cf pour les laboratoires de jussieu.fr
# ou d'ailleurs.
#
# Auteurs :
#   Jacky Thibault (jt@ccr.jussieu.fr)
#   Pierre David (pda@prism.uvsq.fr)
#
# Historique
#   91/04/03 : pda/jt : conception
#   91/11/28 : pda/jt : version 1.2   : migration de la liaison bitnet du CCR
#   92/01/29 : pda/jt : version 1.3   : adaptation a sendmail 5.65 et a IBM
#   92/07/17 : pda/jt : version 1.4   : simplification
#   93/01/26 : pda/jt : version 1.4   : remplacement de D par M pour IBM
#   93/02/02 : pda/jt : version 1.5   : renommage des regles 8, 9 et 29
#   93/06/09 : pda    : version 1.6   : parametrage du site (pas jussieu en dur)
#   93/11/26 : pda    : version 1.7   : adaptation a sendmail V8
#   93/11/26 : pda    : version 1.7   : fusion des sendmail.cf
#   93/11/26 : pda    : version 1.7   : ajout des revaliases
#   94/05/03 : pda/jt : version 2.0   : generalisation
#   94/06/23 : pda/jt : version 2.1   : corrections
#   94/12/08 : pda/jt : version 2.1   : correction du bug dans la regle 16
#   94/12/08 : pda/jt : version 2.1   : retrait de canonisation superflue ds S19
#   94/12/19 : pda/jt : version 2.1   : retrait de la variable dbm
#   94/12/19 : pda/jt : version 5.1   : version homogene a celle du sendmail.cf
#   95/02/07 : pda    : version 5.1.1 : correction d'un pb dans les ad. int.
#   95/03/08 : pda    : version 5.1.2 : correction signalee par R. Negaret
#   95/06/28 : pda/jt : version 5.1.3 : revaliases multi-domaines
#   95/11/07 : pda/jt : version 5.2   : conversion pour sendmail 8.7
#   95/11/07 : pda/jt : version 5.2   : disparition des adresses *.uucp
#   96/01/18 : pda/jt : version 5.2   : changement du relais bitnet
#   96/01/18 : pda/jt : version 5.2   : recherche de cpp
#   96/02/01 : pda    : version 5.2   : ajout de SendmailHf et Mqueue
#   96/02/08 : pda/jt : version 5.2   : ajout de MailerLocal
#

# Certains systemes ne mettent pas cpp a l'endroit habituel (/lib/cpp)
# /lib          : toutes les machines classiques
# /usr/ccs/lbin : HP-UX 10.x
# /usr/ccs/lib  : Solaris 2.x
# /usr/libexec  : BSD 4.4 (FreeBSD)
# /usr/bin      : Linux

LCPP="/bin /usr/bin /lib /usr/lib /usr/ccs/lbin /usr/ccs/lib /usr/libexec"
CPP=""
for i in $LCPP
do
    if [ -f $i/cpp ]
    then
	CPP=$i/cpp
	break
    fi
done

if [ -z "$CPP" ]
then
    echo "Le preprocesseur du langage C (cpp) est utilise," >&2
    echo "mais il n'est pas trouve sur votre machine." >&2
    echo "Editez le fichier 'configurateur' et modifiez la variable CPP" >&2
    echo "qui se trouve en debut." >&2
    exit 1
fi

##############################################################################
# Premiere option :
# - utiliser un fichier de regles du site separe et l'appeler ici.
##############################################################################

# #
# # Syntaxe : configurateur fichier-regles fichier-configuration
# #
# 
# if [ $# != 2 -o ! -f "$1" -o ! -f "$2" ]
# then
#     echo "usage : $0 fichier-regles fichier-configuration"		>&2
#     exit 1
# fi
# 
# #
# # Les scripts sont executes dans le contexte du shell courant et pas dans
# # un sous-shell. Ceci necessite l'execution par la commande "." (point).
# #
# 
# #
# # Executer le fichier de configuration
# # (donner les variables de la station)
# #
# chmod +x $2
# . $2
# 
# #
# # Executer le fichier de regles du site
# # (traduire les variables de la station en fonction des variables
# # de bas niveau du configurateur)
# #
# chmod +x $1
# . $1

##############################################################################
# fin de la premieme option
##############################################################################

##############################################################################
# Deuxieme option :
# - integrer un fichier de regles du site a cet endroit et donner ainsi
#   un package simple d'emploi.
# - dans ce cas :
#	commentez la premiere option ci-dessus (pas d'appel de fichier separe),
#	decommentez les lignes ci-dessous
#	inserez vos regles a l'endroit indique ci-dessous
##############################################################################

#
# Syntaxe : configurateur fichier-configuration
#

if [ $# != 1 -o ! -f "$1" ]
then
    echo "usage : $0 fichier-configuration"				>&2
    echo "Il faut un fichier de configuration."			>&2
    echo "Recopiez le fichier exemple.config qui vous a ete fourni"	>&2
    echo "et modifiez le pour l'adapter a votre site"			>&2
    exit 1
fi

#
# Les scripts sont executes dans le contexte du shell courant et pas dans
# un sous-shell. Ceci necessite l'execution par la commande "." (point).
#

#
# Executer le fichier de configuration de la station.
# (donner les variables de la station)
#
chmod +x $1
. $1
#
#
# METTEZ VOTRE SCRIPT (REGLES DU SITE) A CET ENDROIT
#

#!/bin/sh

#
# Regles correspondant au site jussieu.fr
#
# Un mailhost de domaine	mailhost.jussieu.fr
# Un mailhost par laboratoire	mailhost.labo.jussieu.fr
# 	qui garde ou pas le courrier de tout (ou partiellement) le labo
# Des feuilles avec ou sans courrier local
#
# Signature homogene pour certains labos : Prenom.Nom@labo.jussieu.fr
# faite au niveau des mailhosts de labo.
#
# Les courriers depuis l'exterieur passent par shiva, puis sont retransmis
# vers le mailhost de laboratoire qui les reroute eventuellement
# via /etc/aliases ou selon le nom de machines
# Tout courrier provenant d'une machine d'equipe (feuille ou mailhost)
# est envoye au mailhost de laboratoire pour reecriture eventuelle du "From:".
#

#
# Le nom du site.
#

# SITE=votre-domaine.fr
# SITE=uvsq.fr
SITE=jussieu.fr

#	INTERPRETATION DU FICHIER XXX.CONFIG

#	Host= (defini)

#	Labo= (defini)

Domaine=$Labo.$SITE

#	Mailhost=o/n

case "$Mailhost" in

# Si c'est le mailhost du labo

     o)	Mailhost=LABO
	RelaisExterieur=mailhost.$SITE

#	SpoolCommun=o/n

	case "$SpoolCommun" in
	     o)	AdressesLocales=TOUT_DOMAINE
		AdressesInternes=RIEN
		;;
	     n)	AdressesLocales=DOMAINE
		AdressesInternes=ETOILE_DOMAINE
		;;
	     *)	echo "Variable SpoolCommun mal initialisee"
		exit 1
		;;
	esac

#	SpoolMachines= (liste)

	case "$SpoolMachines" in
	    "")	;;
	     *)	if [ "$SpoolCommun" = o ]
		then
			AdressesLocales=LISTE
			AdressesInternes=ETOILE_DOMAINE
			ListeAdressesLocales="$SpoolMachines"
		else
			echo "Incoherence entre SpoolCommun et SpoolMachine"
			exit 1
		fi
		;;
	esac

#	FromLabo=o/n

	case "$FromLabo" in
	     o)	ReecritureAdressesLocales=$Domaine
		ReecritureAdressesInternes=$Domaine
		;;
	     n)	ReecritureAdressesLocales=$Host.$Domaine
		ReecritureAdressesInternes=
		;;
	     *)	echo "Variable Fromlabo mal initialisee"
		exit 1
		;;
	esac

#	FromLaboMachines= (liste)

#	Cette liste est la pour des raisons historiques.
#	En realite, si elle est non-vide, son contenu est
#	suppose etre le meme que celui de SpoolMachines. 

	case "$FromLaboMachines" in
	    "")	;;
	     *)	if [ "$FromLabo" = o ]
		then
			ReecritureAdressesInternes=
		else
			echo "Incoherence entre FromLabo et FromLaboMachines"
			exit 1
		fi
		;;
	esac

	;;

# Si c'est une feuille du labo

     n)	Mailhost=FEUILLE
	AdressesInternes=RIEN
	RelaisExterieur=mailhost.$Domaine

#	ToutEnvoyer

	case "$ToutEnvoyer" in
	     o)	AdressesLocales=RIEN
		;;
	     n)	AdressesLocales=HOST
		;;
	     *)	echo "Variable ToutEnvoyer mal initialisee"
		exit 1
		;;
	esac

	;;

# Si c'est du genre inconnu

    *) echo "Variable Mailhost mal initialisee"
       exit 1
       ;;
esac

#	Variables "systemes"

#	Aliases

#	SendmailSt

#	V8=o/n

case "$V8" in
    o) ;;
    n) V8=''
       ;;
    *) echo "Variable V8 mal initialisee"
       exit 1
       ;;
esac

#	RevAliases= (nom)

# On pourrait ici faire une verification de l'existence du dit fichier mais
#	- il peut ne pas encore exister au moment de la configuration
#	- il peut exister sur la machine destinatrice de ce sendmail.cf.


##############################################################################
# fin de la deuxieme option
##############################################################################

#
# Variables (macros cpp) du configurateur sendmail.cf
#
# - Host
#	type : chaine
#	exemple : shiva
#	signification :
#	   le nom de host (sans le nom de domaine)
#
# - Domaine
#	type : chaine
#	exemple : labo.jussieu.fr
#	signification :
#	   le nom de domaine officiel
#
# - ListeDomaines
#	type : liste
#	exemple : labo labo.jussieu labo.jussieu.fr
#	signification :
#	   les noms abreges de notre domaine, ainsi que ses aliases
#	   Note : les noms abreges sont calcules automatiquement a partir
#		du contenu de la variable "Domaine".
#	   Note : si on donne des aliases, ils sont ajoutes.
#
# - AdressesLocales
#	type :
#	 - RIEN : aucun courrier n'est local
#	 - HOST : on reconnait machine.domaine
#	 - DOMAINE : on reconnait domaine en plus de machine.domaine
#	 - TOUT_DOMAINE : on reconnait *.domaine et domaine
#	 - LISTE : liste d'adresses (necessite variable ListeAdressesLocales)
#	 - LISTE_DOMAINE : liste d'adresses (cf LISTE) et DOMAINE
#	exemple :
#	 - mailhost de jussieu : DOMAINE
#	 - mailhost de labo sans redistribution interne : TOUT_DOMAINE
#	 - mailhost de labo avec redistribution interne simple : DOMAINE
#	 - mailhost de labo avec redistribution interne complexe : LISTE_DOMAINE
#	 - mailhost d'equipe : LISTE
#	 - feuille sans spool local : RIEN
#	 - feuille avec spool local : HOST
#	signification :
#	   quelles sont les adresses considerees comme devant rester
#	   sur cette machine.
#
# - ListeAdressesLocales
#	type : liste de chaines
#	exemple :
#	 - si AdressesLocales = LISTE
#	   - mailhost de labo avec redistribution interne compliquee :
#		labo.jussieu.fr m1.labo.jussieu.fr m2.labo.jussieu.fr ...
#		(le courrier destine a labo, a m1 et a m2 reste local)
#	signification :
#	   Cette variable n'existe que quand AdressesLocales = LISTE
#	   Elle precise les adresses des courriers devant rester sur notre
#	   spool local
#
# - AdressesInternes
#	type : mot-clef
#	 - RIEN : aucune redistribution interne (aucune machine "en-dessous")
#	 - ETOILE_DOMAINE : toute adresse dans mon domaine (*.domaine)
#	 - LISTE : les adresses specifiques dans mon domaine
#	exemple :
#	 - mailhost de jussieu : LISTE
#	 - mailhost de labo avec redistribution interne compliquee : LISTE
#	 - mailhost de labo avec redistribution interne simple : ETOILE_DOMAINE
#	 - mailhost de labo sans redistribution interne : RIEN
#	 - feuille : RIEN
#	signification :
#	   quelles sont les adresses considerees comme de la redistribution
#	   interne ?
#	   cela permet d'aiguiller ces courriers vers le mailer smtp-interne
#	   et de signer (champ From) differemment eventuellement.
#	   Les adresses locales ont ete reconnues avant les adresses internes.
#
# - ListeAdressesInternes
#	type : liste de chaines
#	exemple :
#	 - si AdressesInternes = LISTE
#	   - mailhost de jussieu : ccr lptl ... vishnu ...
#	   - mailhost de labo avec redistribution interne compliquee : m1 m2 ...
#		(un courrier vers m1 ou m2 est transmis a m1 ou m2)
#	signification :
#	   Cette variable n'existe que quand AdressesInternes = LISTE
#	   Elle precise les adresses des courriers devant etre redistribues
#	   dans notre juridiction en ouvrant une connexion SMTP directe.
#
# - RelaisExterieur
#	type : variable definie (chaine) ou non definie
#	exemple :
#	 - mailhost de jussieu : <non definie>
#	 - mailhost de labo : definie/valeur=mailhost.jussieu.fr
#	 - feuille de labo : definie/valeur=mailhost.labo.jussieu.fr
#	signification :
#	   si non definie, on envoie les courriers exterieurs :
#		- Internet : directement en SMTP via les MX
#		- UUCP : obsolete (c'est a l'utilisateur de fournir
#			explicitement une adresse avec une passerelle
#			comme machin%ailleurs.uucp@uu.net)
#		- BITNET : directement en SMTP via notre relais BITNET
#	   si definie, on envoie les courriers exterieurs au relais designe
#
# - MailhostEnInterne
#	type : variable definie ou non definie
#	exemple :
#	 - mailhost de jussieu : definie
#	 - mailhost de labo : non definie
#	signification :
#	   si cette variable est definie, tout courrier classe "interne"
#	   sera envoye a mailhost.<sous-domaine>.domaine
#
# - V8
#	type : variable definie ou non definie
#	exemple :
#	 - la variable est definie seulement si le binaire est V8
#	signification :
#	   cette variable est utilisee pour plusieurs options, et surtout
#	   la possibilite d'utiliser ou non les MX records.
#
# - MailerLocal
#	type : liste
#	exemple :
#	 - '/bin/mail DFMPlmnrs mail -d $u'		(bcp de systemes)
#	 - '/bin/rmail DFMPlms rmail -d $u'		(HP-UX)
#	 - '/bin/bellmail DFMPlmns mail $u'		(AIX <= 3.2)
#	 - '/usr/libexec/mail.local lsDFMrmn mail -d $u'  (BSD 4.4)
#	 - '' si AdressesLocales = RIEN (une valeur bidon est mise par defaut)
#	signification :
#	   - champ 1 : executable pour les courriers locaux (Path=...)
#	   - champ 2 : flags (Flags=...)
#	   - champs 3 et suivants : arguments de l'executable (Argv=...)
#
# - Aliases
#	type : (methode optionnelle :) nom de fichier
#	exemple :
#	 - /etc/aliases sur Sun, etc.
#	 - /usr/lib/aliases sur HP-UX <= 9, etc.
#	 - nis:aliases en utilisant les NIS
#	signification :
#	   acces aux aliases
#	note :
#	   la syntaxe est : "methode:fichier"
#		avec "methode" = hash, dbm ou nis
#		et "fichier" est le nom d'une map NIS si la methode est "nis".
#	   la partie "methode:" (avec le ":") est optionnelle
#		la methode par defaut est "hash" si sendmail V8 compile avec
#		libdb.a, ou dbm sinon
#	   la methode ne peut etre specifiee que si on utilise V8.
#
# - SendmailSt
#	type : nom de fichier
#	exemple :
#	 - /etc/sendmail.st sur Sun, etc.
#	 - /usr/lib/sendmail.st sur HP, etc.
#	signification :
#	   localisation du fichier de statistiques de sendmail
#	note :
#	   ce fichier peut ne pas exister sur votre machine. S'il n'existe
#	   pas, sendmail n'y touche pas.
#
# - SendmailHf
#	type : nom de fichier
#	exemple :
#	 - /usr/lib/sendmail.hf sur HP, etc.
#	 - /usr/share/lib/sendmail.hf sur BSD 4.4
#	signification :
#	   localisation du fichier d'aide SMTP de sendmail
#
# - Mqueue
#	type : nom de repertoire
#	exemple :
#	 - /usr/spool/mqueue sur Sun, etc.
#	 - /var/mqueue sur BSD 4.4
#	signification :
#	   localisation du repertoire des courriers en attente de depart
#
# - RevAliases
#	type : variable definie (methode + nom de fichier) ou non definie
#	exemple :
#	   hash -N /usr/local/etc/revaliases
#	   dbm /usr/local/etc/revaliases
#	   nis revaliases
#	signification :
#	   si cette variable est definie, elle indique la localisation du
#	   fichier des conversions user@host -> Prenom.Nom@domaine
#	   si cette variable n'est pas definie, aucune conversion n'est
#	   effectuee
#	note :
#	   cette option necessite V8.
#	note :
#	   les trois methodes possibles sont :
#		hash -N		(conseille si sendmail compile avec libdb.a)
#		dbm		(si sendmail pas compile avec libdb.a)
#		nis		(si vous cherchez a avoir des ennuis)
#
# - TableRoutages
#	type : variable definie (methode + nom de fichier) ou non definie
#	exemple :
#	   hash -N /usr/local/etc/routes
#	   dbm /usr/local/etc/routes
#	signification :
#	   si cette variable est definie, elle indique la localisation du
#	   fichier des routages explicites. Chaque ligne contient :
#		domaine:	mailer.relais
#	   exemple :
#		frmug.fr.net:		uucp.frmug
#		oldlabo.jussieu.fr:	smtp.[mailhost.newlabo.jussieu.fr]
#	note :
#	   pour reconstruire ce fichier, faire :
#		sendmail -bi -oA/usr/local/etc/routes
#	note :
#	   apres toute modification de ce fichier, il faut arreter et
#	   relancer sendmail (car il y a lecture d'une classe en plus de
#	   la consultation d'une "map" compilee).
#	note :
#	   si on utilise le mailer smtp, il faut utiliser [...]
#	   autour du relais afin d'eviter l'utilisation des MX.
#	note :
#	   cette option necessite V8.
#	note :
#	   les deux methodes possibles sont :
#		hash -N		(conseille si sendmail compile avec libdb.a)
#		dbm		(si sendmail pas compile avec libdb.a)
#
# - ReecritureAdressesLocales
#	type : chaine
#	exemple :
#		cezanne.prism.uvsq.fr
#	signification :
#	   contient l'adresse signee par sendmail dans le champ "From:"
#	   pour les courriers venant de notre machine ou assimilee
#	   (cf. definition de AdressesLocales).
#	note :
#	   cette variable interagit avec RevAliases, puisque on peut
#	   dans une certaine mesure simuler ReecritureAdressesLocales a
#	   partir de RevAliases, mais la specification des donnees
#	   de RevAliases doit etre faite au niveau de chaque utilisateur,
#	   ce qui est lourd.
#
# - ReecritureAdressesInternes
#	type : chaine
#	exemple :
#		prism.uvsq.fr
#	signification :
#	   contient l'adresse signee par sendmail dans le champ "From:"
#	   pour les courriers venant de notre juridiction, mais pas de
#	   de notre machine ou assimilee (cf. definition de AdressesInternes).
#	note :
#	   cette variable interagit avec RevAliases, puisque on peut
#	   dans une certaine mesure simuler ReecritureAdressesInternes a
#	   partir de RevAliases, mais la specification des donnees
#	   de RevAliases doit etre faite au niveau de chaque utilisateur,
#	   ce qui est lourd.
#
# - SansDNS
#	type : variable définie ou non
#	exemple :
#	   - la variable est définie seulement si binaire V8 et pas de DNS
#	signification :
#	   les binaires V8 considerent que si le DNS n'est pas joignable,
#	   il s'agit d'une erreur et le courrier est mis en file d'attente.
#	   Ce comportement est genant pour des sites qui n'utilisent
#	   pas le DNS (y en a t'il vraiment ?).
#	   Dans ce cas, il faut definir cette variable.
#

OPT=""

#
# Verification de l'existence et de la coherence de certaines variables
#

if echo "$Domaine" | grep '\.' > /dev/null
then :
else
    echo "Variable Domaine mal initialisee" >&2
    exit 1
fi
if [ "$Host" = "" ]
then
    echo "Variable Host necessaire" >&2
    exit 1
fi
if [ "$Aliases" = "" ]
then
    echo "Variable Aliases necessaire" >&2
    exit 1
fi
if [ "$SendmailSt" = "" ]
then
    echo "Variable SendmailSt necessaire" >&2
    exit 1
fi
if [ "$SendmailHf" = "" ]
then
    echo "Variable SendmailHf necessaire" >&2
    exit 1
fi
if [ "$Mqueue" = "" ]
then
    echo "Variable Mqueue necessaire" >&2
    exit 1
fi
if [ "$MailhostEnInterne" != o -a "$MailhostEnInterne" = n ]
then
    echo "Variable MailhostEnInterne mal initialisee" >&2
    exit 1
fi

case "$AdressesLocales" in
    RIEN)		MailerLocal='/bin/mail DFMPlmnrs mail -d $u' ;;
    HOST)		;;
    DOMAINE)		;;
    TOUT_DOMAINE)	;;
    LISTE)		;;
    LISTE_DOMAINE)	;;
    *)
	echo "Variable AdressesLocales mal initialisee" >&2
	exit 1
	;;
esac

case "$AdressesInternes" in
    RIEN)		;;
    ETOILE_DOMAINE)	;;
    LISTE)		;;
    *)
    	echo "Variable AdressesInternes mal initialisee" >&2
	exit 1
	;;
esac

if [ "$AdressesInternes" != RIEN -a "$RelaisExterieur" = "" -a "$V8" != o ]
then
    echo "AdressesInternes != RIEN suppose un sendmail SANS MX" >&2
    echo "RelaisExterieur vide        suppose un sendmail AVEC MX" >&2
    echo "Vous n'avez pas sendmail V8, vous ne pouvez pas le faire" >&2
    exit 1
fi

#
# Traitement des variables "booleennes"
#

if [ "$V8" = o ]
then OPT="$OPT -DV8"
fi
if [ "$RelaisExterieur" != "" ]
then OPT="$OPT -DRelaisExterieur=$RelaisExterieur"
fi
if [ "$SansDNS" != "" ]
then
    if [ "$V8" != o ]
    then
	echo "L'option SansDNS necessite la version 8 de sendmail" >&2
	exit 1
    fi
    OPT="$OPT -DSansDNS"
fi

#
# Traitement des variables "liste"
# Si la variable commence par un "/", c'est un nom de fichier
#
for v in ListeAdressesLocales ListeAdressesInternes
do
    eval x=\$$v				# x est le contenu de la variable
    if expr "$x" : '/.*' > /dev/null	# teste si / en debut de contenu
    then OPT="$OPT -DFichier${v}=$x"	# ajouter -DFichier...=...
    fi
done

#
# Traitement du mailer local
#

if [ "$MailerLocal" = "" ]
then
    echo "Variable MailerLocal necessaire" >&2
    exit 1
else
    set $MailerLocal
    if [ $# -lt 4 ]
    then
	echo "Variable MailerLocal mal initialisee" >&2
	exit 1
    fi
    MailerLocalProg="$1"
    MailerLocalFlags="$2"
    shift ; shift	# on pourrait faire un shift 2, mais est-ce portable ?
    MailerLocalArgv="$*"
fi

#
# Traitement des variables non booleenes.
# Pour celles pouvant etre vides, on met un symbole special pour dire
# que la liste est vide.
#

if [ "$RevAliases" != "" ]
then
    if [ "$V8" != o ]
    then
	echo "L'option RevAliases necessite la version 8 de sendmail" >&2
	exit 1
    fi
    OPT="$OPT -DRevAliasesDefini"
fi
if [ "$TableRoutages" != "" ]
then
    if [ "$V8" != o ]
    then
	echo "L'option TableRoutages necessite la version 8 de sendmail" >&2
	exit 1
    fi

    fichier=`expr "$TableRoutages" : ".* \(.*\)"`
    OPT="$OPT -DTableRoutagesDefini -DFichierTableRoutages=$fichier"
fi
if [ "$MailhostEnInterne" = "o" ]
then OPT="$OPT -DMailhostEnInterne"
fi

if [ "$ReecritureAdressesLocales" != "" ]
then OPT="$OPT -DReecritureAdressesLocales=$ReecritureAdressesLocales"
fi
if [ "$ReecritureAdressesInternes" != "" ]
then OPT="$OPT -DReecritureAdressesInternes=$ReecritureAdressesInternes"
fi

#
# Traitement des variables de type "mot-clef"
# Pour maximiser la portabilite vis-a-vis de cpp, on remplace le mot-clef
# par une valeur numerique.
#

v=1
for i in RIEN HOST DOMAINE TOUT_DOMAINE LISTE LISTE_DOMAINE ETOILE_DOMAINE
do
    eval $i=$v
    OPT="$OPT -D$i=$v"
    v=`expr $v + 1`
done

eval AdressesLocales=$AdressesLocales
eval AdressesInternes=$AdressesInternes

OPT="$OPT -DAdressesLocales=$AdressesLocales"
OPT="$OPT -DAdressesInternes=$AdressesInternes"

#
# Calculs automatiques de quelques variables
#

# ListeDomaines peut deja contenir des choses, donc on ne l'initialise
# pas a 0.
# La boucle suivante donne tous les noms de domaines possibles a partir
# du nom de domaine officiel.
# Exemple : prism.uvsq.fr => "prism prism.uvsq prism.uvsq.fr"
x=`echo $Domaine | awk -F. '	{
				    for (i = 1 ; i <= NF ; i++)
				    {
					d = ""
					for (j = 1 ; j <= i ; j++)
					    if (d == "")
						d = $j
					    else
						d = d "." $j
					printf "%s ", d
				    }
				}' -`
ListeDomaines="$ListeDomaines $x"

#
# Lancement de cpp
#

$CPP $OPT \
	-DHost="$Host" \
	-DDomaine="$Domaine" \
	-DListeDomaines="$ListeDomaines" \
	-DAliases="$Aliases" \
	-DRevAliases="$RevAliases" \
	-DTableRoutages="$TableRoutages" \
	-DSendmailSt="$SendmailSt" \
	-DSendmailHf="$SendmailHf" \
	-DMqueue="$Mqueue" \
	-DListeAdressesLocales="$ListeAdressesLocales" \
	-DListeAdressesInternes="$ListeAdressesInternes" \
	-DMailerLocalProg="$MailerLocalProg" \
	-DMailerLocalFlags="$MailerLocalFlags" \
	-DMailerLocalArgv="$MailerLocalArgv" \
	<<'EOF' \
   | sed -e '/^#/d' -e 's/^_//' | uniq | sed -e '/MARQUEUR/s/  *//g' -e 's/MARQUEUR//'

#define	concat(a,b)MARQUEUR a b
_#
_# Le sendmail.cf de Host.Domaine
_#
_# Renseignements, reclamations sur ce fichier sendmail.cf :
_#	mail Postmaster@Domaine
_#
_# Renseignements, reclamations sur le kit de generation de sendmail.cf :
_#	mail Jacky.Thibault@ccr.jussieu.fr, ou
_#	mail Pierre.David@prism.uvsq.fr
_#

_###############################################################################
_#				MAILERS
_###############################################################################

_#
_# Les flags des mailers (seuls les plus importants) :
_#	a : (v8) utilise ESMTP
_#	A : (sauf v8) le mailer est compatible ARPANET
_#	C : si le mailer recoit une adresse sans "@", il ajoute le domaine
_#	D : le mailer attend une ligne "Date:" dans le header
_#	e : le mailer coute cher et les courriers attendent dans la file
_#	E : (v8) remplacer les "From" par des ">From" dans le corps du message
_#	f : le mailer attend le flag "-f" dans le cas d'un forward
_#	F : le mailer attend une ligne "From:" dans le header
_#	g : (v8) le mailer ne sait pas accepter une adresse de retour nulle
_#	h : case-sensitive pour les noms de site
_#	I : le mailer communique par SMTP avec un autre sendmail
_#	l : mailer local
_#	L : limite la longueur des lignes (cf RFC 821) (obsolete par v8)
_#	m : le mailer peut envoyer plusieurs utilisateurs en une seule operation
_#	M : le mailer attend une ligne "Message-Id:" dans le header
_#	n : ne pas inserer une ligne "From" aux messages
_#	p : met le return path sous forme d'une "source route"
_#	P : le mailer attend une ligne "Return-Path:" dans le header
_#	r : idem f, mais envoie le flag "-r"
_#	s : enleve les quotes autour des adresses avant d'appeler le mailer
_#	S : ne change pas le user-id avant d'appeler le mailer
_#	u : case-sensitive pour les noms d'utilisateur
_#	U : le mailer attend une ligne "From" dans le style "uucp"
_#	X : utilise l'algorithme "hidden dot" (cf RFC 821)
_#	x : le mailer attend une ligne "Full-Name:" dans le header
_#	7 : (v8) tronque les caracteres a 7 bits
_#

_#
_# Mailer "smtp" : connections SMTP
_#   Flags :
_#	C : ajoute le domaine si pas de "@" dans l'adresse
_#	D : le mailer attend une ligne "Date:" dans le header
_#	F : le mailer attend une ligne "From:" dans le header
_#	M : le mailer attend une ligne "Message-Id:" dans le header
_#	X : utilise l'algorithme "hidden dot" (cf RFC 821)
_#	a : (v8) utilise ESMTP (si pas v8, ce flag est ignore)
_#	m : le mailer peut envoyer plusieurs utilisateurs en une seule op.
_#	s : enleve les quotes autour des adresses
_#	u : case sensitive pour les noms d'utilisateur
_#

#ifdef V8
#define Relais	[$R]
Msmtp,		Path=[IPC], Flags=CDFMXamsu, Eol=\r\n, Linelimit=990,
		Sender=11, Recipient=21, Argv=IPC $h
#else					/* V8 */
#define Relais	$R
Msmtp,		Path=[IPC], Flags=CDFMXamsu, Eol=\r\n,
		Sender=11, Recipient=21, Argv=IPC $h
#endif					/* V8 */

#ifdef TableRoutagesDefini
_#
_# Mailer "buggysmtp" : connections SMTP vers les sites qui
_# violent la RFC 821 et refusent les connexions debutant avec
_# EHLO (ce qui annonce de l'Extended-SMTP, ou ESMTP).
_# Theoriquement, il ne devrait pas y avoir de tels sites dans
_# l'Internet, mais il y en a de temps a autre.
_#
_# Pour gerer ces problemes au cas par cas, ce mailer est
_# defini. Il n'est jamais appele directement dans ce sendmail.cf,
_# mais il peut figurer dans la table des routages explicites
_# pour un site donne. Par exemple :
_#	vieux.site.bugge:        buggysmtp.[vieux.site.bugge]
_# C'est tres laid, mais ca peut rendre service...
_#

Mbuggysmtp,	Path=[IPC], Flags=CDFMXmsu, Eol=\r\n, Linelimit=990,
		Sender=11, Recipient=21, Argv=IPC $h
#endif					/* TableRoutagesDefini */


_#
_# Mailer "local" : delivre les mails locaux
_#   Flags :
_#	D : le mailer attend une ligne "Date:" dans le header
_#	F : le mailer attend une ligne "From:" dans le header
_#	M : le mailer attend une ligne "Message-Id:" dans le header
_#	P : le mailer attend une ligne "Return-Path:" dans le header
_#	l : ce mailer est local, utilise pour l'expedition finale
_#	m : le mailer peut envoyer plusieurs utilisateurs en une seule operation
_#	n : ne met pas de ligne "From"
_#	r : idem f, mais envoie le flag "-r"
_#	s : enleve les quotes autour des adresses
_#   Note : le nom "local" est impose
_#

_#
_#   Attention : sur certaines versions d'HP-UX (8.0 par exemple), les
_#	flags "n" et "r" doivent etre retires.
_#

Mlocal,		Path=MailerLocalProg,	Flags=MailerLocalFlags,
		Sender=10, Recipient=20, Argv=MailerLocalArgv

_#
_# Mailer "prog" : utilise pour les aliases/forward conduisant a des programmes
_#   Flags :
_#	D : le mailer attend une ligne "Date:" dans le header
_#	F : le mailer attend une ligne "From:" dans le header
_#	M : le mailer attend une ligne "Message-Id:" dans le header
_#	P : le mailer attend une ligne "Return-Path:" dans le header
_#	e : ce mailer coute cher
_#	l : ce mailer est local, utilise pour l'expedition finale
_#	s : enleve les quotes autour des adresses
_#	u : case-sensitive pour les noms d'utilisateur
_#   Pas de dependances de machines.
_#   Note : le nom "prog" est impose
_#
_# Attention en v8 : pour etre autorise a executer le .forward, le shell
_# de l'utilisateur doit etre enregistre dans /etc/shells. Si l'utilisateur
_# ne doit pas avoir son shell dans /etc/shells, inclure la ligne :
_#	/SENDMAIL/ANY/SHELL/ (ne pas oublier le "/" terminal).
_# (telle quelle) dans ce fichier.
_#

#ifdef V8
Mprog,		Path=/bin/sh, Flags=DFMPelsu, Directory=$z:/,
		Sender=10, Recipient=20, Argv=sh -c $u
#else					/* V8 */
Mprog,		Path=/bin/sh, Flags=DFMPelsu,
		Sender=10, Recipient=20, Argv=sh -c $u
#endif					/* V8 */

_#
_# Mailer "uucp" : utilise pour des connections "exceptionnelles"
_#   Flags :
_#	D : le mailer attend une ligne "Date:" dans le header
_#	F : le mailer attend une ligne "From:" dans le header
_#	M : le mailer attend une ligne "Message-Id:" dans le header
_#	e : ce mailer coute cher
_#	h : case-sensitive pour les noms de site
_#	m : le mailer peut envoyer plusieurs utilisateurs en une seule operation
_#	s : enleve les quotes autour des adresses
_#	u : case-sensitive pour les noms d'utilisateur
_#   Pas de dependances de machines.
_#   Note : le nom "prog" est impose
_#

Muucp,		Path=/usr/bin/uux, Flags=DFMhmsu,
		Sender=12, Recipient=22, Argv=uux - -r $h!rmail ($u)

_#
_# Mailer "error" : il est defini automatiquement
_#

_###############################################################################
_#				MACROS LOCALES
_###############################################################################

_#
_# Le host
_#
concat(DH,Host)

_#
_# Le domaine :
_# - la variable M contient le nom de domaine officiel
_# - la classe M (differente de la variable M) contient les noms abreges
_#
concat(DM,Domaine)
CM ListeDomaines

_#
_# Les parametres de l'expedition vers l'exterieur
#ifdef RelaisExterieur
_# On envoie tout a notre relais.
_#

concat(DR,RelaisExterieur)
#else
_# On utilise les MX, donc pas de relais vers l'Internet
_# En revanche, il nous faut un relais BITNET :
_#   - B : la liste des pseudo-top-level domains de bitnet
_#   - Z : la passerelle vers le monde BITNET.
_#

DBbitnet
CB bitnet earn
_# Relais bitnet
_# Au 05/02/96, le CNUSC a fait un alias pour la passerelle.
DZgwbitnet.cnusc.fr
#endif					/* Relais Exterieur */

#if AdressesLocales == LISTE || AdressesLocales == LISTE_DOMAINE
_#
_# La classe S
_# La liste des adresses locales s'il faut faire des cas particuliers.
_#
#ifdef FichierListeAdressesLocales
FS FichierListeAdressesLocales
#else
CS ListeAdressesLocales
#endif
#endif					/* AdressesLocales == LISTE */

#if AdressesInternes == LISTE
_#
_# La classe T
_# La liste des adresses internes s'il faut faire des cas particuliers.
_#
#ifdef FichierListeAdressesInternes
FT FichierListeAdressesInternes
#else
CT ListeAdressesInternes
#endif
#endif					/* AdressesInternes == LISTE */

#ifdef ReecritureAdressesLocales
_#
_# Reecriture des champs "From" pour les adresses sur cette machine
_# (ou assimilee).
_#
concat(DL,ReecritureAdressesLocales)
#endif
#ifdef ReecritureAdressesInternes
_#
_# Reecriture des champs "From" pour les adresses relevant de notre
_# juridiction (reecriture commune sur un mailhost).
_#
concat(DI,ReecritureAdressesInternes)
#endif

_#
_# La classe qui permet de reconnaitre nos suffixes propres.
_#
CX LOCAL INTERNE EXTERNE

_###############################################################################
_#				MACROS STANDARD
_###############################################################################

_#
_# Les macros "standard" de sendmail que nous devons definir manuellement :
_#	V : sert d'identification de la version de ce sendmail.cf
_#	m : domaine
_#	j : host.domaine
_#	e : message de bienvenue SMTP
_#	l : le format de la ligne "From: "
_#	o : les delimiteurs pour les regles de reecriture
_#	n : le nom du pseudo-utilisateur pour les messages d'erreur
_#	q : format des noms d'expediteur

DVjtpda-5.2

Dj$H.$M

De$j Sendmail $v/$V ready at $b
DlFrom $g  $d
Do.:%@!^/[]
DnMailer-Daemon
Dq$g$?x ($x)$.

_###############################################################################
_#				OPTIONS
_###############################################################################

_#
_# Options affectant le comportement de sendmail
_#	a : (v8) attend N minutes pour l'apparition de @:@ dans les aliases
_#	A : fichier des aliases
_#	b : (v8) nombre minimum de blocs libres sur le disque pour ESMTP
_#	B : (v8) caractere de remplacement des espaces
_#	c : mettre les courriers pour les mailers "chers" dans la file d'attente
_#	C : (v8) checkpoint de la file d'attente toutes les N minutes
_#	d : mode de depot du courrier (i, b ou q)
_#	D : reconstruction du fichier des alias automatiquement
_#	e : affichage des erreurs
_#	E : ajoute un message sympathique dans les erreurs renvoyees
_#	f : preserve les lignes "From:" superflues
_#	F : mode du fichier temporaire
_#	g : group id des mailers
_#	G : fuzzy matching on the Gecos field
_#	h : (v8) max hop count
_#	H : fichier de help de smtp
_#	i : sendmail n'interprete pas "." comme une fin de message
_#	I : si named ne tourne pas, ne fait pas confiance a /etc/hosts
_#	j : (v8) envoie les messages d'erreur en format MIME
_#	J : (v8) chemin d'acces aux fichiers .forward
_#	k : (v8) nb max de connexions cachees
_#	K : (v8) delai max de connexions cachees
_#	l : (v8) envoie les erreurs a "Error to"
_#	L : log level
_#	m : envoie le message a l'expediteur aussi si mailing-list
_#	M : initialise la valeur d'une macro
_#	n : analyse les rhs des aliases
_#	o : autorise les anciens formats (?)
_#	O : options SMTP (parametres d'attente : port, famille, adresse, etc)
_#	p : privacy options (public, goaway, noexpn, novrfy, etc.)
_#	P : nom du Postmaster
_#	q : comportement lors du depassement de la charge de l'option x
_#	Q : repertoire servant de file d'attente
_#	r : timeout de lecture (smtp)
_#	R : (Sun) mode remote : envoyer le courrier sur le serveur NFS
_#	R : (v8) elimine les source-route superflus
_#	s : "super-safe", passe toujours par la file d'attente
_#	S : fichier collectant les statistiques
_#	t : (v8) timezone a utiliser
_#	T : timeout dans la file d'attente (avant renvoi a l'expediteur)
_#	u : user id pour les mailers
_#	U : (v8) localisation de la user database
_#	v : tourne sendmail en mode "verbose"
_#	V : (v8) fallback MX host
_#	w : (v8) si nous sommes le meilleur MX pour un site, envoyer directement
_#	x : charge a partir de laquelle on met les courriers en attente
_#	X : charge a partir de laquelle on refuse les connexions SMTP
_#	y : penalise les messages avec beaucoup de destinataires
_#	Y : traite chaque message de la queue dans un process distinct
_#	z : favorise encore plus les messages prioritaires
_#	Z : penalise les messages non envoyables depuis longtemps
_#	7 : (v8) tronque les caracteres a 7 bits
_#

#if AdressesLocales == RIEN
_# Sendmail 8.7.3 pre-ouvre le fichier des aliases s'il est defini
_# donc on ne le definit pas.
#else
concat(OA,Aliases)
#endif
Odbackground
OF0600
Og1
concat(OH,SendmailHf)
OL9
Om
Oo
OPPostmaster
concat(OQ,Mqueue)
Or5m
Os
concat(OS,SendmailSt)
OT3d
Ou1
Ox20
OX30
#ifdef V8
_#
_# Les options propres a v8
_#
O7False
Ob4
OC10
ODFalse
OfFalse
Oh17
_#
_# Option I : si le serveur de noms n'est pas joignable, c'est considere
_# comme une panne temporaire et le courrier est mis en attente dans la
_# file d'attente.
_# Si pour votre plus grand malheur vous n'utilisez pas le serveur de
_# noms, il ne faut pas mettre l'option I (commentez la ligne suivante).
#ifndef SansDNS
OI
#endif
OjTrue
OJ$z/.forward
#ifdef RelaisExterieur
Ok0
#else					/* RelaisExterieur */
Ok5
OK5m
#endif					/* RelaisExterieur */
OnTrue
_#
_# Il faut savoir que MH, lorsqu'il est configure pour dialoguer directement
_# avec un serveur SMTP, ne respecte pas la RFC 821, c'est a dire qu'il
_# n'envoie pas HELO lors de la connexion au serveur.
_# Dans ce cas, vous pouvez retirer le "needmailhelo" dans la ligne qui suit.
_#
_# Si vous voulez masquer la file d'attente, vous pouvez ajouter l'option
_# "restrictmailq", qui empeche toute utilisation de la commande "mailq",
_# sauf pour les membres du groupe proprietaire de Mqueue.
_# Note : cette option n'a de sens que si vous supprimez les acces en lecture
_# au fichier de log de sendmail (mail.debug dans /etc/syslog.conf).
_#
Opnoexpn,needmailhelo,needvrfyhelo,restrictqrun,authwarnings
Ot

_#
_# Ces options sont propres a 8.7 et definissent la maniere dont
_# sont traites les messages contenant des donnees  8 bits "illegaux",
_# c'est a dire non identifies comme etant des messages MIME.
_# EightBitMode specifie la transformation a appliquer au corps :
_#	strict : rejeter le message
_#	mime : convertir en MIME
_#	pass : passer le message tel qu'il est (sans le convertir en MIME)
_# Si on convertit en MIME, DefaultCharset est le jeu de caracteres
_# est le jeu de caracteres a mettre dans le champ "Content-Type".
_#
O EightBitMode=mime
O DefaultCharset=iso-8859-1

_#
_# Ce fichier de configuration est adapte a sendmail v8
_#
V5
#endif					/* V8 */

_###############################################################################
_#				PRIORITES
_###############################################################################

_#
_# Priorites des messages.
_# Par defaut, c'est 0
_# La priorite peut etre modifiee par une ligne du type "Precedence: junk"
_# dans l'en-tete
_#

Pfirst-class=0
Pspecial-delivery=100
Plist=-30
Pbulk=-60
Pjunk=-100

_###############################################################################
_#				TRUSTED USERS
_###############################################################################

_#
_# Les "trusted users" sont les noms des utilisateurs qui ont le droit
_# de changer le nom de l'expediteur, comme par exemple les logins "uucp".
_#

T root daemon uucp listserv

_###############################################################################
_#				FORMAT DES EN-TETES
_###############################################################################

H?P?Return-Path: <$g>
HReceived: $?sfrom $s$?_ ($_)$.$|$?_from ($_)$.$.
          by $j ($v/$V)$?r with $r$. id $i
          $?ufor $u$.; $b
H?D?Resent-Date: $a
H?D?Date: $a
H?F?Resent-From: $q
H?F?From: $q
H?x?Full-Name: $x
HSubject:
H?M?Resent-Message-Id: <$t.$i@$j>
H?M?Message-Id: <$t.$i@$j>

_###############################################################################
_#				REGLES DE REECRITURE
_###############################################################################

_#
_# La procedure 'sendmail' execute toujours les ensembles 3 puis 0
_# pour l'envoi et la reception d'un courrier.
_# Les ensembles 3, 1, 10/11/12/... et 4 reecrivent les champs contenant des
_# adresses d'expediteur.
_# Les ensembles 3, 2, 21/21/22/... et 4 reecrivent les champs contenant des
_# adresses de destinataire.
_# Les ensembles 17, 18 et 19 sont appeles par les ensembles ci-dessus.
_#

_##############################################################################
_# Ensemble 0
_##############################################################################

_#
_# Resolution du mailer
_#
_# Entree : une adresse sous forme canonique (c'est a dire apres l'ensemble S3)
_# Sortie : un triplet (mailer, host, user). La regle se termine lorsque
_#	on arrive sur $#mailer $@host $:user
_# Note : le "user" est mis dans la macro "$u", mais c'est en fait
_#	une adresse qui va passer par la regle 4 (comportement code en
_#	dur de sendmail) pour la passer a un mailer. C'est une partie
_#	de l'enveloppe.
_#	

S0

_#
_# Traitement du cas special "sans adresse"
_# C'est le premier cas reconnu par l'ensemble S3. L'effet est d'envoyer
_# ca a Postmaster.
_#
R<@>			$#local $:$n

_#
_# Traitement des adresses numeriques (ca marche si DNS!)
_# Normalement, les adresses numeriques ont ete canonisees par la regle
_# 19. Si l'adresse est toujours numerique ici, on refuse d'envoyer le
_# courrier.
_#
R$+<@[$+].EXTERNE>$*	$#error $:host [$2] not registered, was in <$1@[$2]$3>

_#
_# Traitement des source-routes si nous sommes le premier relais sur
_# la liste : on enleve notre nom et on recommence
_#
R<@$*.LOCAL>:$*		$@ $>18 $2

_#
_# Traitement du cas ou on fait user%labas@ici (source-route a la mode RFC 1123)
_# On enleve la partie "@ici" et on recommence avec "user%labas".
_# Note : si on fait "user@ici", on recommence avec "user".
_# Le "$+" est important pour distinguer le cas ou c'est "user@..." du cas
_# "user" tout seul (non qualifie). Dans le premier, on enleve jusqu'a
_# esperer arriver a "user" non qualifie, dans le deuxieme, on ne se rappelle
_# pas recursivement.
_#
R$*<@$+.LOCAL>$*	$@ $>18 $1

#ifdef TableRoutagesDefini
_#
_# Traitement des routages explicites qui ne sont pas resolus
_# dans le cas general.
_#
_# On utilise deux choses :
_#
_# - la classe R pour reconnaitre si une adresse correspond a une route ;
_#	cette classe est obtenue en lisant la premiere colonne du fichier.
_#
_# - la "map" routages pour transformer cette adresse
_#
_#   Les lignes doivent etre de la forme :
_#      domaine:     mailer.relais
_#   ou "domaine" est un nom de domaine, "mailer" un mailer defini par une
_#   ligne "M" (local, prog, smtp, buggysmtp, uucp) et "relais" la machine
_#   a contacter. Pour les mailers smtp et buggysmtp, il est possible
_#   d'encadrer le relais entre crochets (ex: "smtp.[mailhost.jussieu.fr]")
_#   pour forcer sendmail a ne pas utiliser les MX.
_#
_# Attention :
_#
_# - Apres toute modification de ce fichier, il faut actualiser la
_#   version binaire (le fichier .db) en faisant :
_#     sendmail -bi -oA/usr/local/etc/routages
_#   en changeant le chemin ci-dessus par le nom que vous avez choisi.
_#
_# - Il faut egalement relancer sendmail car le fichier est lu dans la
_#   classe R au moment du demarrage de sendmail uniquement.
_#

FR FichierTableRoutages %[^:]
Kroutages TableRoutages

_#
_# Tests de presence dans le fichier des routages.
_# L'adresse qu'on a en sortie est :
_#  	partie-locale<mailer.relais@adresse>reste
_#

R$*<@$*$=R.$->$*	$: $1<$(routages $3 $:$)@$2$3.$4>$5

_#
_# Si on a trouve, il y a quelque chose entre le "<" et le "@"
_# On appelle alors le mailer correspondant en lui passant l'adresse
_# specifiee. Le format de la ligne est mailer.relais avant le @ de
_# la forme canonique.
_#

_#  mailer
_#  |  relais
_#  |  |  adresse reelle de destination
_#  |  |  |  LOCAL, INTERNE ou EXTERNE
_#  |  |  |  |          mailer
_#  |  |  |  |          | relais
_#  |  |  |  |          | |    user pour l'enveloppe
_#  |  |  |  |          | |    |    adresse reelle
_#  |  |  |  |          | |    |    |   adresse originale
_#  |  |  |  |          | |    |    |   |  LOCAL, INTERNE ou EXTERNE
_#  |  |  |  |          | |    |    |   |  |
_#  v  v  v  v          v v    v    v   v  v
R$*<$-.$+@$*.$->$*	$#$2 $@$3 $:$1<@$4.$5>$6

_#
_# Si on arrive la avec quelque chose avant le "@",
_# c'est qu'il y a une erreur de configuration
_# dans le fichier des routages
_#
R$*<$+@$*>$*		$#error $:Bad local routing specification: $2

_#
_# Ici, on a une adresse qui ne tombe pas dans un cas particulier
_# du fichier des routages explicites et on continue le traitement
_# general.
_#
#endif					/* TableRoutagesDefini */

_#
_# Traitement des courriers destines a ce site
_#
R$*<@$*.LOCAL>$*	$#local $:$1

_#
_# Traitement des courriers dans notre juridication
_#

#ifdef MailhostEnInterne
_# On les envoie au mailhost concerne
#ifdef V8
R$*<@$*$-.$=M.INTERNE>$*	$#smtp $@[mailhost.$3.$M] $:$1<@$2$3.$M.INTERNE>$5
#else
R$*<@$*$-.$=M.INTERNE>$*	$#smtp $@mailhost.$3.$M $:$1<@$2$3.$M.INTERNE>$5
#endif					/* V8 */

#else					/* MailhostEnInterne */
_# On les envoie directement a la machine concernee
#ifdef V8
R$*<@$*.INTERNE>$*	$#smtp $@[$2] $:$1<@$2.INTERNE>$3
#else
R$*<@$*.INTERNE>$*	$#smtp $@$2 $:$1<@$2.INTERNE>$3
#endif					/* V8 */
#endif					/* MailhostEnInterne */

_#
_# Tout ce qui reste est externe.
_# Envoi vers l'exterieur.
_#

R$*<@$*.EXTERNE>$*	$1<@$2>$3

#ifdef RelaisExterieur
_# On passe tout ce qui n'est pas dans notre juridiction a $R
R$*<@$*>$*		$#smtp $@Relais $:$1<@$2>$3
#else					/* RelaisExterieur */

_#
_# Traitement des adresses bitnet
_# On reconnait "user<@host.bitnet> ou user<@host.earn>...",
_# On envoie a la machine $Z qui est le relais bitnet.
_#
R$*<@$*.$=B>$*		$#smtp $@$Z $:$1<@$2.$B>$4

_#
_# Traitement du cas general Internet
_# On envoie a la machine specifiee en tenant compte des MX.
_#
R$*<@$+>$*		$#smtp $@$2 $:$1<@$2>$3
#endif					/* RelaisExterieur */

_#
_# Theoriquement, il ne peut plus rien rester (les adresses non
_# qualifiees a l'origine l'ont ete par la regle 19).
_#

R$*			$#error $: $1 : unrecognized address

_##############################################################################
_# Ensemble 1
_##############################################################################

_#  Pre-traitement du champ expediteur

S1

_# Traduction eventuelle de l'adresse
R$*			$:$>17 $1

_##############################################################################
_# Ensemble 2
_##############################################################################

_#  Pre-traitement du champ destinataire

S2

_# Regle vide.


_##############################################################################
_# Ensemble 3
_##############################################################################

_#
_# L'ensemble 3 est le prealable a tout traitement d'adresse.
_#
_# Entree : une adresse telle qu'elle a ete entree par l'utilisateur
_#   La syntaxe des adresses est donnee par :
_#   - La RFC 822, qui la definit precisement :
_#	- adresses normales :
_#		user@site
_#			=> canonisation : user<@site>
_#		user@site (Texte de commentaire)
_#			=> presence de commentaires
_#			=> en fait, les commentaires () peuvent etre inseres
_#				a tout moment dans l'adresse.
_#			=> canonisation : user<@site>
_#	- adresses avec routage explicite (source-routes) :
_#		<@site1,@site2:user@site3>
_#			=> envoi a site1, qui envoie a site2, etc.)
_#			=> canonisation : <@site1>:@site2:user@site3
_#		"Texte de commentaire" <@site1:user@site2>
_#			=> presence de commentaires
_#			=> canonisation : <@site1>:user@site2
_#		Texte de commentaire <@site1:user@site2>
_#			=> presence de commentaires (sans guillemets)
_#			=> canonisation : <@site1>:user@site2
_#		<user@site>
_#			=> adresse source-route degeneree
_#			=> canonisation : user<@site>
_#	- adresses de liste :
_#		user1@site1, liste: user2@site2, user3@site3 ; , user4@site4
_#			=> la "liste" comprend user2 et user3
_#			=> le message est envoye a 1, 2, 3 et 4
_#			=> cette adresse est pre-decoupee par sendmail
_#	- adresses numeriques
_#		user@[134.157.1.1]
_#			=> utilisation non recommandee
_#			=> canonisation : user<@[...]>
_#   - La RFC 1123, qui amende la RFC 822 :
_#	- les adresses "source-route" sont presque obsoletes
_#		et leur utilisation n'est pas recommandee, il
_#		faut utiliser le "%"
_#		En particulier, aucun mailer ne devrait generer des
_#		adresses avec source-route (sauf dans le cas degenere)
_#		et on ne doit les reconnaitre que pour la compatibilite
_#		avec les tres, tres, tres, tres vielles implementations.
_#		On les accepte, mais il ne faut pas les renvoyer
_#		telles quelles (cf. 5.2.6).
_#	- "%" hack :
_#		user%site1%site2@site3
_#			=> le message est envoye au site3
_#			=> canonisation : user%site1%site2<@site3>
_#   - L'usage en vigueur dans le monde UUCP :
_#	- les adresses "uucp pur"
_#		site1!site2!...!siten!user
_#			=> ces adresses ne sont plus reconnues
_#			=> il faut explicitement fournir une passerelle
_# Sortie :
_#   - une adresse sous forme canonique (voir exemples ci-dessus)
_#	...<@.... .classe>...
_#	^    ^     ^      ^
_#	|    |     |      destine a la machine cible pour continuer le routage
_#	|    |     |      (cf source-route)
_#	|    |     LOCAL, INTERNE ou EXTERNE (cf commentaire regle 19)
_#	|    adresse de la machine cible
_#	|    suffixee eventuellement par le routage
_#	partie locale (a la machine cible) de l'adresse
_#   - "<@>" en cas d'erreur (adresse vide)
_#   - un nom d'utilisateur sans nom de host
_#   - une adresse completement baroque...
_#

S3

_#
_# Si l'adresse que l'on recoit contient deja des "<>", il faut les eliminer
_# avant de continuer plus avant. Il n'est pas legal de placer des "<>" a
_# l'interieur d'une adresse.
_#
R$*<$*>$*<$*>$*		$2$3<$4>$5
R$*<$*<$+>$*>$*		<$3>$5
R$*<$+>$*		$2

_#
_# Traitement du cas ou il n'y a pas d'adresse. La forme canonique est la
_# plus reduite possible (<@>). Les ensembles ulterieurs devront traiter ce cas.
_#
#ifdef V8
_# La macro "$@" est nouvelle en version 8. Elle signifie : "0 token"
R$@			$@ <@>
#endif					/* V8 */
R$*<>$*			$@ <@>

_#
_# Reconnaisance des adresses avec route.
_#
_# Une adresse avec route contient un ":" specifiant l'adresse finale
_# Il faut prendre le premier host de la liste et lui envoyer le reste
_# On change donc les "@a,@b,@c:user@d" en "<@a>:@b:@c:user@d" pour envoi a @a
_#
R@$+,$+:$+		@$1:$2:$3
R@$+:$+			$@ $>19 <@$1>:$2

_#
_# Reconnaissance des listes.
_#
R$+:$*;@$+		$@ $1:$2;@$3

_#
_# S'il y a un "@" dans l'adresse, on considere que c'est prioritaire.
_# S'il y a plusieurs "@", on prend le dernier.
_#
R$+@$+			$: $1<@$2>
R$+<$+@$+>		$1$2<@$3>
R$+<@$+>		$@ $>19 $1<@$2>

_#
_# Canonisation du "%" hack (cf RFC 1123)
_# - "..%..%.." est transforme en "..%..@.."
_# - on se ramene ensuite au cas standard.
_#
R$+%$+			$1@$2
R$+@$+@$+		$1%$2@$3
R$+@$+			$@ $>19 $1<@$2>

_#
_# Quand on arrive la, tout a ete reconnu, sauf les adresses sans nom de host
_# (ou les adresses du style uucp "a!b!c!d" ou les autres adresses encore
_# plus baroques qu'on n'a pas pu imaginer...)
_# On passe donc ca dans la regle 19 pour assurer la coherence.
_#
R$*			$@ $>19 $1

_##############################################################################
_# Ensemble 4
_##############################################################################

_#
_# C'est la re-ecriture fina-a-le...
_#
_# Entree : une adresse sous forme canonique (c'est a dire apres l'ensemble S3)
_# Sortie : une adresse prete a etre lue par un utilisateur
_#

S4

R$*<@>			$@ $1

_#
_# On remet les "," dans les source-route
_#
R<@$+>$*:$+:$+		<@$1>$2,$3:$4

_#
_# Si c'est une adresse non qualifiee, on enleve la forme canonique
_#
R$*<@.LOCAL>		$: $1

#if AdressesLocales == RIEN && AdressesInternes == RIEN
_#
_# Si on est dans le cas d'une feuille, on ne peut pas savoir comment
_# le mailhost va reecrire notre adresse. Il faut donc eviter qu'on
_# sorte de la feuille avec une adresse que l'on ne saurait ensuite pas
_# router dans notre domaine.
_# Exemple :
_#   le mailhost s'appelle : m.domaine.fr
_#   la feuille s'appelle : f.domaine.fr et tourne un sendmail sans "-bd"
_#   Si, sur la feuille, on envoie un courrier avec "Cc: toto", il sera
_#   transforme en "Cc: toto@f.domaine.fr". Par la suite, le mailhost ne
_#   modifiera plus cette adresse puisqu'elle n'est pas consideree
_#   comme un "From:". On va donc laisser sortir une adresse qui n'est
_#   pas valide (pas de serveur SMTP dessus). Un MX resoudrait ce probleme
_#   a l'exterieur, mais pas a partir d'autres machines de domaine.fr.
_# En plus, l'ajout de ces regles permet de conserver le commentaire
_# (i.e. le nom dans /etc/passwd) ajoute au "From:". Pourquoi ? Mystere...
_#
_# Modification proposee par Remy Card le 94/10/05
_#

R$*<@$=w>$*		$: $1		dequalification
R$*<@$=w.EXTERNE>$*	$: $1
#endif					/* AdressesLocales == RIEN && ... */

_#
_# On remplace les marqueurs que nous avons mis dans la regle 19
_#
R$*<@$*.$=X>$*		$: $1<@$2>$4

_#
_# On enleve les "<>" de la forme canonique.
_#
R$*<$+>$*		$1$2$3

_##############################################################################
_# Ensemble 16
_##############################################################################

_#
_# Traduction des adresses non qualifiees pour passage a un autre mailer
_# pour que les autres mailers ne soient pas tentes de le faire eux-memes
_# (voir RFC 1123, section 5.2.18).
_# Cette regle n'est utilisee que par les regles des mailers vers l'exterieur.
_#

S16
#ifdef ReecritureAdressesLocales
R$*<@.LOCAL>$*		$@ $1<@$L.LOCAL>$2
#else
R$*<@$*.LOCAL>$*	$@ $1<@$j.LOCAL>$3
#endif

_##############################################################################
_# Ensemble 17
_##############################################################################

_#
_# Traduction de l'adresse dans les champs "From:".
_# (ex: pda -> Pierre.David ou jt -> Jacky.Thibault)
_#

S17

#ifdef ReecritureAdressesLocales
_#
_# Reecriture des adresses locales
_#

_# on ne reecrit pas les adresses qui nous ont ete communiquees non
_# qualifiees.
R$*<@$+.LOCAL>$*		$: $1<@$L.LOCAL>$3
#endif

#ifdef ReecritureAdressesInternes
_#
_# Reecriture des adresses internes
_#

R$*<@$*.INTERNE>$*		$: $1<@$I.INTERNE>$3
#endif

#ifdef RevAliasesDefini
_#
_# Definition du fichier utilise pour faire la conversion
_# Les lignes de ce fichier doivent etre de la forme :
_#   login:     Prenom.Nom
_# Apres toute modification de ce fichier, il faut actualiser la
_# version binaire (le fichier .db) en faisant :
_#   sendmail -bi -oA/usr/local/etc/revaliases
_# en changeant le chemin ci-dessus par le nom que vous avez choisi.
_#
Krevaliases RevAliases

_#
_# Conversion des adresses locales en premier.
_# Elles dependent de notre juridiction, donc c'est legitime.
_# par exemple, au niveau du mailhost de prism.uvsq.fr :
_#	pda:	Pierre.David
_# Mais on peut aussi gerer la signature d'une personne locale
_# appartenant en realite a un autre domaine. Cette possibilite
_# ne devrait etre utilisee que lorsqu'un mailhost gere plusieurs
_# domaines (ex: moka.ccr.jussieu.fr gere a la fois ccr.jussieu.fr
_# et upmc.jussieu.fr). Par exemple :
_#      pda:	fonction@autre-domaine.uvsq.fr
_#
R$*<@$*.LOCAL>$*	$: $(revaliases $1$)<@$2.LOCAL>$3
R$*@$*<@$*.LOCAL>$*	$@ $>19 $1<@$2>$4
R$*<@$*.LOCAL>$*	$@ $1<@$2.LOCAL>$3

_#
_# Conversion des adresses non locales ensuite.
_# Cela permet d'avoir une base d'aliases centralisee pour un site
_# par exemple, au niveau du mailhost de l'uvsq :
_#	pda@prism.uvsq.fr:	Pierre.David
_# et de ne la gerer qu'au niveau du domaine et non de chaque labo.
_# On peut aussi faire :
_#	pda@prism.uvsq.fr:	Pierre.David@prism.uvsq.fr
_# et on reecrit ainsi au niveau du domaine les adresses dans les labos.
_#
R$*<@$*.$->$*		$: $1<$(revaliases $1@$2 $:$)@$2.$3>$4
R$*<$*@$*@$*.$->$*	$@ $>19 $2<@$3>$6
#ifdef ReecritureAdressesLocales
R$*<$+@$*>$*		$@ $2<@$L.LOCAL>$4
#else
R$*<$+@$*>$*		$@ $2<@$j.LOCAL>$4
#endif

_# quand on arrive la, c'est que l'adresse n'a pas ete traduite
#else					/* RevAliasesDefini */
_# Regle vide, pas de reecriture.
#endif					/* RevAliasesDefini */

_##############################################################################
_# Ensemble 18
_##############################################################################

_#
_# Enchaine 3 puis 0
_#

S18

R$*			$: $>3 $1
R$*			$@ $>0 $1

_##############################################################################
_# Ensemble 19
_##############################################################################

_#
_# Canonisation et reconnaissance des adresses locales
_#
_# Entree : une specification en format interne
_#	...<@...>...
_# Sortie :
_#	- suffixe par .LOCAL
_#	  => l'adresse est consideree comme etant sur cette machine
_#	- suffixe par .INTERNE
_#	  => l'adresse est consideree comme faisant partie de notre
_#	     juridiction, mais n'est pas sur notre machine.
_#	- suffixe par .EXTERNE
_#	  => l'adresse est hors de notre juridiction
_#

S19
_#
_# Reconnaissance des cas tordus pour localhost
_#
R$*<@localhost>$*	$: $1<@$j.LOCAL>$2
R$*<@localhost.$M>$*	$: $1<@$j.LOCAL>$2

_#
_# Reconnaissance des cas tordus pour les adresses "locales"
_# (comprend nos adresses IP numeriques en v8)
_# Cette regle recupere les cas tordus avant canonisation, ou les
_# cas tres standard.
_#
R$*<@$=w>$*		$: $1<@$j.LOCAL>$3

_#
_# Tentative de canonisation des noms de host.
_#
R$*<@$*$~X>$*		$: $1<@$[$2$3$]>$4	on ne canonise pas ...LOCAL
R$*<@$*.>$*		$1<@$2>$3		v8 ajoute "." a la canonisation

_#
_# On fait deux fois cette regle (voir quelques lignes plus haut) pour
_# eviter que, apres canonisation, [127.0.0.1] soit transforme en
_# localhost.un-autre-domaine, en cas de configuration "bizarre" pour
_# le localhost dans le DNS.
_#
R$*<@$=w>$*		$: $1<@$j.LOCAL>$3

_#
_# Traitement des cas particuliers en premier
_#
#if AdressesLocales == RIEN
_# Aucun courrier n'est local, on envoie tout a notre relais
R$*<@.LOCAL>$*		$@ $1<@$j.EXTERNE>$2
R$*<@$*.LOCAL>$*	$@ $1<@$2.EXTERNE>$3
#endif					/* AdressesLocales == RIEN */
#if AdressesLocales == LISTE || AdressesLocales == LISTE_DOMAINE
_#
_# Les adresses traitees comme locales sont dans la liste S
_# On les teste comme des adresses completes, ou relatives au domaine
R$*<@$=S>$*		$@ $1<@$2.$M.LOCAL>$3
R$*<@$=S.$=M>$*		$@ $1<@$2.$M.LOCAL>$4
#endif					/* AdressesLocales == LISTE */
#if AdressesInternes == LISTE
_#
_# Les adresses traitees comme internes sont dans la liste T
_# Il ne devrait pas y avoir d'homonymes avec des top-level domaines
_# si aucun labo n'a de nom :
_#    - <3 lettres (elimine tous les fr, uk, de, ch, au...)
_#    - != top level US (edu, gov, mil, arpa...)
_#    - != pseudo (bitnet, earn...)
_#
_#
R$*<@$*$=T>$*		$@ $1<@$2$3.$M.INTERNE>$4
R$*<@$*$=T.$=M>$*	$@ $1<@$2$3.$M.INTERNE>$5
#endif					/* AdressesInternes == LISTE */

#if AdressesLocales == HOST
#endif					/* AdressesLocales == HOST */
#if AdressesLocales == DOMAINE || AdressesLocales == LISTE_DOMAINE
_# On reconnait $M en plus de notre nom de machine
R$*<@$=M>$*		$@ $1<@$M.LOCAL>$3
#endif					/* AdressesLocales == DOMAINE */
#if AdressesLocales == TOUT_DOMAINE
_# On reconnait $M  et *.$M en plus de notre nom de machine
R$*<@$*$=M>$*		$@ $1<@$2$M.LOCAL>$4
#endif					/* AdressesLocales == TOUT_DOMAINE */

_#
_# Reconnaissance du cas general des adresses internes
_#
#if AdressesInternes == RIEN
#endif					/* AdressesInternes == RIEN */
#if AdressesInternes == ETOILE_DOMAINE
R$*<@$*.$=M>$*		$@ $1<@$2.$M.INTERNE>$4
#endif					/* AdressesInternes == ETOILE_DOMAINE */

_#
_# Tout ce qui reste est :
_# - soit qualifie, auquel cas c'est externe
_#
R$*<@$*.$=X>$*		$@ $1<@$2.$3>$4		il y a deja .LOCAL ou .INTERNE
R$*<@$*>$*		$@ $1<@$2.EXTERNE>$3

_#
_# - soit un cas tordu : l'adresse "@nimportequoi" est reconnue comme une
_#   adresse locale, puis ensuite, tout se passe comme si sendmail enlevait
_#   le "@" pour la remise physique, donc "nimportequoi" est cherche dans
_#   les aliases.
_#   Exemple : From Jacques Beigbeder :
_#	quelqu'un me met dans son .forward:
_#		@dmi
_#	en oubliant son nom. Ca devient:
_#		dmi (l'alias de mail!)
_#	i.e. tous les utilisateurs du D.M.I., y compris lui. D'ou,
_#	au premier mail qui lui arrive, avalanche de mails vers tout
_#	le monde, sauf lui qui ne voit rien donc ne se doute de rien.
_#   Resolution : on traite ce qui suit le "@" comme un nom de host,
_#   et on laisse ce host se debrouiller avec une partie locale vide.
_#
R@$+			$@ $>19 <@$1>		cas vraiment tres tordu

_#
_# - soit non qualifie, auquel cas c'est une adresse sans nom de host.
_#   On la qualifie par un ".LOCAL" seul pour se rappeler que c'est une
_#   adresse non qualifiee, et on repasse dans la regle 19 pour utiliser
_#   le cas general.
_#
R$+			$@ $>19 $1<@.LOCAL>


_##############################################################################
_# Ensemble 10
_##############################################################################

_#
_#  traitement du champ expediteur pour local et prog
_#  Ensembles 3,1,10,4
_#

S10

_# S'il n'y a rien, c'est Mailer-Daemon
R<@>			$n

_##############################################################################
_# Ensemble 11
_##############################################################################

_#
_#  traitement du champ expediteur pour smtp
_#  Ensembles 3,1,11,4
_#

S11

_# S'il n'y a rien, c'est Mailer-Daemon
R<@>			$n

_# Qualification des adresses non qualifiees.
R$*			$: $>16 $1


_##############################################################################
_# Ensemble 12
_##############################################################################

_#
_#  traitement du champ expediteur pour uucp
_#  Ensembles 3,1,12,4
_#

S12

_# S'il n'y a rien, c'est Mailer-Daemon
R<@>			$n

_# Qualification des adresses non qualifiees.
R$*			$: $>16 $1


_##############################################################################
_# Ensemble 20
_##############################################################################

_#
_#  traitement du champ destinataire pour local et prog
_#  Ensembles 3,2,20,4
_#

S20

_# Regle vide.

_##############################################################################
_# Ensemble 21
_##############################################################################

_#
_#  traitement du champ destinataire pour smtp
_#  Ensembles 3,2,21,4
_#

S21
_# Qualification des adresses non qualifiees.
R$*			$: $>16 $1


_##############################################################################
_# Ensemble 22
_##############################################################################

_#
_#  traitement du champ destinataire pour uucp
_#  Ensembles 3,2,22,4
_#

S22
_# Qualification des adresses non qualifiees.
R$*			$: $>16 $1

_#
_# C'est fini...
_#
EOF

exit 0
