Autor Tema: Script que envía email si no detecta cambios  (Leído 6545 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado CarlosLSev

  • Sr. Member
  • ****
  • Mensajes: 272
    • Ver Perfil
    • Meteoviso
  • Estación: El Viso del Alcor- ESAND4100000041520A
Script que envía email si no detecta cambios
« en: 10 de Marzo del 2021, 08:04:08 am »
Hola, este script te envía un email si por ejemplo tu fichero realtime.txt no se actualiza en el tiempo que le indíquenos. Muy útil por si se nos queda pillado nuestro pc, Raspberry etc.



php
// Checks to see if a delimited data file is changing or not (flatlined)
// Requires that a text file named flatline-status.txt be on the server with write permissions (CHMOD 666)
// Include this in a page where you want the message to show up if the data is flatlined
// If flatlined an EMail can be sent
// 1-4-09
// 5-9-12 - Updated to PHP 5 timezone function
// 3-8-19 - Fixed some date() issues & removed the mail test variable
// Jim McMurry - jcweather.us - jmcmurry@mwt.net
//
// Configuration
date_default_timezone_set("America/Chicago");       // Zones available at http://us2.php.net/manual/en/timezones.php

$cachefile = 'flatline-status.txt';                 // File to hold cached data for comparison
$watchfile = './clientraw.txt';                     // Data file to watch for changes
$delimit   = " ";                                   // Delimeter used in that file
$offset1   = 4;                                     // Temp
$offset2   = 5;                                     // Humidity
$offset3   = 6;                                     // Baro
$offset4   = 1;                                     // Wind Ave Speed
$offset5   = 72;                                    // DP
$maxage    = 30;                                    // Minutes that the data can remain unchanged w/o email. Recommend minimum 30
$to         = 'Your Email';                    // EMail info
$from      = 'jcweather.us';
$subject   = 'Weather Data Appears Flatlined.';
$subject2  = 'Weather Data Back Online.';
$body      = ' now.  Last data change recorded at ';  // Will go between current date/time & last good date/time in the EMail Body.
$HTMLMsg   = '<div style="text-align:center;">Sorry, Weather Station Data Has Been Disrupted ... Notification Has Been Sent.</div>';
// End of configurable items
$now = time();
$newdata = get_contents( $watchfile , $delimit);        // read the target file
$current = " (" . $newdata[$offset1] . " " . $newdata[$offset2] . " " . $newdata[$offset3] . " " . $newdata[$offset4] . " " . $newdata[$offset5] . ")";
$cachedata = get_contents( $cachefile , ",");           // read the cache file
$cachetime = $cachedata[0];
if ($newdata[0] != -9999 && $cachedata[0] != -9999) {   // was able to read the files
   $flat = ($newdata[$offset1] == $cachedata[1]) &&
         ($newdata[$offset2] == $cachedata[2]) &&
         ($newdata[$offset3] == $cachedata[3]) &&
         ($newdata[$offset4] == $cachedata[4]) &&
         ($newdata[$offset5] == $cachedata[5]);      // compare various offsets
   $status = substr(trim($cachedata[6]), 0, 4);        // capture the "sent" if it's already there
   $WatchSpan = round(($now - $cachetime) / 60);       // minutes since last data change
   if ($flat) {
      if ($WatchSpan >= $maxage) {                    // wait time is expired   
         if ( $status != "sent" ) {                  // mail hasn't been sent yet         
            mail($to, $subject , date("m-d-y H:i") . $body . date( "m-d-y H:i", $cachetime) . $current, 'From: ' . $from);
            $status ="sent "  . date("m-d-y H:i", $now);
         } else {
            $status = trim($cachedata[6]);         // carry over the original entry
         }
         echo $HTMLMsg;                                       // put the message on the screen
      } else {
         $status="watching from " . date("g:i a", $cachetime) . ", now " . date("g:i a", $now) . ", static for " . $WatchSpan . " min";
      }
      $now = $cachetime;                                     // leave timestamp as it was for now
   } else {
      if ( $status == "sent" ) {           // mail previously sent            
         mail($to, $subject2 ,"Back active at " . date("m-d-y g:i a") . $current, 'From: ' . $from);
      }
      $status="active " . date("m-d-y g:i a", $now);
   }
   $fp = fopen($cachefile, "w") or die("HINT: Manually upload a file named " . $cachefile . " and give it write permissions (CHMOD 666).");
   fputs($fp, $now . "," . $newdata[$offset1] . "," . $newdata[$offset2] . "," . $newdata[$offset3] . "," . $newdata[$offset4] . "," . $newdata[$offset5] . ", " . $status);
   fclose($fp);
}   // else we couldn't read one of the files

function get_contents( $rawfile , $delimiter) {
    $rawdata = array();
    $fd = fopen($rawfile, "r");
    if ($fd) {
        $rawinfo = '';
        while (! feof ($fd) ) {
            $rawinfo .= fread($fd, 8192);
        }
        fclose($fd);
      $rawinfo = preg_replace("/\x0D/", "", $rawinfo);
      $rawinfo = preg_replace("/\x0A/", "", $rawinfo);
        $rawdata = explode ($delimiter, $rawinfo);
    } else {
        $rawdata[0]= -9999;
    }
    return $rawdata;
}
?>


Sacado de https://jcweather.us/scripts.php


Mi pregunta se podría modificar para que haga lo contrario.
Por ejemplo si le indicamos el valor de lluvia hoy.
Cuando llueva que nos envíe un e-mail.
Para que funcione debe estar instalado, activado y configurado sendmail.
« Última modificación: 10 de Marzo del 2021, 08:06:44 am por CarlosLSev »

Desconectado jmviper

  • Investigación
  • Hero Member
  • ******
  • Mensajes: 4.403
  • "Vortex Complex"
    • Ver Perfil
    • www.meteoarchena.es
  • Estación: Archena - ESMUR3000000030600B
Re:Script que envía email si no detecta cambios
« Respuesta #1 en: 10 de Marzo del 2021, 22:32:18 pm »
Ummmm lo de modificar scripts.... no es lo mío... probemos este que he creado.

Está en el adjunto de este mensaje y al principio hay que poner unas pocas opciones de configuración:


Código: [Seleccionar]

///////////Configuracion/////////////////////

$realtimefile = '/var/www/html/CumulusMX/realtime.txt';
$realtimecachefile = '/var/www/html/CumulusMX/realtimecache.txt';
$umbraltormenta = 4; //umbral en mm sobre el cual se considera tormenta
$tiempocomprobacion = 10; //minutos para la comprobación de la tormenta
$tiemporeanudacion = 120; //minutos comprobacion de reanudacion de lluvia
$direccionaenviar = '';
$test = false; //true, probar correo. false, no probar

/////////////////////////////////////////////


Las dos primeras opciones para poner la ruta absoluta en la que se encuentra el realtime.txt y la ubicación donde estará el archivo que servirá de comprobación realtimecache.txt que estará por defecto en el mismo sitio que el realtime. Si no lo está mejor ponerlo también en su ruta.

Después viene el umbral de tormenta. Si la cantidad de lluvia caída entre una lectura y otra del realtime es igual o superior a esa cantidad y menor a tiempocomprobacion enviará un correo de tormenta.

Lo recomendable es que el intervalo de ejecución del script en el crontab sea de 10 minutos */10 * * * * php /rutaalscript/correolluvia.php igual que el intervalo de comprobación.

El siguiente campo es el tiempo de reanudación de cuando empiece a llover otra vez. Por ejemplo por defecto están 120 minutos. Si han pasado más de 2 horas desde la última lluvia enviará otro email de que llueve otra vez, todo si no se ha cambiado de día.

El penúltimo campo es a la dirección donde irá el correo. Puede ser la misma que la que envía.

Para probar el envío de correo al último campo test si le ponemos true nos enviará un correo de prueba si ejecutamos el script manualmente en la línea de comandos con php /rutaalscript/correolluvia.php
Ponerlo a false para ejecutarlo normalmente.

Por último y como dices debe de haber un MTA (Agente de transferencia de correo) configurado en la raspi. Yo tengo ssmpt que es muy sencillo y muy ligero y como su nombre indica solo actúa como cliente smtp (que envía correos) y no recibe. Tiene el archivo de configuración en /etc/ssmtp/ssmtp.conf donde se ponen los datos de nuestro smtp (Outlook, Gmail etc etc). PHP usará ese que por defecto será al que apunte /usr/sbin/sendmail

Pruébalo y a ver si funciona como debe en el próximo episodio de lluvia. Lo que lo he probado va ok  :)

