AirWave:无线控制器和AP相关数据获取
1 import requests 2 import os 3 import urllib.parse 4 import xmltodict 5 6 7 class AirWaveAPI(object): 8 """Aruba networks AirWave API client. 9 Attributes: 10 :username (str): AirWave Login username. 11 :password (str): AirWave Login password. 12 :url (str): AirWave URL. 13 :session (requests.sessions.Session): Session for connection pooling. 14 """ 15 16 def __init__(self, username, password, url, **kwargs): 17 """ 18 :param username: 19 :param password: 20 :param url: 21 :param kwargs: 22 """ 23 self.username = username 24 self.password = password 25 self.url = url 26 self.session = None 27 28 def login(self): 29 """Login to AirWave""" 30 self.session = requests.Session() 31 url = os.path.join(self.url, 'LOGIN').replace('\\', '/') 32 destination = '/' 33 next_action = '' 34 params = { 35 'credential_0': self.username, 36 'credential_1': self.password, 37 'login': 'Log In', 38 'destination': destination, 39 'next_action': next_action 40 } 41 return self.session.post(url, params=params, verify=False) 42 43 def logout(self): 44 self.session.close() 45 46 def api_path(self, path): 47 """ 48 :param path: Path for API URL 49 :return: URL string 'https://xxx.xxx.xxx.xxx/xxxxxx' 50 """ 51 return os.path.join(self.url, path) 52 53 def ap_list(self, ap_ids=None): 54 """ 55 :param ap_ids: (optional[list]): You may specify multiple 56 Access Point IDs. Default is None 57 :return: 58 """ 59 url = self.api_path('ap_list.xml') 60 if ap_ids: 61 params = self.id_params(ap_ids) 62 return self.session.get(url, verify=False, params=params) 63 return self.session.get(url, verify=False) 64 65 def ap_detail(self, ap_id): 66 """Get Access Point detail information. 67 Args: 68 :ap_id (int): Access Point ID. 69 Returns: 70 :Response: requests.models.Response. 71 Usage: :: 72 # >>> res = airwave.ap_detail(123) 73 # >>> res.status_code 74 # 200 75 # >>> res.url 76 # 'https://192.168.1.1/ap_detail.xml?id=123' 77 # >>> res.text # xml output. 78 # '<?xml version="1.0" encoding="utf-8" ...' 79 """ 80 url = self.api_path('ap_detail.xml') 81 params = {'id': ap_id} 82 params = self.urlencode(params) 83 return self.session.get(url, verify=False, params=params) 84 85 def client_detail(self, mac): 86 """Client detail information. 87 Args: 88 :mac (str): Client device's MAC address. 89 Returns: 90 :Response: requests.models.Response. 91 Usage: :: 92 # >>> res = airwave.client_detail('12:34:56:78:90:AB') 93 # >>> res.status_code 94 # 200 95 # >>> res.url 96 # 'https://192.168.1.1/client_detail.xml?mac=12%3A34%3A56%3A78%3A90%3AAB' 97 # >>> res.text # xml output. 98 # '<?xml version="1.0" encoding="utf-8" ...' 99 """ 100 url = self.api_path('client_detail.xml') 101 params = {'mac': mac} 102 params = self.urlencode(params) 103 return self.session.get(url, verify=False, params=params) 104 105 def rogue_detail(self, ap_id): 106 """Rogue detail information. 107 Args: 108 :ap_id (int): Access Point ID. 109 Returns: 110 :Response: requests.models.Response. 111 Usage: :: 112 # >>> res = airwave.rogue_detail(123) 113 # >>> res.status_code 114 # 200 115 # >>> res.text # xml output. 116 # '<?xml version="1.0" encoding="utf-8" ...' 117 """ 118 url = self.api_path('rogue_detail.xml') 119 params = {'id': ap_id} 120 params = self.urlencode(params) 121 return self.session.get(url, verify=False, params=params) 122 123 def latest_report(self, report_definition_id): 124 """Latest report information. 125 Args: 126 :report_definition_id (int): Report definition ID. 127 Please get it from "https://x.x.x.x/reports_definition". 128 Returns: 129 :Response: requests.models.Response. 130 Usage: :: 131 # >>> res = airwave.latest_report(123) 132 # >>> res.status_code 133 # 200 134 # >>> res.url 135 # 'https://192.1681.1/latest_report.xml?id=123' 136 # >>> res.text 137 # '<?xml version="1.0" encoding="utf-8" ...' 138 """ 139 url = self.api_path('latest_report.xml') 140 params = {'id': report_definition_id} 141 params = self.urlencode(params) 142 return self.session.get(url, verify=False, params=params) 143 144 def client_search(self, username): 145 url = self.api_path('client_search.xml') 146 params = {'query': username} 147 params = self.urlencode(params) 148 return self.session.get(url, verify=False, params=params) 149 150 @staticmethod 151 def id_params(ap_ids): 152 """Make access point id string.""" 153 return '&'.join(["id=%s" % ap_id for ap_id in ap_ids]) 154 155 @staticmethod 156 def urlencode(params): 157 """URL Encode.""" 158 params = sorted(params.items()) 159 return urllib.parse.urlencode(params) 160 161 162 if __name__ == '__main__': 163 url = 'https://10.10.10.10/' 164 aw = AirWaveAPI(username='username', password='password', url=url) 165 aw.login() 166 res = aw.ap_list() 167 aw.logout() 168 if res.status_code != 200: 169 exit() 170 ap_list = xmltodict.parse(res.text).get('amp:amp_ap_list').get('ap') 171 for ap in ap_list: 172 print(ap) 173 break