132 lines
3.5 KiB
Bash
Executable File
132 lines
3.5 KiB
Bash
Executable File
#!/bin/bash
|
|
# Script de integración para Zabbix External Scripts
|
|
# ==================================================
|
|
#
|
|
# Este script debe colocarse en:
|
|
# /usr/lib/zabbix/externalscripts/cisco_mac_discovery.sh
|
|
#
|
|
# Y configurar permisos:
|
|
# chmod +x /usr/lib/zabbix/externalscripts/cisco_mac_discovery.sh
|
|
# chown zabbix:zabbix /usr/lib/zabbix/externalscripts/cisco_mac_discovery.sh
|
|
|
|
# Configuración
|
|
CONTAINER_NAME="cisco-mac-monitor"
|
|
DATA_FILE="/data/cisco_mac_data.json"
|
|
TIMEOUT=60
|
|
|
|
# Función de logging
|
|
log() {
|
|
echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1" >&2
|
|
}
|
|
|
|
error() {
|
|
echo "[$(date +'%Y-%m-%d %H:%M:%S')] ERROR: $1" >&2
|
|
exit 1
|
|
}
|
|
|
|
# Verificar que el contenedor existe y está corriendo
|
|
check_container() {
|
|
if ! docker ps --format "table {{.Names}}" | grep -q "^${CONTAINER_NAME}$"; then
|
|
error "Contenedor ${CONTAINER_NAME} no está corriendo"
|
|
fi
|
|
}
|
|
|
|
# Ejecutar discovery y obtener datos
|
|
run_discovery() {
|
|
log "Ejecutando discovery en contenedor ${CONTAINER_NAME}"
|
|
|
|
# Ejecutar single-run en el contenedor
|
|
if ! timeout ${TIMEOUT} docker exec ${CONTAINER_NAME} single-run >/dev/null 2>&1; then
|
|
error "Falló la ejecución de discovery (timeout: ${TIMEOUT}s)"
|
|
fi
|
|
|
|
# Verificar que el archivo de datos existe
|
|
if ! docker exec ${CONTAINER_NAME} test -f ${DATA_FILE}; then
|
|
error "Archivo de datos no encontrado: ${DATA_FILE}"
|
|
fi
|
|
|
|
# Obtener y validar JSON
|
|
local json_data
|
|
json_data=$(docker exec ${CONTAINER_NAME} cat ${DATA_FILE})
|
|
|
|
if [[ -z "${json_data}" ]]; then
|
|
error "Archivo de datos está vacío"
|
|
fi
|
|
|
|
# Validar formato JSON básico
|
|
if ! echo "${json_data}" | python3 -m json.tool >/dev/null 2>&1; then
|
|
error "Datos no están en formato JSON válido"
|
|
fi
|
|
|
|
# Retornar datos
|
|
echo "${json_data}"
|
|
}
|
|
|
|
# Función principal
|
|
main() {
|
|
case "${1:-discovery}" in
|
|
"discovery"|"")
|
|
check_container
|
|
run_discovery
|
|
;;
|
|
"status")
|
|
if docker ps --format "table {{.Names}}" | grep -q "^${CONTAINER_NAME}$"; then
|
|
echo "Container ${CONTAINER_NAME} is running"
|
|
exit 0
|
|
else
|
|
echo "Container ${CONTAINER_NAME} is not running"
|
|
exit 1
|
|
fi
|
|
;;
|
|
"logs")
|
|
docker logs --tail 50 ${CONTAINER_NAME}
|
|
;;
|
|
"help"|"-h"|"--help")
|
|
cat << EOF
|
|
Cisco MAC Discovery - Zabbix Integration Script
|
|
|
|
USAGE:
|
|
$0 [COMMAND]
|
|
|
|
COMMANDS:
|
|
discovery Ejecutar discovery y retornar JSON (default)
|
|
status Verificar estado del contenedor
|
|
logs Mostrar logs recientes del contenedor
|
|
help Mostrar esta ayuda
|
|
|
|
EJEMPLOS:
|
|
# Usar en Zabbix Discovery Rule
|
|
cisco_mac_discovery.sh
|
|
|
|
# Verificar estado
|
|
cisco_mac_discovery.sh status
|
|
|
|
# Ver logs para troubleshooting
|
|
cisco_mac_discovery.sh logs
|
|
|
|
CONFIGURACIÓN ZABBIX:
|
|
Discovery Rule:
|
|
- Name: Cisco MAC Discovery
|
|
- Type: External check
|
|
- Key: cisco_mac_discovery.sh
|
|
- Update interval: 5m
|
|
|
|
EOF
|
|
;;
|
|
*)
|
|
error "Comando desconocido: ${1}. Usa 'help' para ver opciones disponibles."
|
|
;;
|
|
esac
|
|
}
|
|
|
|
# Verificar dependencias
|
|
if ! command -v docker >/dev/null 2>&1; then
|
|
error "Docker no está instalado o no está en PATH"
|
|
fi
|
|
|
|
if ! command -v python3 >/dev/null 2>&1; then
|
|
error "Python3 no está instalado o no está en PATH"
|
|
fi
|
|
|
|
# Ejecutar función principal
|
|
main "$@" |