#!/usr/bin/env python3 """ Test script para verificar compatibilidad SSH con dispositivos Cisco antiguos =========================================================================== Este script valida que: 1. Las importaciones funcionen correctamente 2. La clase CiscoSSHConnector se pueda instanciar 3. Los algoritmos de compatibilidad se configuren correctamente 4. No hay errores de sintaxis en el código Uso: python3 test_compatibility.py """ import sys import os def test_imports(): """Test de importaciones básicas""" print("🔍 Testing importaciones...") try: import json import logging import argparse import re import sys from datetime import datetime from typing import List, Dict, Any print("✅ Importaciones estándar OK") except ImportError as e: print(f"❌ Error en importaciones estándar: {e}") return False try: import paramiko print("✅ Paramiko disponible") except ImportError as e: print(f"⚠️ Paramiko no instalado: {e}") print(" Para testing completo, instalar con: pip install paramiko") return "paramiko_missing" return True def test_cisco_monitor_syntax(): """Test de sintaxis del módulo principal""" print("\n🔍 Testing sintaxis de cisco_mac_monitor.py...") try: # Compilar archivo para verificar sintaxis with open('cisco_mac_monitor.py', 'r') as f: source_code = f.read() compile(source_code, 'cisco_mac_monitor.py', 'exec') print("✅ Sintaxis de cisco_mac_monitor.py OK") return True except SyntaxError as e: print(f"❌ Error de sintaxis: {e}") print(f" Línea {e.lineno}: {e.text}") return False except FileNotFoundError: print("❌ Archivo cisco_mac_monitor.py no encontrado") return False except Exception as e: print(f"❌ Error inesperado: {e}") return False def test_class_instantiation(): """Test de instanciación de clases (si paramiko disponible)""" print("\n🔍 Testing instanciación de clases...") try: import paramiko except ImportError: print("⚠️ Saltando test (paramiko no disponible)") return True try: # Import del módulo principal sys.path.insert(0, '.') from cisco_mac_monitor import CiscoSSHConnector, CiscoMacTableParser, ZabbixLLDFormatter # Test CiscoSSHConnector connector = CiscoSSHConnector("test.example.com", "test", "test") print("✅ CiscoSSHConnector se puede instanciar") # Test CiscoMacTableParser parser = CiscoMacTableParser() print("✅ CiscoMacTableParser se puede instanciar") # Test ZabbixLLDFormatter formatter = ZabbixLLDFormatter("test-device") print("✅ ZabbixLLDFormatter se puede instanciar") return True except Exception as e: print(f"❌ Error instanciando clases: {e}") return False def test_ssh_compatibility_config(): """Test de configuración de compatibilidad SSH""" print("\n🔍 Testing configuración de compatibilidad SSH...") try: import paramiko except ImportError: print("⚠️ Saltando test (paramiko no disponible)") return True try: # Test de configuración Transport transport = paramiko.Transport(('dummy', 22)) security_opts = transport.get_security_options() # Verificar algoritmos originales original_kex = list(security_opts.kex) original_host_keys = list(security_opts.key_types) # Aplicar configuración de compatibilidad if 'diffie-hellman-group1-sha1' not in security_opts.kex: security_opts.kex = ['diffie-hellman-group1-sha1'] + list(security_opts.kex) print("✅ diffie-hellman-group1-sha1 añadido a KEX") if 'ssh-rsa' not in security_opts.key_types: security_opts.key_types = ['ssh-rsa'] + list(security_opts.key_types) print("✅ ssh-rsa añadido a host key types") # Verificar que se añadieron assert 'diffie-hellman-group1-sha1' in security_opts.kex assert 'ssh-rsa' in security_opts.key_types print("✅ Configuración de compatibilidad SSH aplicada correctamente") transport.close() return True except Exception as e: print(f"❌ Error configurando SSH compatibility: {e}") return False def main(): """Función principal de testing""" print("=" * 60) print("🧪 CISCO MAC MONITOR - COMPATIBILITY TEST") print("=" * 60) # Test 1: Imports import_result = test_imports() if import_result is False: print("\n❌ FAILED: Importaciones básicas fallaron") return 1 # Test 2: Syntax if not test_cisco_monitor_syntax(): print("\n❌ FAILED: Errores de sintaxis encontrados") return 1 # Test 3: Class instantiation (si paramiko disponible) if import_result is not "paramiko_missing": if not test_class_instantiation(): print("\n❌ FAILED: Error instanciando clases") return 1 # Test 4: SSH compatibility config if not test_ssh_compatibility_config(): print("\n❌ FAILED: Error configurando compatibilidad SSH") return 1 print("\n" + "=" * 60) if import_result == "paramiko_missing": print("✅ PASSED (con limitaciones): Tests básicos completados") print("📝 Para testing completo, instalar: pip install paramiko") else: print("✅ PASSED: Todos los tests completados exitosamente") print("=" * 60) return 0 if __name__ == '__main__': exit(main())