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

 

posted @ 2021-01-06 17:29  士为知己  阅读(306)  评论(0)    收藏  举报