Notificar el cambio de IP público dinámico (Copaco) a un E-Mail

Posted on Tuesday, 27 April 2010

10



De forma predeterminada Copaco brinda una IP pública dinámica a sus clientes, siempre que sepamos cual es la IP, podremos acceder a distintos servicios que estén disponibles en la PC, pero si casualmente te encontrás en un lugar remoto, y el IP ya no es el mismo (principalmente cuando se reinicia el modem, o se corta la energía eléctrica), no hay mucho que hacer, aquí veremos una forma de notificar el cambio de IP, mediante un E-Mail.

Hay varias formas de realizar este objetivo, aquí presento una alternativa, una manera más sencilla aun es hacerlo en Ruby con la Gema Pony.

Necesitamos:

  1. curl (Obtiene un archivo usando HTTP, instalar con cualquier paquete)
  2. php5-cli (Interprete de lineas de comando, instalar con cualquier paquete)
  3. Los archivos class.phpmailer.php y class.smtp.php (Generalmente se encuentra en /usr/share/php/libphp-phpmailer)

Tenemos dos opciones para averiguar nuestra IP:

Estas URL’s nos devuelven la IP de la PC en donde estamos.

Funcionalidad:

En resumen, ejecutamos un script PHP en el Cron cada media hora, si el IP es distinto al último IP revisado, quiere decir que es un IP nuevo, lo almacena en un archivo ip_DB, y lo envía por mail a las personas correspondientes, si el IP no es nuevo, termina el programa, de esta manera estaremos seguros de contar con la dirección IP actual en nuestro buzón de correo.

<?php
require('/home/fulanito/cronjobs/ipmailer/class.phpmailer.php');
require('/home/fulanito/cronjobs/ipmailer/class.smtp.php');

$db_ip = "/home/fulanito/cronjobs/ipmailer/ip_DB";
$ip_nuevo = shell_exec("curl -s 208.78.70.70|sed -e 's/.*Dirección IP Actual: //' -e 's/<.*$//'"); //http://checkip.dyndns.org/
$ip_viejo = shell_exec("tail -n 1 $db_ip");

  if ($ip_nuevo == $ip_viejo){
    exit();
  }
  else { //Son diferentes, almacena el IP nuevo
    $fp = fopen($db_ip, 'a');
    fwrite($fp,$ip_nuevo);
    fclose($fp);
  }

$mail = new PHPMailer(); //Sin el parametro TRUE
$mail->IsSMTP(); //Diciendole a la Clase que usaremos SMTP

try {
  $mail->SMTPAuth   = true; //Habilitamos la autenticación SMTP
  $mail->Host       = "smtp.copaco.com.py"; //Fijamos el servidor SMTP
  $mail->Port       = 25; //Fijamos el puerto SMTP
  $mail->Username   = "fulanito@click.com.py"; //El nombre de la cuenta SMTP
  $mail->Password   = "xxxxx"; //La contraseña SMTP
  $mail->AddReplyTo('fulanito@click.com.py', 'Fulano');

  //Aquí van las cuentas que deseo notificar con el IP nuevo
  $mail->AddAddress('usuario@dominio.com', 'Usuario');
  $mail->AddAddress('otrousuario@otrodominio.com', 'Otro Usuario');

  $mail->SetFrom('fulanito@click.com.py', 'Fulano');
  $mail->AddReplyTo('fulanito@click.com.py', 'Fulano');
  $mail->Subject = 'IP de la PC';
  $mail->AltBody = ''; //Opcional - MsgHTML creará un texto de alternativa si no puede enviar como HTML

  //Aquí se podría enviar en formato de html, pero simplemente enviamos el IP nuevo en texto plano.
  //  $mail->MsgHTML(file_get_contents('contents.html'));
  $mail->MsgHTML($ip_nuevo);
  $mail->Send();
  echo "Mensaje enviado OK\n"; //Sin notificación
} catch (phpmailerException $e) {
  echo $e->errorMessage(); //Error del PHPMailer
} catch (Exception $e) {
  echo $e->getMessage(); //Error de cualquier otra cosa
}
?>

Como podemos ver, son 3 archivos que están en el mismo directorio, el archivo ip_DB que se comporta como una mini base de datos, el archivo en cuestión que codificamos (lo llamaremos: mailer.php), y las dos Clases que están en php.

Ahora veremos para ponerlo en el Cron, escribimos en la consola, como root o como otro usuario:

crontab -e

Quedaría algo así:

# m h  dom mon dow   command
*/30 * * * * /usr/bin/php5 /home/fulanito/cronjobs/ipmailer/mailer.php

Si no funciona, depuramos el cron mediante el siguiente código:

# m h  dom mon dow   command
*/30 * * * * /usr/bin/php5 /home/fulanito/cronjobs/ipmailer/mailer.php > /home/fulanito/cronjobs/ipmailer/errores.log

De esta manera arrojará los errores al archivo errores.log

Saludos!

Posted in: GNU/Linux, PHP