@@ -228,3 +228,89 @@ def routes(self, filters: Dict[str, Union[str, Pattern]]=None, order_by: str=Non
228228 data = sorted (data , key = lambda x : x [order_by ] if order_by in x .keys () else x ['_id' ])
229229
230230 return data
231+
232+ def port_forwarding (self , filters : Dict [str , Union [str , Pattern ]]= None , order_by : str = None ) -> list :
233+ """
234+ List forwarded ports.
235+
236+ :param filters: dict of k/v pairs; string is compiled to regex
237+ :param order_by: order by a key; defaults to '_id'
238+ :return: A list of forwarded ports as dicts (see below)
239+ _id
240+ dst_port
241+ fwd
242+ fwd_port
243+ name
244+ proto
245+ site_id
246+ src
247+ """
248+ r = self ._session .get ("{}/api/s/{}/rest/portforward" .format (self ._baseurl , self ._site , verify = self ._verify_ssl ), data = "json={}" )
249+ self ._current_status_code = r .status_code
250+
251+ if self ._current_status_code == 401 :
252+ raise LoggedInException ("Invalid login, or login has expired" )
253+
254+ data = r .json ()['data' ]
255+
256+ if filters :
257+ for term , value in filters .items ():
258+ value_re = value if isinstance (value , Pattern ) else re .compile (value )
259+
260+ data = [x for x in data if term in x .keys () and re .fullmatch (value_re , x [term ])]
261+
262+ if order_by :
263+ data = sorted (data , key = lambda x : x [order_by ] if order_by in x .keys () else x ['_id' ])
264+
265+ return data
266+
267+ def list_aps (self , filters : Dict [str , Union [str , Pattern ]]= None , order_by : str = None ) -> list :
268+ """
269+ List nearby access points (and identify potential rogue APs).
270+
271+ :param filters: dict of k/v pairs; string is compiled to regex
272+ :param order_by: order by a key; defaults to '_id'
273+ :return: A list of access_points as dicts (see below)
274+ _id
275+ age
276+ ap_mac
277+ band
278+ bssid
279+ bw
280+ center_freq
281+ channel
282+ essid
283+ freq
284+ is_adhoc
285+ is_rogue
286+ is_ubnt
287+ last_seen
288+ noise
289+ oui
290+ radio
291+ radio_name
292+ report_time
293+ rssi
294+ rssi_age
295+ security
296+ signal
297+ site_id
298+ """
299+ r = self ._session .get ("{}/api/s/{}/stat/rogueap" .format (self ._baseurl , self ._site , verify = self ._verify_ssl ), data = "json={}" )
300+ self ._current_status_code = r .status_code
301+
302+ if self ._current_status_code == 401 :
303+ raise LoggedInException ("Invalid login, or login has expired" )
304+
305+ data = r .json ()['data' ]
306+
307+ if filters :
308+ for term , value in filters .items ():
309+ value_re = value if isinstance (value , Pattern ) else re .compile (value )
310+
311+ data = [x for x in data if term in x .keys () and re .fullmatch (value_re , x [term ])]
312+
313+ if order_by :
314+ data = sorted (data , key = lambda x : x [order_by ] if order_by in x .keys () else x ['_id' ])
315+
316+ return data
0 commit comments