This tool exports the complete AP inventory from an Cisco WLC. You can create an CSV export or an table.
Download: https://gist.github.com/lanbugs/e86042c0b2afaf7166637a9aa9711cb6
$ python cisco_wlc_ap_grabber.py -h
usage: cisco_wlc_ap_grabber.py [-h] -H HOST -v SNMP_VERSION
[-C SNMP_COMMUNITY] [-u SNMP_USER]
[-A SNMP_AUTH] [-a SNMP_AUTH_METHOD]
[-X SNMP_PRIVACY] [-x SNMP_PRIVACY_METHOD]
[-L SNMP_SECURITY] [--csv]
Cisco AP WLC inventory grabber Version 0.1 Written by Maximilian Thoma 2017
optional arguments:
-h, --help show this help message and exit
-H HOST WLC IP address
-v SNMP_VERSION SNMP version, valid are 2 or 3
-C SNMP_COMMUNITY SNMP Community (only v2)
-u SNMP_USER SNMP user (v3)
-A SNMP_AUTH SNMP auth password (v3)
-a SNMP_AUTH_METHOD SNMP auth method, valid are MD5 or SHA (v3)
-X SNMP_PRIVACY SNMP privacy password (v3)
-x SNMP_PRIVACY_METHOD
SNMP privacy method, valid are AES or DES (v3)
-L SNMP_SECURITY SNMP security level, valid are no_auth_or_privacy,
auth_without_privacy or auth_with_privacy (v3)
--csv Result should be CSV
Demo result:
>python cisco_wlc_ap_grabber.py -H 1.1.1.1 -v 3 -u username -A authpass -a MD5 -X privpass -x DES -L auth_with_privacy | Name | IP | MAC | Model | Serialnumber | |-------------+---------------+-------------------+-------------------+----------------| | dexxx-acp01 | 10.10.100.1 | 64:F6:9D:C0:FF:EE | AIR-CAP1702I-E-K9 | FCZ11111111 | | dexxx-acp02 | 10.11.100.2 | 58:97:1E:C0:FF:EE | AIR-LAP1142N-E-K9 | FCZ11111111 | | dexxx-acp03 | 10.11.100.3 | 34:DB:FD:C0:FF:EE | AIR-CAP1602I-E-K9 | FGL11111111 | | dexxx-acp04 | 10.11.100.4 | 58:97:1E:C0:FF:EE | AIR-LAP1142N-E-K9 | FCZ11111111 | | dexxx-acp05 | 10.11.100.5 | 64:F6:9D:C0:FF:EE | AIR-CAP1702I-E-K9 | FCZ11111111 | | dexxx-acp06 | 10.11.100.6 | 40:F4:EC:C0:FF:EE | AIR-LAP1142N-E-K9 | FCZ11111111 | | dexxx-acp07 | 10.11.100.7 | 0C:27:24:C0:FF:EE | AIR-CAP1602I-E-K9 | FGL11111111 | | dexxx-acp08 | 10.11.100.8 | 00:78:88:C0:FF:EE | AIR-CAP1702I-E-K9 | FCZ11111111 | | dexxx-acp09 | 10.11.100.9 | 40:F4:EC:C0:FF:EE | AIR-LAP1142N-E-K9 | FCZ11111111 | | dexxx-acp10 | 10.11.100.10 | 44:AD:D9:C0:FF:EE | AIR-CAP1602I-E-K9 | FGL11111111 | | dexxx-acp11 | 10.11.100.11 | 50:0F:80:C0:FF:EE | AIR-AP2802I-E-K9 | FDW11111111 | | dexxx-acp12 | 10.11.100.12 | 74:A0:2F:C0:FF:EE | AIR-CAP1702I-E-K9 | FCZ11111111 | | dexxx-acp13 | 10.11.100.13 | 0C:85:25:C0:FF:EE | AIR-LAP1142N-E-K9 | FCZ11111111 | | dexxx-acp14 | 10.11.100.14 | 74:A0:2F:C0:FF:EE | AIR-CAP1702I-E-K9 | FCZ11111111 | | dexxx-acp15 | 10.11.100.15 | 64:F6:9D:C0:FF:EE | AIR-CAP1702I-E-K9 | FCZ11111111 | | dexxx-acp16 | 10.11.100.16 | C0:62:6B:C0:FF:EE | AIR-LAP1142N-E-K9 | FCZ11111111 | | dexxx-acp17 | 10.11.100.17 | 0C:27:24:C0:FF:EE | AIR-CAP1602I-E-K9 | FGL11111111 | | dexxx-acp18 | 10.11.100.18 | CC:16:7E:C0:FF:EE | AIR-CAP1702I-E-K9 | FCW11111111 | | dexxx-acp19 | 10.11.100.19 | 64:F6:9D:C0:FF:EE | AIR-CAP1702I-E-K9 | FCZ11111111 | | dexxx-acp20 | 10.11.100.20 | 64:F6:9D:C0:FF:EE | AIR-CAP1702I-E-K9 | FCZ11111111 | | dexxx-acp21 | 10.11.100.21 | 64:F6:9D:C0:FF:EE | AIR-CAP1702I-E-K9 | FCZ11111111 | | dexxx-acp22 | 10.11.100.22 | E4:AA:5D:C0:FF:EE | AIR-CAP1702I-E-K9 | FCZ11111111 | | dexxx-acp23 | 10.11.100.23 | F4:CF:E2:C0:FF:EE | AIR-CAP1702I-E-K9 | FCZ11111111 | | dexxx-acp24 | 10.11.100.24 | 00:FE:C8:C0:FF:EE | AIR-CAP1702I-E-K9 | FCZ11111111 | | dexxx-acp25 | 10.11.100.25 | F4:CF:E2:C0:FF:EE | AIR-CAP1702I-E-K9 | FCZ11111111 | | dexxx-acp26 | 10.11.100.26 | 00:FE:C8:C0:FF:EE | AIR-CAP1702I-E-K9 | FCZ11111111 | | dexxx-acp27 | 10.11.100.27 | 64:F6:9D:C0:FF:EE | AIR-CAP1702I-E-K9 | FCZ11111111 | | dexxx-acp28 | 10.11.100.28 | 64:F6:9D:C0:FF:EE | AIR-CAP1702I-E-K9 | FCZ11111111 | | dexxx-acp29 | 10.11.100.29 | 64:F6:9D:C0:FF:EE | AIR-CAP1702I-E-K9 | FCZ11111111 |
Script:
#!/usr/bin/env python
# Need following pip packages
# - easysnmp
# - tabulate
# Checkout blog article to tool
# https://lanbugs.de/netzwerktechnik/hersteller/cisco/cli-tool-export-ap-inventory-from-an-cisco-wireless-lan-controller-wlc/
from easysnmp import Session
import argparse
from tabulate import tabulate
from operator import itemgetter
def main():
####
# ARGS
####
description = """
Cisco AP WLC inventory grabber\nVersion 0.1\nWritten by Maximilian Thoma 2017
"""
aparser = argparse.ArgumentParser(description=description)
aparser.add_argument('-H', dest='host', help='WLC IP address', required=True)
aparser.add_argument('-v', dest='snmp_version', help='SNMP version, valid are 2 or 3', required=True)
aparser.add_argument('-C', dest='snmp_community', help='SNMP Community (only v2)')
aparser.add_argument('-u', dest='snmp_user', help='SNMP user (v3)')
aparser.add_argument('-A', dest='snmp_auth', help='SNMP auth password (v3)')
aparser.add_argument('-a', dest='snmp_auth_method', help='SNMP auth method, valid are MD5 or SHA (v3)')
aparser.add_argument('-X', dest='snmp_privacy', help='SNMP privacy password (v3)')
aparser.add_argument('-x', dest='snmp_privacy_method', help='SNMP privacy method, valid are AES or DES (v3)')
aparser.add_argument('-L', dest='snmp_security',
help='SNMP security level, valid are no_auth_or_privacy, auth_without_privacy or auth_with_privacy (v3)')
aparser.add_argument('--csv', dest='csv', help='Result should be CSV', action='store_true')
args = aparser.parse_args()
####
# Setup SNMP connection
####
if args.snmp_version == "2":
try:
snmp = Session(hostname=args.host, version=2, use_numeric=True)
except Exception as e:
print e
if args.snmp_version == "3":
try:
snmp = Session(
hostname=args.host,
version=3,
security_level=args.snmp_security,
security_username=args.snmp_user,
auth_protocol=args.snmp_auth_method,
auth_password=args.snmp_auth,
privacy_protocol=args.snmp_privacy_method,
privacy_password=args.snmp_privacy,
use_numeric=True
)
except Exception as e:
print e
####
# Init Data Buffer
####
inventory = []
longids = []
####
# SNMP Walk AP Inventory
####
## Get longids for APs
result_longids = snmp.walk(".1.3.6.1.4.1.14179.2.2.1.1.1")
for rl in result_longids:
longids.append(rl.oid.replace(".1.3.6.1.4.1.14179.2.2.1.1.1.", "") + "." + rl.oid_index)
## Collect informations
for id in longids:
# MAC
result_mac = snmp.get(".1.3.6.1.4.1.14179.2.2.1.1.1." + id)
mac = ":".join(["%02s" % hex(ord(m))[2:] for m in result_mac.value]).replace(' ', '0').upper()
# Name
name = snmp.get(".1.3.6.1.4.1.14179.2.2.1.1.3." + id).value
# IP
ip = snmp.get(".1.3.6.1.4.1.14179.2.2.1.1.19." + id).value
# SN
sn = snmp.get(".1.3.6.1.4.1.14179.2.2.1.1.17." + id).value
# Model
model = snmp.get(".1.3.6.1.4.1.14179.2.2.1.1.16." + id).value
inventory.append([name, ip, mac, model, sn])
###
# Sort table
####
inv = sorted(inventory, key=itemgetter(0))
####
# Result
####
if args.csv is True:
print 'Name;IP;MAC;Model;Serialnumber'
for name, ip, mac, model, sn in inv:
print '%s;%s;%s;%s;%s' % (name, ip, mac, model, sn)
else:
print tabulate(inv, headers=["Name", "IP", "MAC", "Model", "Serialnumber"], tablefmt="orgtbl")
if __name__ == "__main__":
main()
I’m trying to run this on Windows and looks like there is no easysnmp support. I tried to do pysnmp and changed the variable still no luck. Any suggestions? I’m new to Python.
Thank so much , this scrip work perfectly !
It will be cooll if is possible to add a port for the snmp query for WLC that are beind a firewall and port 161 can’t be open
cisco_wlc_ap_grabber.py -H HOST -P PORT
Can Anyone tell me how to run this script and where can i run this script?