Este es uno de los capítulos del tutorial Trabajando con Systemd. Encontrarás los enlaces a todos los de capítulos, al final de este artículo.
En el capítulo 3 del tutorial sobre trabajar con Systemd, pudiste ver como crear tu propio servicio. Sin embargo, como siempre se ven las cosas mejor con un ejemplo, en este caso, te voy a mostrar como puedes crear un un servicio de Systemd, para monitorizar una página web, de forma sencilla.
¿Que es esto de monitorizar una página web? Simplemente se trata de comprobar que esa url
, esa página web, está arriba, está en funcionamiento. Pero podemos ir mas allá, podemos comprobar, no solo que la página web está levantada, sino que además no se ha modificado. De esta manera, podemos estar al tanto de si el autor de la página introduce algún cambio en la misma.
En mi caso concreto, he utilizado una monitoriza similar a la que te voy a mostrar en este capítulo del tutorial, para ver si se cambia la página de DisplayLink. La que hace referencia a los controladores. De esta forma, si cambia la página, estoy informado y así sabré cuando han sacado un nuevo controlador. Evidentemente, esto no siempre es así, porque en ocasiones, simplemente cambian la página pero no cambian los controladores, pero… Mejor esto que nada.
![Vigila una web con un servicio de Systemd](https://atareao.es/wp-content/uploads/2020/08/vigila-una-web.jpg)
Vigila una web con un servicio de Systemd
Como te decía en la introducción, el objeto de este nuevo capítulo del tutorial, es simplemente mostrarte como puedes monitorizar una página web, una url, con Systemd.
Para hacer esto, hay dos pasos fundamentales. Por un lado se trata de crear el script, y comprobar que este funciona correctamente. Mientras que por el otro lado, tenemos que crear y levantar el servicio. Tanto en un caso como en el otro va a ser algo realmente sencillo, como verás a continuación.
Una breve descripción
Antes de entrar en detalle, indicarte que lo he dividido en varios archivos de Python, para hacerme la vida un poco mas sencilla.
- Por un lado está la parte que se encarga de hacer simplemente el chequeo de la
url
. - En otro archivo, encontrarás la parte correspondiente al API de Telegram.
- Un tercer archivo que es el que se encarga de realizar el bucle y llamar a los otros dos archivos.
- El último archivo, es el que realiza los test.
A parte de estos archivos, está también el correspondiente al servicio, que va por otro lado aparte.
Chequeando la url
Aquí encontrarás al cerebro de la operación. El que se encarga de comprobar dos cosas, por un lado que la url
está arriba, y por el otro si ha sufrido algún cambio o no lo ha sufrido.
Indicarte que esta información, la guarda en un archivo en el directorio temporal. El nombre del archivo es el nombre de la url en cuestión codificada en base 64. De esta manera, podemos recuperarla en diferentes sesiones.
¿Y como sabes si la url
ha sufrido alguna modificación? Para esto, lo que haces es descargar el contenido y hacer una suma de verificación (checksum), y lo guardas en el archivo anterior. En el caso de que varía esa suma de verificación, querrá decir, que la url ha sido modificada y en otro caso, que sigue intacta.
Enviar mensajes a Telegram
Aquí, simplemente he definido una clase sencilla, llamada Chat
, que es la que se encarga de enviar los mensajes. Esto no es mas que un ejemplo del artículo un bot en Python para Telegram (y en una sola línea).
Al final, se trata de llamar a la API de Telegram, utilizando para ello la librería requests
que hace que todo esto sea algo realmente sencillo de implementar.
El monitor
Por casi último, tienes el monitor, que no es ni mas ni menos que un bucle que se encarga de comprobar el funcionamiento, dejando un tiempo de espera entre comprobación y comprobación. Por defecto lo establecido en 300 segundos, 5 minutos que creo que es mas que suficiente para saber el estado de la web… Pero en este caso, como en la mayoría, para gustos los colores.
Aquí he introducido algunos aspectos interesantes. Además de enviar la información a Telegram, he hecho para que la información vaya también al Syslog. Se trata de una forma de saber en que estado se encuentra nuestro servicio. Creo que es algo importante a tener en cuenta. De otra manera, puedes pensar que estás monitorizando una web, y realmente no estás haciendo nada, porque simplemente el servicio está caído y ni siquiera te has dado cuenta.
Por otro lado, hay un archivo llamado env.json
donde tengo configuradas las variables que utilizo. Este archivo, como comprenderás no está subido al repositorio, pero tiene este formato, por si tu quieres hacer algo similar, en lugar de pasar los parámetros al servicio.
{
"token": "",
"chat_id": "",
"timelapse": 300,
"url": ""
}
Test
Por último, respecto a los archivos Python, he creado uno para hacer los test, y comprobar que todo funciona correctamente. Simplemente lo puedes ejecutar y ver que todos los tests han funcionado correctamente.
Indicarte que para hacer los tests, necesitas tener el archivo env.json
que he indicado anteriormente.
El servicio
El archivo de servicio también está en el repositorio, y tiene un aspecto como el que te muestro a continuación,
[Unit]
Description=Monitor url
[Service]
ExecStart=/usr/bin/env python3 /datos/Sync/Programacion/Python/monitoriza-url/src/monitor.py
[Install]
WantedBy=multi-user.target
Ciertamente en tu caso, tendrás que cambiar el directorio en el que se encuentra el archivo monitor.py
.
El primer paso es copiar el servicio a su ubicación. Sin embargo, en lugar de hacerlo para todos los usuarios, solo lo vas a hacer para tu usuario. Para hacer esto, ejecuta la siguiente instrucción,
cp monitor-url.service ~/.config/systemd/user/
A partir de aquí ejecuta, primero,
systemctl --user daemon-reload
systemctl --user enable monitor-url.service
Y luego ya puedes iniciar tu sistema de monitorización web,
systemctl --user start monitor-url.service
systemctl --user status monitor-url.service
¿Funciona o no funciona tu servicio de Systemd?
Se supone que esto ya está funcionando este servicio de Systemd, siempre y cuando hayas cambiado el directorio donde tienes los archivos, y esos pequeños detalles que te he ido contando a lo largo de este capítulo del tutorial. Sin embargo, ¿estás seguro de que está funcionando?¿A dado algún error?
Para esto tienes el Syslog donde puedes ver si esto está funcionando, y los mensajes que se van generando. Por supuesto que también lo puedes ver en Telegram. Pero, y que sucede si tampoco se ve en Telegram?.
¿Como ver la salida del Syslog? Aquí tienes que ir al directorio /var/log
y ejecutar tail -200f /var/log/syslog
. De esta manera puedes ver en tiempo real que es lo que está sucediendo.
Ten en cuenta que a Telegram solo envías los mensajes negativos cuando se ha caído la página web o cuando ha cambiado, pero no sabes si está funcionando en el resto de casos. De la manera que te he indicado en el punto anterior, sabes lo que está sucediendo a tiempo real.
Conclusiones
Con esto tienes un ejemplo completo de como realizar una monitorización utilizando un servicio de Systemd implementado por ti mismo, y por supuesto utilizando Python. Como has podido ver, no es nada complejo, mas bien todo lo contrario.
Más información,
Imagen de portada de Edi Libedinsky en Unsplash