2024-12-30 15:01:17 +00:00
|
|
|
import os
|
2024-12-30 16:12:46 +00:00
|
|
|
import re
|
|
|
|
from dotenv import load_dotenv
|
|
|
|
from netmiko.cisco.cisco_wlc_ssh import CiscoWlcSSH
|
|
|
|
import pandas as pd
|
2024-12-30 15:01:17 +00:00
|
|
|
|
2024-12-30 16:12:46 +00:00
|
|
|
load_dotenv()
|
|
|
|
|
|
|
|
ip = input("Please input the WLC IP: ")
|
|
|
|
user = os.environ.get("USER")
|
|
|
|
password = os.environ.get("PASS")
|
|
|
|
|
|
|
|
wlc = CiscoWlcSSH(
|
|
|
|
ip=ip,
|
|
|
|
username=user,
|
|
|
|
password=password
|
|
|
|
)
|
|
|
|
|
|
|
|
wlc.send_command("config paging disable")
|
|
|
|
ap_summary = wlc.send_command("show ap summary", read_timeout=30)
|
|
|
|
|
|
|
|
pattern = re.compile(r"""
|
|
|
|
(?P<AP_Name>\S+)\s+ # AP Name (non-space characters followed by spaces)
|
|
|
|
(?P<Slots>\d+)\s+ # Slots (digits followed by spaces)
|
|
|
|
(?P<AP_Model>[\w\-]+)\s+ # AP Model (alphanumeric or hyphen)
|
|
|
|
(?P<Ethernet_MAC>[0-9a-fA-F:]+)\s+ # Ethernet MAC address (hexadecimal, colon-separated)
|
|
|
|
(?P<Location>[\w\s\-]+)\s+ # Location (alphanumeric, space, or hyphen)
|
|
|
|
(?P<Country>\w+)\s+ # Country (two uppercase letters)
|
|
|
|
(?P<IP_Address>\d+\.\d+\.\d+\.\d+)\s+ # IP Address (IPv4 format)
|
|
|
|
(?P<Clients>\d+)\s+ # Clients (digits)
|
|
|
|
(?P<DSE_Location>\[.*\]) # DSE Location (list format)
|
|
|
|
""", re.VERBOSE)
|
|
|
|
|
|
|
|
# List to store parsed dictionaries
|
|
|
|
parsed_data = []
|
|
|
|
|
|
|
|
# Process each row in the text (excluding the header and separator)
|
|
|
|
for line in ap_summary.strip().splitlines()[2:]:
|
|
|
|
match = pattern.match(line)
|
|
|
|
if match:
|
|
|
|
parsed_data.append(match.groupdict())
|
|
|
|
|
|
|
|
# Create a DataFrame from the parsed data
|
|
|
|
df = pd.DataFrame(parsed_data)
|
|
|
|
|
|
|
|
# Define the Excel file name
|
|
|
|
file_name = 'ap_data.xlsx'
|
|
|
|
|
|
|
|
with pd.ExcelWriter(file_name, engine='openpyxl') as writer:
|
|
|
|
# Write the dataframe to the first sheet without the header row
|
|
|
|
df.to_excel(writer, index=False, header=False, sheet_name='AP Data')
|
|
|
|
|
|
|
|
# Access the workbook and the sheet
|
|
|
|
workbook = writer.book
|
|
|
|
worksheet = workbook['AP Data']
|
|
|
|
from openpyxl.utils import get_column_letter
|
|
|
|
# Set the column headers to letters (A, B, C, D, etc.)
|
|
|
|
for idx in range(len(df.columns)):
|
|
|
|
# Convert the column index (starting from 0) to Excel letters (A, B, C, ...)
|
|
|
|
worksheet[get_column_letter(idx + 1) + '1'].value = get_column_letter(idx + 1)
|
|
|
|
|
|
|
|
# Set the column width for better readability
|
|
|
|
column_widths = {}
|
|
|
|
for col in df.columns:
|
|
|
|
max_length = max(df[col].astype(str).map(len).max(), len(col)) + 2 # Add a bit of padding
|
|
|
|
column_widths[col] = max_length
|
|
|
|
|
|
|
|
for idx, width in enumerate(column_widths.values()):
|
|
|
|
worksheet.column_dimensions[get_column_letter(idx + 1)].width = width
|
|
|
|
|
|
|
|
# Add a bold header row (A, B, C, D, etc.)
|
|
|
|
for cell in worksheet[1]:
|
|
|
|
cell.font = cell.font.copy(bold=True)
|
|
|
|
|
|
|
|
# Let the user know the file has been saved
|
|
|
|
print(f"Excel file '{file_name}' has been created successfully.")
|