Saludos

« Última modificación: 10 de Marzo del 2021, 22:41:59 pm por jmviper »


Archena, Valle de Ricote (Murcia). 120 msnm. 19.622 hab.
Davis Vantage Pro2 Plus

www.meteoarchena.es

Desconectado CarlosLSev

  • Sr. Member
  • ****
  • Mensajes: 272
    • Ver Perfil
    • Meteoviso
  • Estación: El Viso del Alcor- ESAND4100000041520A
Re:Script que envía email si no detecta cambios
« Respuesta #2 en: 14 de Marzo del 2021, 18:53:28 pm »
Mil gracias!!

En principio se adapta a lo que quiero, finalmente lo use con el valor Intensidad (hr) valor 8 de realtime, tiene mas sentido, o esta lloviendo o no.
Me falta la prueba de fuego, probarlo  Lo que si soy incapaz de ejecutar los php desde cron


si ejecuto crontab -e
al final tengo
/*2 * * * * php /var/www/html/webtest/alertalluvia.php
/*2 * * * * php /var/www/html/webtest/alertarealtime.php

Luego hago service cron restart
Lo puse cada 2 minutos para probarlo.
1.- Es el php que me avisa de que llueve
2.- Es el php que me avisa si el fichero realtime no se esta actualizando.

Y nada como el que oye llover

Desconectado CarlosLSev

  • Sr. Member
  • ****
  • Mensajes: 272
    • Ver Perfil
    • Meteoviso
  • Estación: El Viso del Alcor- ESAND4100000041520A
Re:Script que envía email si no detecta cambios
« Respuesta #3 en: 15 de Marzo del 2021, 23:11:15 pm »
Veamos ya conseguir ejecutar el php desde cron. Eso sí solo el que tú me hiciste. El que postee aqui no. Si lo ejecutó mano si va. No lo entiendo, pero ya lo investigaré.
Sobre el script, usando el valor 9 de realtime. Cada vez que esté se modifica me envía un email. Sin querer darte más trabajo. Quizás lo ideal sería usando el valor 8 (intensidad). Si la intensidad se modifica que envíe el email (está lloviendo), si se ejecuta el cron cada 10 minutos que haya otro valor donde indicarle el tiempo a ignorarlo para que no envie el email.. Por ejemplo cada 6 horas.
No se si me explique...

Desconectado jmviper

  • Investigación
  • Hero Member
  • ******
  • Mensajes: 4.403
  • "Vortex Complex"
    • Ver Perfil
    • www.meteoarchena.es
  • Estación: Archena - ESMUR3000000030600B
Re:Script que envía email si no detecta cambios
« Respuesta #4 en: 16 de Marzo del 2021, 11:36:30 am »
Mil gracias!!

Lo que si soy incapaz de ejecutar los php desde cron

si ejecuto crontab -e
al final tengo
/*2 * * * * php /var/www/html/webtest/alertalluvia.php
/*2 * * * * php /var/www/html/webtest/alertarealtime.php

Luego hago service cron restart


Las líneas tienen que empezar con */2 no con /*2 y no hace falta reiniciar el servicio de cron.

Veamos ya conseguir ejecutar el php desde cron. Eso sí solo el que tú me hiciste. El que postee aqui no. Si lo ejecutó mano si va. No lo entiendo, pero ya lo investigaré.
Sobre el script, usando el valor 9 de realtime. Cada vez que esté se modifica me envía un email. Sin querer darte más trabajo. Quizás lo ideal sería usando el valor 8 (intensidad). Si la intensidad se modifica que envíe el email (está lloviendo), si se ejecuta el cron cada 10 minutos que haya otro valor donde indicarle el tiempo a ignorarlo para que no envie el email.. Por ejemplo cada 6 horas.
No se si me explique...

El problema de usar la intensidad es que puede variar a más o a menos, por lo que no sabes si es la primera lluvia del día o no, además de tener que estar comprobando cuándo fue la última vez que hubo intensidad. Eso ya lo hace el script con la lluvia del día que es un valor que no mengua y se sabe si sigue lloviendo o no.
En resumen que tendrías que usar el archivo de caché para comprobar el intervalo de lluvia para que no enviase correo cada dos minutos cuando hubiera intensidad igual que ocurre con la lluvia.
No le veo, pues, ninguna ventaja ya que harían lo mismo solo que con distintos valores.



Archena, Valle de Ricote (Murcia). 120 msnm. 19.622 hab.
Davis Vantage Pro2 Plus

www.meteoarchena.es

Desconectado CarlosLSev

  • Sr. Member
  • ****
  • Mensajes: 272
    • Ver Perfil
    • Meteoviso
  • Estación: El Viso del Alcor- ESAND4100000041520A
Re:Script que envía email si no detecta cambios
« Respuesta #5 en: 21 de Marzo del 2021, 01:44:21 am »
Pues si, me equivoqué al escribirlo aquí.
No me funciona con */10 * * * * php /var/www/html/webtest/alertalluvia.php y si con
*/10 * * * * curl /var/www/html/webtest/alertalluvia.php
Cuando llueva podré probarlo más en condiciones, saludos y gracias

