Mail alerts con pushOver

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 😉