
import json
import os
import re
import csv
from datetime import datetime
from netmiko import ConnectHandler
from netmiko.exceptions import NetmikoTimeoutException, NetmikoAuthenticationException

def get_aruba_firmware(host, username, password):
    """
    Connects to an Aruba switch, retrieves the hostname and firmware version.
    Returns a dictionary with the collected data.
    """
    device = {
        'device_type': 'aruba_aoscx',
        'host': host,
        'username': username,
        'password': password,
    }

    print(f"Csatlakozás a(z) {host} eszközhöz...")
    try:
        with ConnectHandler(**device) as net_connect:
            print(f"Sikeres csatlakozás a(z) {host} eszközhöz. Firmware verzió lekérdezése...")
            
            # Hostname lekérdezése a promptból
            prompt = net_connect.find_prompt()
            switch_hostname = prompt.strip('#> ')

            # Firmware verzió lekérdezése
            output = net_connect.send_command('show version')
            
            firmware_version = "N/A"
            # Reguláris kifejezés a firmware verzió megtalálásához
            match = re.search(r"Version\s+:\s+(.*)", output)
            if match:
                firmware_version = match.group(1).strip()

            return {
                'switch_name': switch_hostname,
                'ip_address': host,
                'firmware_version': firmware_version
            }

    except NetmikoTimeoutException:
        print(f"Hiba: Időtúllépés a(z) {host} eszközhöz való csatlakozáskor.")
        return {'switch_name': 'N/A', 'ip_address': host, 'firmware_version': 'Timeout'}
    except NetmikoAuthenticationException:
        print(f"Hiba: Sikertelen hitelesítés a(z) {host} eszközön.")
        return {'switch_name': 'N/A', 'ip_address': host, 'firmware_version': 'Auth Failed'}
    except Exception as e:
        print(f"Váratlan hiba történt a(z) {host} feldolgozása közben: {e}")
        return {'switch_name': 'N/A', 'ip_address': host, 'firmware_version': f'Error: {e}'}

if __name__ == "__main__":
    # Konfigurációs fájl beolvasása
    try:
        with open('config.json', 'r') as f:
            config = json.load(f)
    except FileNotFoundError:
        print("Hiba: A 'config.json' fájl nem található.")
        exit()
    except json.JSONDecodeError:
        print("Hiba: A 'config.json' fájl formátuma érvénytelen.")
        exit()

    SWITCH_IPS = config.get("switch_ips", [])
    USERNAME = config.get("username")
    PASSWORD = config.get("password")

    if not all([SWITCH_IPS, USERNAME, PASSWORD]):
        print("Hiba: A 'config.json' fájl hiányos. Tartalmaznia kell 'switch_ips', 'username', és 'password' kulcsokat.")
        exit()

    # Kimeneti mappa
    OUTPUT_DIR = "results"
    os.makedirs(OUTPUT_DIR, exist_ok=True)
    timestamp = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
    CSV_FILENAME = os.path.join(OUTPUT_DIR, f"aruba_firmware_versions_{timestamp}.csv")

    all_switches_firmware = []

    for ip in SWITCH_IPS:
        print(f"\n--- Feldolgozás: {ip} ---")
        firmware_data = get_aruba_firmware(ip, USERNAME, PASSWORD)
        if firmware_data:
            all_switches_firmware.append(firmware_data)
            print(f"Sikeresen lekérdezve: {firmware_data['switch_name']} ({firmware_data['ip_address']}) - Verzió: {firmware_data['firmware_version']}")

    if all_switches_firmware:
        print(f"\nÖsszesen {len(all_switches_firmware)} switch adat gyűjtve. Mentés a(z) {CSV_FILENAME} fájlba...")
        
        fieldnames = ['switch_name', 'ip_address', 'firmware_version']
        
        try:
            with open(CSV_FILENAME, 'w', newline='', encoding='utf-8') as csvfile:
                writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
                writer.writeheader()
                writer.writerows(all_switches_firmware)
            print(f"Sikeres mentés a(z) '{CSV_FILENAME}' fájlba.")
        except IOError as e:
            print(f"Hiba történt a CSV fájl írása közben: {e}")
    else:
        print("\nEgyetlen switch-ről sem sikerült adatot gyűjteni.")
