Réponse automatique indiquant une maintenance ( postfix )

Bonjour,

Je souhaite mettre une réponse automatique indiquant que le serveur mail est en maintenance.
J’utilise postfix, qui peux m’indiquer la manipulation.

Merci

A qui tu veux faire la réponse??? Si c’est au serveur SMTP, tu peux faire simplement un script

#!/bin/sh echo "421 Temporary failure, please retry" exit 0

que tu nommes /usr/local/bin/waitsmtp avec les droits rwxr-xr-x
et tu rajoutes une ligne

dans /etc/inetd.conf.

Tu peux également compiler le programme suivant, puis tu fais

/etc/init.d/postfix stop

et tu lances ce programme en root.
Tu fais ta manip, il enverra un signal d’erreur aux sqerveur se connectant.

[code]#include <sys/socket.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <signal.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <unistd.h>

#define PORT 25

struct sockaddr_in desc_douille;

void erreur(message)
char *message;
{
printf(“Erreur %s\n”,message);
perror("Message d’erreur: ");
exit(1);
}

int cree_douille (const char * nom_hote,
const char * nom_service,
const char * nom_proto,
const int num_port)
{
int sock;
struct sockaddr_in adresse;
struct hostent * hostent = NULL;
struct servent * servent = NULL;
struct protoent * protoent = NULL;

if (nom_hote != NULL)
if ((hostent = gethostbyname (nom_hote)) == NULL) {
erreur (“gethostbyname”);
return (-1);
}

if ((protoent = getprotobyname (nom_proto)) == NULL) {
erreur (“getprotobyname”);
return (-1);
}
if (nom_service != NULL)
if ((servent = getservbyname (nom_service,
protoent -> p_name)) == NULL) {
erreur (“getservbyname”);
return (-1);
}
if ((sock = socket (AF_INET, SOCK_STREAM, 0)) < 0) {
erreur (“création douille”);
return (-1);
}
memset (& adresse, 0, sizeof (struct sockaddr_in));
adresse . sin_family = AF_INET;
if (servent != NULL)
adresse . sin_port = servent -> s_port;
else
if (num_port != 0) adresse.sin_port = htons(num_port);
else adresse . sin_port = htons (0);
if (hostent != NULL)
adresse . sin_addr . s_addr =
((struct in_addr *) (hostent -> h_addr)) -> s_addr;
else
adresse . sin_addr . s_addr = htonl (INADDR_ANY);
if (bind (sock, (struct sockaddr *) & adresse,
sizeof (struct sockaddr_in)) < 0) {
close (sock);
erreur (“localisation douille”);
return (-1);
}
return (sock);
}

traite(connexion)
int connexion;
{
write(connexion,“421 Temporary failure, please retry later\n”,42);
}

main(argc,argv)
int argc;
char *argv;
{
int douille,douille_connecte;
int prt=PORT;
int longueur;
struct sockaddr sock_interlocuteur;
int option;
while ((option = getopt(argc,argv,“p:a:vh”)) != -1) {
switch(option) {
case ‘p’:
sscanf(optarg,"%d",&prt);
break;
case ‘h’:
case ‘?’:
default:
break;
}
}
douille = cree_douille(NULL,NULL,“tcp”,prt);
if (listen(douille,5) < 0) erreur(“écoute douille”);
longueur = sizeof(struct sockaddr);
/
évite au processus fils de rester au zombie */
signal(SIGCHLD,SIG_IGN);

/* attente d’une connexion */

for(;:wink: {
if ((douille_connecte = accept(douille,&sock_interlocuteur,&longueur))< 0)
erreur(“problème à la connexion”);

/* Traitement de connexion /
switch(fork()) {
case -1 :
erreur(“problème au fork”);
case 0 :
/
le fils /
close(douille);
/
traitement de la connexion /
traite(douille_connecte);
/
fin de la connexion */
close(douille_connecte);
exit(0);
default :
close(douille_connecte);
}
}
}

[/code]
[edit: erreurs de syntaxe supprimées, programme testé]