283 lines
8.4 KiB
Bash
Executable File
283 lines
8.4 KiB
Bash
Executable File
#!/bin/bash
|
||
|
||
# Script de ejemplo para gestión industrial automatizada
|
||
# Conecta automáticamente a PLCs comunes de una línea de producción
|
||
|
||
set -e
|
||
|
||
echo "🏭 Configuración Industrial NAT para PLCs/SCADA"
|
||
echo "================================================"
|
||
|
||
# Configuración de PLCs comunes
|
||
declare -A PLCS=(
|
||
["10.1.33.11"]="PLC Principal - Línea 1"
|
||
["10.1.33.12"]="PLC Secundario - Línea 1"
|
||
["10.1.33.13"]="HMI Operador"
|
||
["10.1.33.20"]="Historiador SCADA"
|
||
["10.1.33.30"]="Switch Industrial"
|
||
)
|
||
|
||
# Servicios por defecto
|
||
declare -A SERVICES=(
|
||
["vnc"]="5900"
|
||
["web"]="80"
|
||
["modbus"]="502"
|
||
["ssh"]="22"
|
||
["https"]="443"
|
||
)
|
||
|
||
# Función para mostrar menú
|
||
show_menu() {
|
||
echo ""
|
||
echo "Opciones disponibles:"
|
||
echo "1. Conectar a PLC específico"
|
||
echo "2. Conectar a todos los PLCs (VNC)"
|
||
echo "3. Configurar acceso web a PLCs"
|
||
echo "4. Acceso Modbus a controladores"
|
||
echo "5. Ver estado del sistema"
|
||
echo "6. Limpiar todas las conexiones"
|
||
echo "7. Configuración personalizada"
|
||
echo "8. Salir"
|
||
echo ""
|
||
}
|
||
|
||
# Función para conectar a PLC específico
|
||
connect_specific_plc() {
|
||
echo ""
|
||
echo "PLCs disponibles:"
|
||
local i=1
|
||
local plc_ips=()
|
||
|
||
for ip in "${!PLCS[@]}"; do
|
||
echo "$i. $ip - ${PLCS[$ip]}"
|
||
plc_ips+=("$ip")
|
||
((i++))
|
||
done
|
||
|
||
echo ""
|
||
read -p "Selecciona PLC (1-${#PLCS[@]}): " plc_choice
|
||
|
||
if [[ $plc_choice -ge 1 && $plc_choice -le ${#PLCS[@]} ]]; then
|
||
local selected_ip="${plc_ips[$((plc_choice-1))]}"
|
||
|
||
echo ""
|
||
echo "Servicios disponibles:"
|
||
echo "1. VNC (5900) - Acceso gráfico"
|
||
echo "2. Web (80) - Interface web"
|
||
echo "3. HTTPS (443) - Interface web segura"
|
||
echo "4. Modbus (502) - Comunicación industrial"
|
||
echo "5. SSH (22) - Terminal"
|
||
|
||
read -p "Selecciona servicio (1-5): " service_choice
|
||
|
||
case $service_choice in
|
||
1) service="vnc" ;;
|
||
2) service="web" ;;
|
||
3) service="https" ;;
|
||
4) service="modbus" ;;
|
||
5) service="ssh" ;;
|
||
*) echo "Opción inválida"; return ;;
|
||
esac
|
||
|
||
echo ""
|
||
echo "Conectando a ${PLCS[$selected_ip]} ($selected_ip) - $service..."
|
||
|
||
if python3 /home/miguefin/proxytcp/scripts/nat_client.py plc "$selected_ip" "$service" --wait; then
|
||
echo ""
|
||
echo "✅ ¡Conexión establecida exitosamente!"
|
||
echo "📱 Desde PC2 conecta a: 91.99.210.72:(puerto asignado)"
|
||
|
||
if [[ "$service" == "vnc" ]]; then
|
||
echo "🖥️ Usar VNC Viewer con la dirección mostrada arriba"
|
||
elif [[ "$service" == "web" || "$service" == "https" ]]; then
|
||
echo "🌐 Abrir navegador web con la dirección mostrada arriba"
|
||
fi
|
||
else
|
||
echo "❌ Error estableciendo conexión"
|
||
fi
|
||
else
|
||
echo "Selección inválida"
|
||
fi
|
||
}
|
||
|
||
# Función para conectar todos los PLCs
|
||
connect_all_plcs() {
|
||
echo ""
|
||
echo "🔗 Conectando a todos los PLCs con VNC..."
|
||
|
||
for ip in "${!PLCS[@]}"; do
|
||
echo ""
|
||
echo "Conectando a ${PLCS[$ip]} ($ip)..."
|
||
|
||
if python3 /home/miguefin/proxytcp/scripts/nat_client.py plc "$ip" vnc; then
|
||
echo "✅ $ip conectado"
|
||
else
|
||
echo "❌ Error conectando a $ip"
|
||
fi
|
||
|
||
sleep 1
|
||
done
|
||
|
||
echo ""
|
||
echo "📋 Resumen de conexiones:"
|
||
python3 /home/miguefin/proxytcp/scripts/nat_client.py list
|
||
}
|
||
|
||
# Función para acceso web
|
||
setup_web_access() {
|
||
echo ""
|
||
echo "🌐 Configurando acceso web a PLCs..."
|
||
|
||
for ip in "${!PLCS[@]}"; do
|
||
echo "Configurando web para ${PLCS[$ip]} ($ip)..."
|
||
|
||
if python3 /home/miguefin/proxytcp/scripts/nat_client.py plc "$ip" web; then
|
||
echo "✅ Web access configurado para $ip"
|
||
else
|
||
echo "⚠️ No se pudo configurar web para $ip"
|
||
fi
|
||
done
|
||
|
||
echo ""
|
||
echo "🌐 Acceso web configurado. Desde PC2 usar navegador con:"
|
||
python3 /home/miguefin/proxytcp/scripts/nat_client.py list | grep -i web
|
||
}
|
||
|
||
# Función para acceso Modbus
|
||
setup_modbus_access() {
|
||
echo ""
|
||
echo "🔧 Configurando acceso Modbus TCP..."
|
||
|
||
# Solo PLCs que normalmente tienen Modbus
|
||
modbus_plcs=("10.1.33.11" "10.1.33.12")
|
||
|
||
for ip in "${modbus_plcs[@]}"; do
|
||
if [[ -n "${PLCS[$ip]}" ]]; then
|
||
echo "Configurando Modbus para ${PLCS[$ip]} ($ip)..."
|
||
|
||
if python3 /home/miguefin/proxytcp/scripts/nat_client.py plc "$ip" modbus; then
|
||
echo "✅ Modbus TCP configurado para $ip"
|
||
else
|
||
echo "⚠️ No se pudo configurar Modbus para $ip"
|
||
fi
|
||
fi
|
||
done
|
||
|
||
echo ""
|
||
echo "🔧 Acceso Modbus configurado. Configurar cliente Modbus con:"
|
||
python3 /home/miguefin/proxytcp/scripts/nat_client.py list | grep -i modbus
|
||
}
|
||
|
||
# Función para mostrar estado
|
||
show_status() {
|
||
echo ""
|
||
echo "📊 Estado del Sistema NAT Industrial:"
|
||
echo "===================================="
|
||
|
||
if python3 /home/miguefin/proxytcp/scripts/nat_client.py status; then
|
||
echo ""
|
||
echo "📋 Conexiones Activas:"
|
||
python3 /home/miguefin/proxytcp/scripts/nat_client.py list
|
||
else
|
||
echo "❌ No se pudo obtener el estado del sistema"
|
||
echo " Verifica que el contenedor esté ejecutándose"
|
||
fi
|
||
}
|
||
|
||
# Función para limpiar conexiones
|
||
cleanup_connections() {
|
||
echo ""
|
||
echo "🧹 Limpiando todas las conexiones..."
|
||
|
||
# Obtener lista de puertos activos y eliminarlos
|
||
if command -v jq &> /dev/null; then
|
||
# Si jq está disponible, usar parsing JSON
|
||
ports=$(python3 /home/miguefin/proxytcp/scripts/nat_client.py status 2>/dev/null | jq -r '.rules[].external_port' 2>/dev/null)
|
||
else
|
||
# Método alternativo sin jq
|
||
ports=$(python3 /home/miguefin/proxytcp/scripts/nat_client.py list 2>/dev/null | grep -oE '91\.99\.210\.72:([0-9]+)' | cut -d: -f2)
|
||
fi
|
||
|
||
if [[ -n "$ports" ]]; then
|
||
for port in $ports; do
|
||
echo "Eliminando conexión en puerto $port..."
|
||
python3 /home/miguefin/proxytcp/scripts/nat_client.py remove "$port" >/dev/null 2>&1 || true
|
||
done
|
||
echo "✅ Conexiones eliminadas"
|
||
else
|
||
echo "ℹ️ No hay conexiones activas para eliminar"
|
||
fi
|
||
}
|
||
|
||
# Función para configuración personalizada
|
||
custom_config() {
|
||
echo ""
|
||
echo "⚙️ Configuración Personalizada"
|
||
echo "============================="
|
||
|
||
read -p "IP del dispositivo: " custom_ip
|
||
read -p "Puerto del dispositivo: " custom_port
|
||
read -p "Descripción (opcional): " custom_desc
|
||
|
||
echo ""
|
||
echo "Creando conexión personalizada..."
|
||
|
||
if python3 /home/miguefin/proxytcp/scripts/nat_client.py connect "$custom_ip" "$custom_port" --description "$custom_desc" --wait; then
|
||
echo "✅ Conexión personalizada establecida"
|
||
else
|
||
echo "❌ Error creando conexión personalizada"
|
||
fi
|
||
}
|
||
|
||
# Verificar dependencias
|
||
check_dependencies() {
|
||
if ! command -v python3 &> /dev/null; then
|
||
echo "❌ Python3 no está instalado"
|
||
exit 1
|
||
fi
|
||
|
||
if ! python3 -c "import requests" &> /dev/null; then
|
||
echo "⚠️ Módulo 'requests' no está disponible"
|
||
echo " Instalando: pip3 install requests"
|
||
pip3 install requests >/dev/null 2>&1 || {
|
||
echo "❌ No se pudo instalar 'requests'"
|
||
exit 1
|
||
}
|
||
fi
|
||
}
|
||
|
||
# Función principal
|
||
main() {
|
||
echo "🏭 Sistema NAT Industrial - Gestión de PLCs/SCADA"
|
||
echo "=================================================="
|
||
|
||
check_dependencies
|
||
|
||
while true; do
|
||
show_menu
|
||
read -p "Selecciona una opción (1-8): " choice
|
||
|
||
case $choice in
|
||
1) connect_specific_plc ;;
|
||
2) connect_all_plcs ;;
|
||
3) setup_web_access ;;
|
||
4) setup_modbus_access ;;
|
||
5) show_status ;;
|
||
6) cleanup_connections ;;
|
||
7) custom_config ;;
|
||
8)
|
||
echo "👋 ¡Hasta luego!"
|
||
exit 0
|
||
;;
|
||
*)
|
||
echo "❌ Opción inválida. Selecciona 1-8."
|
||
;;
|
||
esac
|
||
|
||
echo ""
|
||
read -p "Presiona Enter para continuar..."
|
||
done
|
||
}
|
||
|
||
# Ejecutar función principal
|
||
main "$@" |