GoRiX blog

A blog about things

Monitoreo Casero de Servicios

June 20, 2024 — n4ch0m4n

Si alguna vez administraste o administrás un servidor sabés que está bueno tener un control sobre los servicios que corre el mismo. Hay infinitas posibilidades, nagios, checkmk, webadmin, etc…ó…algo casero ;-) Vamos a esto último…

Soy de los que le gusta administrar como le gusta a uno, bien basicón y sencillo…

En este caso es una web que se auto-actualiza y te da el status de los servicios que querés saber el estado. Vamos con ello!

La idea es armar un script en bash que cada cierto tiempo haga una revisión de los servicios que le indiquemos y luego genere un html para que sea visual de una manera sencilla.

Primero vamos con algo, tengo dos servidores, uno con systemd y otro con sysvinit, por lo cual el servicio que estemos corriendo deberemos chequearlo de diferente manera segun el sistema de inicio que usemos.

Vamo' con el código!


#!/bin/bash

while true; do

# Función para chequear servicio pasado en $1 con systemd
#check_service() {
#    systemctl is-active --quiet $1
#    if [ $? -eq 0 ]; then
#        echo "ACTIVE"
#    else
#        echo "INACTIVE"
#    fi
#}

# Función para chequear servicio pasado en $1 con sysvinit
check_service() {
    service $1 status > /dev/null 2>&1
    if [ $? -eq 0 ]; then
        echo "ACTIVE"
    else
        echo "INACTIVE"
    fi
}

# Comprobar el estado de los servicios
apache2_status=$(check_service apache2)
xmpp_status=$(check_service prosody)
ssh_status=$(check_service ssh)
fail2ban_status=$(check_service fail2ban)
sql_status=$(check_service mariadb)

En el código verán un while true; do…esto es para hacer un bucle infinito salvo que haya un false por algún lado, pero no será el caso. Faltaría el “done” para cerrar el “do” que luego lo verán más adelante.

Vamos con la explicación, simplemente defino una función (check_service) para chequear los servicios que se le pase a dicha funcion, y como verán está comentada la versión de systemd y descomentada la de sysvinit, obvio comenten y descomenten a conveniencia.

Luego lo siguiente es que le asigno a las variables lo que devuelve la función “chec_service”, osea ACTIVE o INACTIVE.

Este código siguiente sigue a continuación del anterior en el mismo archivo, solo lo separo para explicar, al final subo un .sh con el código completo.

# Generar el archivo HTML
cat <<EOL > /var/www/html/index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Estado de Servicios</title>
    <style>
        body {
            background-color: #828282;
            color: white;
        }
        .ACTIVE {
            color: black;
            font-weight: bold;
            background-color: green;
        }
        .INACTIVE {
            color: white;
            font-weight: bold;
            background-color: red;
        }
    </style>
    <script>
        function refresh() {
            window.location.reload();
        }
        setInterval(refresh, 5000); // actualiza aca 5 segundos
    </script>
</head>
<body>
    <h1>Estado de Servicios</h1>
    <ul>
        <li>apache2: <span class="${sql_status}">$sql_status</span></li>
        <li>mariadb: <span class="${xmpp_status}">$xmpp_status</span></li>
        <li>xmpp: <span class="${xmpp_status}">$xmpp_status</span></li>
        <li>ssh: <span class="${ssh_status}">$ssh_status</span></li>
        <li>fail2ban: <span class="${fail2ban_status}">$fail2ban_status</span></li>
    </ul>
    <h1>Links</h1>
    <ul>
        <li><a href="blog/index.html" target="_blank">Blog</a></li>
    </ul>
</body>
</html>
EOL
sleep 10
done

Bien, acá lo que hacemos es generar el html o bien la web donde luego podremos chequear de manera sencilla los servicios a monitorear.

No me voy a poner a explicar html, pero sencillamente genero una web indicándole la ruta y acomodo las variables que a esta altura tienen el valor ACTIVE o INACTIVE y lo muestro de la manera que mejor me parezca…yo le metí css según el estado.

Igual lo interesante acá es ese “sleep 10” al final, que es lo que hace? Simplemente espera 10 segundos antes de volver a empezar el bucle infinito del que hablé antes.

Osea chequea cada 10 segundos los servicios….pero ojo! dentro del html generado hay otro:

setInterval(refresh, 5000)

Que hace esto, simplemente actualiza la web cada 5 segundos.

Podrás decirme..porque no hacés un cron el chequeo cada 10 segundos y te ahorrás hacer bucle infinito y te ahorras meterlo en el código? La respuesta es sencilla:

  • Flexibilidad: Podés modificar el script para incluir lógica adicional, manejo de errores…todo en el mismo archivo
  • Autonomía: El script se ejecuta de manera autónoma y continua, sin depender de la configuración del sistema, como antes…todo en el mismo archivo

En gorix.xyz podrás ver una muestra del script en acción.

Dejo el código completo para su revisión y mejora!

Tags: Servidores