Desconectado jmviper

  • Investigación
  • Hero Member
  • ******
  • Mensajes: 4.403
  • "Vortex Complex"
    • Ver Perfil
    • www.meteoarchena.es
  • Estación: Archena - ESMUR3000000030600B
Re:Script que envía email si no detecta cambios
« Respuesta #6 en: 21 de Marzo del 2021, 08:08:13 am »
Me sorprende que funcione con curl ya que no es una URL sino una ruta local, vamos que probando yo con un archivo php local me dice lo de que no puede resolver la URL.

Tienes instalado php-cli ?? Quizás php se llame con su versión, hay tantas....

Para ver qué tienes instalado de php y qué versión ejecuta sudo dpkg -l | grep php



Archena, Valle de Ricote (Murcia). 120 msnm. 19.622 hab.
Davis Vantage Pro2 Plus

www.meteoarchena.es

Desconectado CarlosLSev

  • Sr. Member
  • ****
  • Mensajes: 272
    • Ver Perfil
    • Meteoviso
  • Estación: El Viso del Alcor- ESAND4100000041520A
Re:Script que envía email si no detecta cambios
« Respuesta #7 en: 21 de Marzo del 2021, 15:52:50 pm »
Ahora que lo dices ese paquete no lo tenía y lo instalé el otro día. Voy a cambiar curl por php y te digo.
Código: [Seleccionar]
root@meteoviso:~# sudo dpkg -l | grep php
ii  libapache2-mod-php                                          2:7.4+75                                   all          server-side, HTML-embedded scripting language (Apache 2 module) (default)
ii  libapache2-mod-php7.4                                       7.4.3-4ubuntu2.4                           amd64        server-side, HTML-embedded scripting language (Apache 2 module)
ii  php                                                         2:7.4+75                                   all          server-side, HTML-embedded scripting language (default)
ii  php-auth-sasl                                               1.0.6-3                                    all          Abstraction of various SASL mechanism responses
ii  php-cli                                                     2:7.4+75                                   all          command-line interpreter for the PHP scripting language (default)
ii  php-common                                                  2:75                                       all          Common files for PHP packages
ii  php-curl                                                    2:7.4+75                                   all          CURL module for PHP [default]
ii  php-gd                                                      2:7.4+75                                   all          GD module for PHP [default]
ii  php-mail                                                    1.4.1-1                                    all          Class that provides multiple interfaces for sending emails
ii  php-net-smtp                                                1.9.0-1                                    all          PHP PEAR module implementing SMTP protocol
ii  php-net-socket                                              1.0.14-2                                   all          Network Socket Interface
ii  php-pear                                                    1:1.10.9+submodules+notgz-1ubuntu0.20.04.2 all          PEAR Base System
ii  php-xml                                                     2:7.4+75                                   all          DOM, SimpleXML, WDDX, XML, and XSL module for PHP [default]
ii  php7.4                                                      7.4.3-4ubuntu2.4                           all          server-side, HTML-embedded scripting language (metapackage)
ii  php7.4-cli                                                  7.4.3-4ubuntu2.4                           amd64        command-line interpreter for the PHP scripting language
ii  php7.4-common                                               7.4.3-4ubuntu2.4                           amd64        documentation, examples and common module for PHP
ii  php7.4-curl                                                 7.4.3-4ubuntu2.4                           amd64        CURL module for PHP
ii  php7.4-gd                                                   7.4.3-4ubuntu2.4                           amd64        GD module for PHP
ii  php7.4-json                                                 7.4.3-4ubuntu2.4                           amd64        JSON module for PHP
ii  php7.4-opcache                                              7.4.3-4ubuntu2.4                           amd64        Zend OpCache module for PHP
ii  php7.4-readline                                             7.4.3-4ubuntu2.4                           amd64        readline module for PHP
ii  php7.4-xml                                                  7.4.3-4ubuntu2.4                           amd64        DOM, SimpleXML, XML, and XSL module for PHP
root@meteoviso:~#

