Files
los-vecinos-de-cisco/no/zabbix_integration.sh
T
2025-12-09 12:45:15 +01:00

157 lines
4.0 KiB
Bash
Executable File

#!/bin/bash
# Script de integración simplificado para Zabbix External Scripts
# ==============================================================
#
# Este script debe colocarse en:
# /usr/lib/zabbix/externalscripts/cisco_single_mac_discovery.sh
#
# Y configurar permisos:
# chmod +x /usr/lib/zabbix/externalscripts/cisco_single_mac_discovery.sh
# chown zabbix:zabbix /usr/lib/zabbix/externalscripts/cisco_single_mac_discovery.sh
# Configuración
CONTAINER_IMAGE="cisco-mac-monitor:latest"
TIMEOUT=60
# Función de logging para stderr
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
}
# Función para ejecutar discovery en un dispositivo específico
run_single_device_discovery() {
local host="$1"
local username="$2"
local password="$3"
local hostname="$4"
# Validar parámetros
if [[ -z "$host" ]] || [[ -z "$username" ]] || [[ -z "$password" ]]; then
error "Parámetros requeridos: host, username, password"
fi
log "Ejecutando discovery para dispositivo: $host"
# Construir comando Docker
local docker_cmd=(
docker run --rm --network host
"$CONTAINER_IMAGE"
--host "$host"
--username "$username"
--password "$password"
--quiet
)
# Agregar hostname si se proporciona
if [[ -n "$hostname" ]]; then
docker_cmd+=(--hostname "$hostname")
fi
# Ejecutar con timeout
local json_data
if ! json_data=$(timeout "$TIMEOUT" "${docker_cmd[@]}" 2>/dev/null); then
error "Falló la ejecución de discovery para $host (timeout: ${TIMEOUT}s)"
fi
# Validar JSON
if [[ -z "$json_data" ]]; then
error "No se obtuvieron datos del dispositivo $host"
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 para $host"
fi
# Retornar datos
echo "$json_data"
}
# Función para mostrar ayuda
show_help() {
cat << EOF
Cisco Single MAC Discovery - Zabbix Integration Script
USAGE:
$0 <HOST> <USERNAME> <PASSWORD> [HOSTNAME]
PARAMETERS:
HOST IP address or hostname of Cisco device
USERNAME SSH username
PASSWORD SSH password
HOSTNAME Optional device hostname for identification
EXAMPLES:
# Básico
$0 192.168.1.10 admin cisco123
# Con hostname personalizado
$0 192.168.1.10 admin cisco123 SW-CORE-001
# Para usar en Zabbix Discovery Rule
cisco_mac_discovery.sh {HOST.IP} {$USER} {$PASSWORD} {HOST.NAME}
ZABBIX CONFIGURATION:
Discovery Rule:
- Name: Cisco Device MAC Discovery
- Type: External check
- Key: cisco_mac_discovery.sh[{HOST.IP},{$CISCO_USER},{$CISCO_PASSWORD},{HOST.NAME}]
- Update interval: 5m
Required Macros:
- {$CISCO_USER} : SSH username
- {$CISCO_PASSWORD} : SSH password
EOF
}
# Verificar que Docker esté disponible
check_dependencies() {
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
# Verificar que la imagen existe
if ! docker image inspect "$CONTAINER_IMAGE" >/dev/null 2>&1; then
error "Imagen Docker no encontrada: $CONTAINER_IMAGE"
fi
}
# Función principal
main() {
case "${1:-}" in
"help"|"--help"|"-h"|"")
show_help
exit 0
;;
"test")
check_dependencies
log "Dependencias verificadas correctamente"
exit 0
;;
esac
# Verificar dependencias
check_dependencies
# Obtener parámetros
local host="$1"
local username="$2"
local password="$3"
local hostname="$4"
# Ejecutar discovery
run_single_device_discovery "$host" "$username" "$password" "$hostname"
}
# Ejecutar función principal con todos los argumentos
main "$@"