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