Bueno una empresa me pidió que le haga un sistema para recibir notificaciones si el servidor de correo cae. Lo que se le puede ocurrir a todo el mundo es usar un telnet y monitorear el servicio, pero cosa de descartar problema de DNS, espacio en disco y demás cosas hice un daemon un poco más complejo.
La idea es:
+ Enviar un correo y revisar si lo recibimos desde otro servidor al nuestro.
+ Luego al revés, o sea, enviar un correo desde nuestro servidor al servidor de control a ver si llega.
Si en ambos casos llegar, todo perfecto, si no envía notificaciones push a una lista de iphones. Más sencillo imposible, y más útil tampoco :P.
Empecemos con el código, lo dividí en tres scripts.
+ Daemon
+ Enviar correo
+ Recibir correo
+ Enviar alerta
Vamos con el código:
—mailwarn–
#!/bin/bash
userskeys=$(cat /etc/mailwarn/userkeys | grep -v \#);
apitoken="XXXXXXXXXXXXXXXX";
host1=$(cat /etc/mailwarn/mailwarn.conf | grep host1 | cut -d "=" -f 2);
host2=$(cat /etc/mailwarn/mailwarn.conf | grep host2 | cut -d "=" -f 2);
user=$(cat /etc/mailwarn/mailwarn.conf | grep user | cut -d "=" -f 2);
pass=$(cat /etc/mailwarn/mailwarn.conf | grep pass | cut -d "=" -f 2);
enviaralertas() {
for uk in $userskeys; do
/usr/bin/enviaralerta $apitoken $uk "El servidor de correo falla" >> /var/log/mailwarn;
done;
}
while (a=b); do
if [ -f /etc/mailwarn/disable ]; then
echo "Sistema desactivado";
else
subject=$(date | md5sum | awk '{print $1}');
echo "Enviando $host1 $user $pass $user@$host2 $subject " >> /var/log/mailwarn;
/usr/bin/mandarcorreo $host1 $user $pass "$user@$host2" $subject >> /var/log/mailwarn;
sleep 5m;
echo "recibiendo $host2 $user $pass $subject" >> /var/log/mailwarn;
/usr/bin/recibircorreo $host2 $user $pass $subject;
if [ ! $? -eq 0 ]; then
enviaralertas;
else
subject=$(date | md5sum | awk '{print $1}');
echo "Enviando $host2 $user $pass $user@$host1 $subjec" >> /var/log/mailwarn;
/usr/bin/mandarcorreo $host2 $user $pass "$user@$host1" $subject >> /var/log/mailwarn;
sleep 5m;
echo "recibiendo $host1 $user $pass $subject" >> /var/log/mailwarn;
/usr/bin/recibircorreo $host1 $user $pass $subject;
if [ ! $? -eq 0 ]; then
enviaralertas;
fi
fi
fi;
done;
—/usr/bin/recibircorreo—
#!/usr/bin/perl
use warnings;
use Net::POP3;
$mailserver=$ARGV[0];
$username=$ARGV[1];
$password=$ARGV[2];
$token=$ARGV[3];
my $pop3 = Net::POP3->new($mailserver) or die "Failed to connect to $mailserver";
my $tot_msg = $pop3->login($username."@".$mailserver,$password) or die "Failed to authenticate $username";
foreach my $msg_id (1 .. $tot_msg) {
my $header = $pop3 -> top($msg_id, 0);
my ($subject, $from, $status) = analyze_header($header);
if ($subject eq $token ) {
$pop3 -> quit;
exit(0);
} else {
$pop3->delete($msg_id);
}
}
$pop3 -> quit;
exit(1);
sub analyze_header {
my $header_array_ref = shift;
my $header = join "", @$header_array_ref;
my ($subject) = $header =~ /Subject: (.*)/m;
my ($from ) = $header =~ /From: (.*)/m;
my ($status ) = $header =~ /Status: (.*)/m;
if (defined $status) {
$status = "Unread" if $status eq 'O';
$status = "Read" if $status eq 'R';
$status = "Read" if $status eq 'RO';
$status = "Ne $status = "-";w" if $status eq 'NEW';
$status = "New" if $status eq 'U';
}
else {
$status = "-";
}
return ($subject, $from, $status);
}
—/usr/bin/mandarcorreo—
#!/usr/bin/perl
use warnings;
use Email::Sender::Simple qw(sendmail);
use Email::Sender::Transport::SMTP ();
use Email::Simple ();
use Email::Simple::Creator ();
my $smtpserver = $ARGV[0];
my $smtpport = 25;
my $smtpuser = $ARGV[1];
my $smtppassword = $ARGV[2];
my $to = $ARGV[3];
my $subject = $ARGV[4];
my $from = $smtpuser."@".$smtpserver;
my $transport = Email::Sender::Transport::SMTP->new({
host => $smtpserver,
port => $smtpport,
sasl_username => $smtpuser."@".$smtpserver,
sasl_password => $smtppassword,
});
my $email = Email::Simple->create(
header => [
To => $to,
From => $from,
Subject => $subject,
],
body => "blabla\n",
);
–/usr/bin/enviaralerta–
#!/bin/bash curl -s \ -F "token=$1" \ -F "user=$2" \ -F "message=$3" \ https://api.pushover.net/1/messages.json
Y ahora los archivos de configuración
–/etc/mailwarn/mailwarn.conf–
host1=host1.com
host2=host2.com
user=mailwarn
pass=clavedelusuario
–/etc/mailwarn/userkeys–
#yo
XXXXXXXXXXXXXX
#User2
XXXXXXXXXXXX
#User2
XXXXXXXXXXXX
No me quiero detener mucho en el tema del pushover, es una aplicación para iphone, la compran, se registran y ponen los userkeys en el archivo de configuración.
Espero les sirva 😉
Tags: bash, correo, iphone, mail, notificaciones, perl, push