Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

SNM — Simple Network Monitor

Daemon de monitoreo de conectividad por ping persistente, administrado completamente desde una sola CLI (snmcli.sh) — instalación, alta/baja de monitores por host (IP o dominio), y visualización de logs, todo sin salir del script.

Componentes

Archivo Rol
snmcli.sh CLI de administración (punto de entrada único, requiere sudo)
snm.sh Daemon que hace el ping persistente y escribe logs
snm@.service Unit de systemd (template, una instancia por host)
snm.logrotate Rotación de logs

Los cuatro archivos deben estar en el mismo directorio al ejecutar installsnmcli.sh los copia a su ubicación final automáticamente.

Requisitos previos

  • Linux con systemd (el proyecto depende de units @.service y systemctl)
  • logrotate instalado (apt install logrotate / dnf install logrotate según distro)
  • ping disponible (paquete iputils-ping en Debian/Ubuntu, suele venir preinstalado)
  • getent disponible (parte de glibc, viene por defecto en casi cualquier distro)
  • Bash (el script usa sintaxis específica de bash, no es POSIX sh puro)

Instalación

sudo ./snmcli.sh install

Esto:

  • Crea el usuario de sistema snm (sin login, sin privilegios extra)
  • Copia snm.sh a /opt/snm/snm.sh
  • Instala la unit de systemd en /etc/systemd/system/snm@.service
  • Instala la config de logrotate en /etc/logrotate.d/snm
  • Crea /var/log/snm/ con los permisos correctos
  • Hace systemctl daemon-reload

Es idempotente: si ya está instalado, no rompe nada al volver a correrlo.

Referencia rápida de comandos

Comando Requiere sudo Qué hace
install Instalación inicial (usuario, binario, systemd, logrotate)
add <host> Crea y arranca un monitor para una IP o dominio
start <host> Inicia un monitor ya existente
stop <host> Detiene un monitor
restart <host> Reinicia un monitor
remove <host> Detiene, deshabilita y opcionalmente borra logs
list No* Lista todos los monitores y su estado
view <host> No* Menú interactivo: eventos, latencia, estado
uninstall Elimina SNM por completo (con confirmación)
help No Muestra la ayuda
-i / --interactive Shell interactivo con todos los comandos anteriores

* list y view solo leen datos, así que no necesitan root en teoría — pero como todo lo demás sí lo requiere, se recomienda correr siempre con sudo para no tener que acordarte cuál comando lo necesita y cuál no.

Uso — todo desde snmcli.sh

Agregar un monitor (IP o dominio)

sudo ./snmcli.sh add 172.17.0.0
sudo ./snmcli.sh add example.com

Antes de habilitar el servicio, valida que el host resuelva (getent/ping) para evitar que systemd quede en loop de reinicio por un typo.

Listar todos los monitores y su estado

sudo ./snmcli.sh list
HOST                           SYSTEMD      ESTADO
----------------------------------------------------------
172.17.0.0                     active       UP
example.com                    active       DOWN
  • SYSTEMD: estado del servicio (active/inactive/failed)
  • ESTADO: estado real del daemon según el último ping (UP/DOWN)

Ver el detalle de un monitor (eventos, latencia, estado)

sudo ./snmcli.sh view 172.17.0.0

Abre un menú interactivo:

== Monitor: 172.17.0.0 ==
1) Ver eventos (tail -f, Ctrl+C para salir)
2) Ver latencia (tail -f, Ctrl+C para salir)
3) Ver estado actual
4) Ver systemctl status
5) Volver

Ctrl+C durante las opciones 1 o 2 interrumpe solo el tail -f y te regresa a este menú — no cierra snmcli.sh ni te saca del modo interactivo (-i) si estabas ahí.

Iniciar / detener / reiniciar

sudo ./snmcli.sh start 172.17.0.0
sudo ./snmcli.sh stop 172.17.0.0
sudo ./snmcli.sh restart 172.17.0.0

Eliminar un monitor

sudo ./snmcli.sh remove 172.17.0.0

Detiene y deshabilita el servicio, y pregunta si además quieres borrar sus logs históricos.

Desinstalar todo

sudo ./snmcli.sh uninstall

Detiene y deshabilita todas las instancias, borra /opt/snm, la unit de systemd y la config de logrotate. Pregunta por separado si también quieres borrar los logs en /var/log/snm.

Ayuda

./snmcli.sh help

Modo interactivo (-i)

En vez de escribir sudo ./snmcli.sh <comando> <host> cada vez, puedes entrar a un shell propio y escribir los comandos línea a línea, sin el prefijo:

sudo ./snmcli.sh -i
SNM — shell interactivo
Escribe los mismos comandos sin 'sudo ./snmcli.sh' (ej: 'add 172.17.0.0', 'list').
Escribe 'help' para ver todos los comandos, 'exit' o Ctrl+D para salir.
snm> add 172.17.0.0
snm> list
snm> view 172.17.0.0
snm> exit
  • Acepta los mismos comandos que el modo normal (add, start, stop, restart, remove, list, view, uninstall, help).
  • Flecha arriba navega el historial de la sesión.
  • exit, quit, q o Ctrl+D salen del shell.
  • Como sigue siendo el mismo proceso con privilegios root (heredados del sudo inicial), no vuelve a pedir contraseña entre comandos.
  • Un comando mal escrito o sin argumentos (ej. add sin host) muestra el error correspondiente y te deja seguir en el shell — no te saca al prompt del sistema.

Estructura de logs (por host)

Para un host 172.17.0.0, en /var/log/snm/:

  • events_172.17.0.0.log — transiciones UP/DOWN con timestamp y duración de caídas
  • latency_172.17.0.0.log — CSV timestamp,host,rtt_ms de cada ping exitoso
  • .status_172.17.0.0 — estado actual en una línea (UP/DOWN)

Rotación: diaria, retiene 14 días, comprime, rota también al superar 20 MB.

Notas técnicas

  • Cada host monitoreado corre como instancia independiente de systemd (snm@<host>.service), aislada de las demás.
  • El daemon corre como usuario snm (no root), con la capability mínima CAP_NET_RAW necesaria para ICMP crudo.
  • snmcli.sh es solo el orquestador — no modifica la lógica de ping/estado, que vive en snm.sh.

Troubleshooting rápido

Síntoma Causa probable Verificación
snmcli.sh pide sudo aunque ya lo usaste No se ejecutó como root real (ej. dentro de un contenedor sin privilegios) echo $EUID debe ser 0
add falla con "no se pudo resolver" El host no responde a getent/ping desde este servidor Prueba manualmente: ping -c1 <host>
status=203/EXEC en systemctl status /opt/snm/snm.sh no existe o perdió el +x ls -la /opt/snm/snm.sh
list no muestra un host que agregaste El nombre de host tiene caracteres distintos entre add y lo que buscas (mayúsculas, etc.) Usa exactamente el mismo string en todos los comandos
Ctrl+C en view (opción 1/2) cierra todo snmcli.sh Versión desactualizada del script (bug corregido) Verifica que tu snmcli.sh tenga trap 'true' INT cerca del inicio del archivo
Unit file ... does not exist al hacer start/stop manualmente con systemctl El host no está agregado todavía Agrégalo primero con sudo ./snmcli.sh add <host>

Después de editar manualmente snm@.service fuera de snmcli.sh, siempre:

sudo systemctl daemon-reload
sudo ./snmcli.sh restart <host>

About

Daemon de monitoreo de conectividad por ping persistente, administrado completamente desde una sola CLI — instalación, alta/baja de monitores por host (IP o dominio), y visualización de logs, todo sin salir del script.

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages