Python - Parsing Cisco AireOS Configuration

As I progress with my learning of Python and network engineering, I'm beginning to find its use cases. I'd like to share something simple I created for a task I was doing often.

Python - Parsing Cisco AireOS Configuration
python aireos

I'm beginning to get the hang of Python and it's capabilities with network operations/monitoring.

My good friend and co-host on the CTS Podcast, François Vergès, has been creating his own scripts to help automate some of the operational tasks he does with Cisco AireOS WLAN controllers.

There was a scenario where I wanted to gather the operating channel and transmit power of a specific number of access points joined to a Cisco 8540 controller.

We can simply look at this via the management GUI or create some sort of Cisco Prime report but I just wanted a simple CLI output.

Cisco AireOS has a CLI command to get this output for the 2.4 GHz and 5 GHz radio:

show advanced 802.11a|b summary

The result of the command is every single access point on the controller but I just wanted a subset of those access points. That's where I need to match a specific pattern based on the access point name using REGEX.

With this script, I am using Python 3.7 with the Regular expression operations library and netmiko library.

François was able to point me in the right direction with using the ConnectHandler to create a my connection and send the command to the WLAN controller:

import re
from netmiko import ConnectHandler

with ConnectHandler(
    ip = 'big-wlan-controller',
    port = 22,
    username = 'admin',
    password = 'test123',
    device_type = 'cisco_wlc_ssh'
) as ch:

    output = ch.send_command("show advanced 802.11a summary")

The full output of the command is placed into a variable called output.

Now, I wanted to use REGEX to match on specific access points. I create a pattern and use a for loop on each line in the variable of output.

pattern = re.compile("b2", re.IGNORECASE)
for ap in output.splitlines():
    if pattern.search(ap) != None:
        print(ap)

In the pattern variable I am using REGEX to simply search for anything containing "b2" which stands for Building 2 in my scenario.

In the for loop, I am taking the output variable and splitting the string by line and applying the pattern search per line. Then I print the output to the screen.

The full script:

import re
from netmiko import ConnectHandler

with ConnectHandler(
    ip = 'big-wlan-controller',
    port = 22,
    username = 'admin',
    password = 'test123',
    device_type = 'cisco_wlc_ssh'
) as ch:

    output = ch.send_command("show advanced 802.11a summary")

pattern = re.compile("b2", re.IGNORECASE)
for ap in output.splitlines():
    if pattern.search(ap) != None:
        print(ap)

The output (sanitized):

$ python regex-test.py
b2-ap-1                     xx:xx:xx:xx:xx:xx  1   ENABLED  UP          (108,112)           3/6 (11 dBm)
b2-ap-2                     xx:xx:xx:xx:xx:xx  1   ENABLED  UP          (100,104,108,112)  *1/7 (19 dBm)
b2-ap-3                     xx:xx:xx:xx:xx:xx  1   ENABLED  UP          52*                *1/6 (17 dBm)
b2-ap-4                     xx:xx:xx:xx:xx:xx  1   ENABLED  UP          36*                *2/5 (12 dBm)
b2-ap-5                     xx:xx:xx:xx:xx:xx  1   ENABLED  UP          136*               *1/6 (17 dBm)

From the output I can see the AP name, MAC address of the AP, up/down status, operating channel, and transmit power. There’s a bit more work to put into the script but it gave me exactly what I needed at the time.