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