Desconectado jmviper

  • Investigación
  • Hero Member
  • ******
  • Mensajes: 4.403
  • "Vortex Complex"
    • Ver Perfil
    • www.meteoarchena.es
  • Estación: Archena - ESMUR3000000030600B
Re:Script que envía email si no detecta cambios
« Respuesta #8 en: 21 de Marzo del 2021, 17:22:21 pm »
Tienes instalada la versión 7.4 de PHP pero debería de ser invocada también solo como php.

Para ver la versión php -v y para ejecutar código php en su línea de comandos (php-cli) usa php -a
para salir exit

Y por cierto, si estás como root no hace falta poner sudo delante, root tiene ya todos los permisos.


Archena, Valle de Ricote (Murcia). 120 msnm. 19.622 hab.
Davis Vantage Pro2 Plus

www.meteoarchena.es

Desconectado CarlosLSev

  • Sr. Member
  • ****
  • Mensajes: 272
    • Ver Perfil
    • Meteoviso
  • Estación: El Viso del Alcor- ESAND4100000041520A
Re:Script que envía email si no detecta cambios
« Respuesta #9 en: 21 de Marzo del 2021, 20:48:05 pm »
Si lo sabia,
root@meteoviso:~# php -v
PHP 7.4.3 (cli) (built: Oct  6 2020 15:47:56) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.3, Copyright (c), by Zend Technologies
root@meteoviso:~#

