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?