bemade-addons/unifi_integration/doc/examples/show_clients.py
2025-03-26 08:46:03 -04:00

98 lines
3.2 KiB
Python

"""
Script to display UniFi UDM Pro clients in a clear format
"""
from datetime import datetime
from unifi_client import UnifiClient
def format_uptime(uptime_seconds):
"""Format uptime in a readable format"""
if not uptime_seconds:
return "N/A"
days = uptime_seconds // (24 * 3600)
hours = (uptime_seconds % (24 * 3600)) // 3600
minutes = (uptime_seconds % 3600) // 60
if days > 0:
return f"{days}j {hours}h {minutes}m"
elif hours > 0:
return f"{hours}h {minutes}m"
else:
return f"{minutes}m"
def format_bytes(bytes_value):
"""Format bytes in human readable format"""
if not bytes_value:
return "0 B"
for unit in ['B', 'KB', 'MB', 'GB', 'TB']:
if bytes_value < 1024:
return f"{bytes_value:.1f} {unit}"
bytes_value /= 1024
return f"{bytes_value:.1f} PB"
def get_client_type(client):
"""Determine client type based on various fields"""
if client.get('is_wired', False):
return 'Filaire'
elif client.get('is_wireless', False):
return 'WiFi'
return 'Inconnu'
def main():
"""Main function to display clients"""
with UnifiClient() as client:
print("Récupération des clients connectés...")
# Get clients
clients = client.get_clients()
if not clients or 'data' not in clients:
print("Aucun client trouvé ou erreur de connexion")
return
# Get networks for VLAN mapping
networks = client.get_networks()
vlan_names = {
str(net.get('vlan', '')): net.get('name', 'N/A')
for net in networks.get('data', [])
if net.get('vlan') is not None
}
# Group clients by connection type
wired_clients = []
wireless_clients = []
for c in clients['data']:
if c.get('is_wired', False):
wired_clients.append(c)
elif c.get('is_wireless', False):
wireless_clients.append(c)
# Display clients
def print_client_list(client_list, title):
if not client_list:
return
print(f"\n=== Clients {title} ===")
print(f"{'Nom':<25} {'IP':<15} {'MAC':<18} {'VLAN':<15} {'Uptime':<15} {'Trafic TX/RX'}")
print("-" * 100)
for c in sorted(client_list, key=lambda x: x.get('name', '')):
name = c.get('name', c.get('hostname', 'N/A'))
ip = c.get('ip', 'N/A')
mac = c.get('mac', 'N/A')
vlan_id = str(c.get('vlan', ''))
vlan = f"{vlan_id} ({vlan_names.get(vlan_id, 'N/A')})"
uptime = format_uptime(c.get('uptime', 0))
tx = format_bytes(c.get('tx_bytes', 0))
rx = format_bytes(c.get('rx_bytes', 0))
print(f"{name[:25]:<25} {ip:<15} {mac:<18} {vlan[:15]:<15} {uptime:<15} {tx}/{rx}")
print_client_list(wired_clients, "Filaires")
print_client_list(wireless_clients, "WiFi")
print(f"\nTotal: {len(wired_clients)} clients filaires, {len(wireless_clients)} clients WiFi")
if __name__ == "__main__":
main()