En cuanto al comando php -a, entiendo que quieres queejecute el php asi?
Decirte que si ejecuto
php /var/www/html/webtest/alertalluvia.php si me ejecuta el php. Pero si ese mismo comando lo pongo en crontab no
*/10 * * * * php /var/www/html/webtest/alertalluvia.php
Y  asi si va
*/10 * * * * curl www.meteoviso.es/webtest/alertalluvia.php

Desconectado jmviper

  • Investigación
  • Hero Member
  • ******
  • Mensajes: 4.403
  • "Vortex Complex"
    • Ver Perfil
    • www.meteoarchena.es
  • Estación: Archena - ESMUR3000000030600B
Re:Script que envía email si no detecta cambios
« Respuesta #10 en: 21 de Marzo del 2021, 22:46:15 pm »
php -a es para ejecutar comandos de php en la línea de comandos.

Que no vaya en el crontab es raro. Prueba a poner */10 * * * * /usr/bin/php /var/www/html/webtest/alertalluvia.php


Archena, Valle de Ricote (Murcia). 120 msnm. 19.622 hab.
Davis Vantage Pro2 Plus

www.meteoarchena.es

Desconectado jantoni

  • Hero Member
  • *****
  • Mensajes: 3.746
    • Ver Perfil
  • Estación: ESMAD2800000028522A
