Files
WPanda/Dev/sw_ip_scan/get_aruba_clients.py
2025-12-15 09:59:42 +01:00

117 lines
4.7 KiB
Python

import os
import re
import csv
import json
import sys
from datetime import datetime
from netmiko import ConnectHandler
from netmiko.exceptions import NetmikoTimeoutException, NetmikoAuthenticationException
def get_aruba_clients(host, username, password):
"""
Connects to an Aruba switch via SSH, gets hostname and client info,
and returns a list of dictionaries, each representing a client.
"""
device = {
'device_type': 'aruba_aoscx',
'host': host,
'username': username,
'password': password,
}
all_clients_data = []
print(f"Csatlakozás a(z) {host} eszközhöz...", file=sys.stderr)
try:
with ConnectHandler(**device) as net_connect:
print("Sikeres csatlakozás. Adatok lekérdezése...", file=sys.stderr)
prompt = net_connect.find_prompt()
switch_hostname = prompt.strip('#> ')
output = net_connect.send_command('show client ip')
ip_pattern = re.compile(r'^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$')
if isinstance(output, str):
lines = output.splitlines()
for line in lines[2:]:
columns = line.split()
if len(columns) >= 4:
potential_ip = columns[-1]
if ip_pattern.match(potential_ip):
client_data = {
'switch_name': switch_hostname,
'mac_address': columns[0],
'interface': columns[1],
'vlan': columns[2],
'ip_address': potential_ip,
}
all_clients_data.append(client_data)
return all_clients_data
print("Hiba: A parancs kimenete nem volt a várt formátumban.", file=sys.stderr)
return None
except NetmikoTimeoutException:
print(f"Hiba: Időtúllépés a(z) {host} eszközhöz való csatlakozáskor.", file=sys.stderr)
return None
except NetmikoAuthenticationException:
print(f"Hiba: Sikertelen hitelesítés a(z) {host} eszközön. Ellenőrizd a jelszót.", file=sys.stderr)
return None
except Exception as e:
print(f"Váratlan hiba történt: {e}", file=sys.stderr)
return None
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ó.", file=sys.stderr)
exit(1)
except json.JSONDecodeError:
print("Hiba: A 'config.json' fájl formátuma érvénytelen.", file=sys.stderr)
exit(1)
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.", file=sys.stderr)
exit(1)
all_switches_clients = []
for ip in SWITCH_IPS:
print(f"\n--- Feldolgozás: {ip} ---", file=sys.stderr)
clients_from_one_switch = get_aruba_clients(ip, USERNAME, PASSWORD)
if clients_from_one_switch:
all_switches_clients.extend(clients_from_one_switch)
print(f"Sikeresen lekérdezve {len(clients_from_one_switch)} kliens a(z) {ip} switch-ről.", file=sys.stderr)
else:
print(f"Nem sikerült adatot lekérdezni a(z) {ip} switch-ről.", file=sys.stderr)
# --- Opcionális: CSV mentés ---
if all_switches_clients:
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_clients_ALL_{timestamp}.csv")
print(f"\nÖsszesen {len(all_switches_clients)} kliens adat gyűjtve. Mentés a(z) {CSV_FILENAME} fájlba...", file=sys.stderr)
fieldnames = all_switches_clients[0].keys()
try:
with open(CSV_FILENAME, 'w', newline='', encoding='utf-8') as csvfile:
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
writer.writerows(all_switches_clients)
print(f"Sikeres mentés a(z) '{CSV_FILENAME}' fájlba.", file=sys.stderr)
except IOError as e:
print(f"Hiba történt a CSV fájl írása közben: {e}", file=sys.stderr)
else:
print("\nEgyetlen switch-ről sem sikerült adatot gyűjteni.", file=sys.stderr)
# --- Fő kimenet: JSON a stdout-ra ---
print(json.dumps(all_switches_clients, indent=2))