sendmail lorsqu'il communique avec un autre MTA se présente
(commande HELO ou EHLO) en utilisant le contenu de la macro $j
qui est généralement le résultat de la commande hostname
sur le système hôte.
Dans le cas d'une machine reliée de façon intermitente à l'Internet ce résultat n'est généralement pas adresse officielle, déclarée, donc connue du service de noms (DNS).
Nous avons vu que la solution quand on dispose d'une adresse IP fixe et valide consistait en forcer la définition de la macro $j par la commande du kit m4 :
define(`confDOMAIN_NAME',`ppp.domaine.fr')dnlMais il faut, pour utiliser cette solution, connaître à l'avance le nom qui sera attribué à notre machine lors de la future connexion... ce n'est donc pas envisageable dans le cas qui nous préoccupe.
Dans le fichier /etc/sendmail.cf
que nous venons de générer,
nous pouvons voir :
# my official domain name # ... define this only if sendmail cannot automatically determine your domain #Dj$w.Foo.COM
C'est à cet endroit qu'a eventuellement lieu la définition de la macro $j qui nous intéresse.
Lors d'une connexion PPP, le script ip-up, lancé au début de la
connexion, reçoit en argument l'adresse IP qui nous a été
attribuée. Il est donc possible, dans ce script, de demander au
serveur de noms (le nôtre ou celui du provider) de transcrire cette
adresse IP en un nom de domaine pleinement qualifié, de modifier
/etc/sendmail.cf
puis de relancer sendmail avec cette
nouvelle définition.
Différentes méthodes et programmes le permettent mais la plupart sont
verbeux et nécessiteraient un filtre awk ou grep pour extraire le nom
qui nous intéresse... j'ai donc écrit un petit utilitaire très simple
gethost
dans cet unique but.
Pour pouvoir utiliser le script ip-up que je fournis plus loin :
/etc/sendmail.cf
en /etc/sendmail.cf.base
afin de disposer d'une base à partir de laquelle ip-up
pourra
travailler.
gethost
:
cc -o gethost gethost.cet placez-le dans le repertoire /usr/local/bin.
/etc/ppp/ip-up
en y
intégrant le mien.
#!/bin/sh # /etc/ppp/ip-up script permettant de configurer correctement # sendmail dans le cas des attributions # dynamique d'adresse IP # # Copyright © 04/1998 Jean Charles Delépine # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # Les paramètres passés à ip-up par pppd (man pppd) : # $1 = nom de l'interface (ppp0) # $2 = périférique utilisé (/dev/modem) # $3 = vitesse de transmission # $4 = adresse IP locale (celle qui nous intéresse) # $5 = adresse IP distante (le serveur de modem du provider, sera # notre passerelle vers le reste du monde) # $6 = ipparam (option donnée par l'utilisateur via l'option ipparam # de pppd) HOST=`/usr/local/bin/gethost $4` sed s/'#Dj.*'/"Dj$HOST"/ /etc/sendmail.cf.base >/etc/sendmail.cf kill -1 `head -1 /var/run/sendmail.pid` /usr/sbin/sendmail -q& exit 0
/* gethost.c, récupère le nom canonique d'une machine à partir de son adresse IP. Copyright © 04/1998 Jean Charles Delépine This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. */ #include <stdio.h> #include <netdb.h> #include <arpa/inet.h> #include <string.h> int main(argc,argv) char argc; char *argv[]; { struct hostent *host; struct in_addr ia; if (argc < 2) { fprintf(stderr,"Usage : %s addr\n",argv[0]); exit(1); } if (!inet_aton (argv[1],&ia)) { fprintf(stderr,"Erreur: adresse invalide\n"); exit(1); } host=gethostbyaddr((char *) &ia, sizeof(ia), AF_INET); if (!host) { fprintf(stderr,"Erreur: adresse non trouvée ou pas de DNS\n"); exit(1); } printf("%s\n",host->h_name); exit(0); }