#!/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 [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 "$@"