Re:Script que envía email si no detecta cambios
« Respuesta #11 en: 23 de Marzo del 2021, 09:23:12 am »
Como consejo.

A mi, activar cualquier mailer me da un miedo atroz. Sobre todo Sendmail, que siempre se ha caracterizado por ser un agujero de seguridad.

Os sugiero usar la mensajería de Telegram

Ya hace tiempo, en el subforo de weewx puse las instrucciones.

Yo lo tengo programado para que cada vez que mi Orange Pi o mi Raspberry Pi se reinicien, me manden un mensaje. La Orange se reinicia todos los días, y la Raspi solo cuando se necesita.


Desconectado jantoni

  • Hero Member
  • *****
  • Mensajes: 3.746
    • Ver Perfil
  • Estación: ESMAD2800000028522A
Re:Script que envía email si no detecta cambios
« Respuesta #12 en: 23 de Marzo del 2021, 09:28:53 am »
Esto es lo que manda

Desconectado jmviper

  • Investigación
  • Hero Member
  • ******
  • Mensajes: 4.403
  • "Vortex Complex"
    • Ver Perfil
    • www.meteoarchena.es
  • Estación: Archena - ESMUR3000000030600B
Re:Script que envía email si no detecta cambios
« Respuesta #13 en: 23 de Marzo del 2021, 10:00:21 am »

A mi, activar cualquier mailer me da un miedo atroz. Sobre todo Sendmail, que siempre se ha caracterizado por ser un agujero de seguridad.

Os sugiero usar la mensajería de Telegram


Yo tampoco uso ningún cliente de correo en la opi como sendmail que está como servicio y con conexiones a los servidores de correo, por eso digo de usar ssmtp que solo envía cuando se le pide el email. Esta es su descripción:

Citar
extremely simple MTA to get mail off the system to a mail hub
 A secure, effective and simple way of getting mail off a system to your
 mail hub. It contains no suid-binaries or other dangerous things - no mail
 spool to poke around in, and no daemons running in the background. Mail is
 simply forwarded to the configured mailhost. Extremely easy configuration.
 .
 WARNING: the above is all it does; it does not receive mail, expand aliases
 or manage a queue. That belongs on a mail hub with a system administrator.

Ni tiene un servicio corriendo y solo envía correo cuando se le pide.

Lo de Telegram, será parecido, solo enviará a Telegram cuando se le pida.





Archena, Valle de Ricote (Murcia). 120 msnm. 19.622 hab.
Davis Vantage Pro2 Plus

www.meteoarchena.es

Desconectado jantoni

  • Hero Member
  • *****
  • Mensajes: 3.746
    • Ver Perfil
  • Estación: ESMAD2800000028522A
Re:Script que envía email si no detecta cambios
« Respuesta #14 en: 23 de Marzo del 2021, 10:07:18 am »
Correcto.

Una ventaja sobre el email sí tiene, y es el evitar el entramado de sistemas antispam.