157 lines
4.0 KiB
Bash
Executable File
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 "$@" |