python-unifi-client 1.2.6__tar.gz → 1.2.7__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python_unifi_client
3
- Version: 1.2.6
3
+ Version: 1.2.7
4
4
  Home-page: https://github.com/compdat-llc/unifi-client-python
5
5
  Author: Michael Lapinski
6
6
  Author-email: michaellapinski787@gmail.com
@@ -10,8 +10,6 @@ import http.client as http_client
10
10
  import logging
11
11
  import base64
12
12
 
13
-
14
-
15
13
  # Custom exceptions mirroring PHP equivalents
16
14
  class CurlExtensionNotLoadedException(Exception):
17
15
  def __init__(self):
@@ -266,13 +264,13 @@ class Client:
266
264
  return self.fetch_results(f"/api/s/{self._site}/stat/sta", prefix_path=True)
267
265
 
268
266
  def block_client(self, mac):
269
- return self._request(f"/api/s/{self._site}/cmd/stamgr", method='POST', payload={'cmd': 'block-sta', 'mac': mac})
267
+ return self.fetch_results(f"/api/s/{self._site}/cmd/stamgr", method='POST', payload={'cmd': 'block-sta', 'mac': mac})
270
268
 
271
269
  def unblock_client(self, mac):
272
- return self._request(f"/api/s/{self._site}/cmd/stamgr", method='POST', payload={'cmd': 'unblock-sta', 'mac': mac})
270
+ return self.fetch_results(f"/api/s/{self._site}/cmd/stamgr", method='POST', payload={'cmd': 'unblock-sta', 'mac': mac})
273
271
 
274
272
  def reconnect_client(self, mac):
275
- return self._request(f"/api/s/{self._site}/cmd/stamgr", method='POST', payload={'cmd': 'kick-sta', 'mac': mac})
273
+ return self.fetch_results(f"/api/s/{self._site}/cmd/stamgr", method='POST', payload={'cmd': 'kick-sta', 'mac': mac})
276
274
 
277
275
  def authorize_guest(self, mac, minutes, up=None, down=None, megabytes=None, ap_mac=None):
278
276
  payload = {
@@ -284,7 +282,7 @@ class Client:
284
282
  if down is not None: payload['down'] = down
285
283
  if megabytes is not None: payload['bytes'] = megabytes
286
284
  if ap_mac is not None: payload['ap_mac'] = ap_mac.lower()
287
- return self._request(f"/api/s/{self._site}/cmd/stamgr", method='POST', payload=payload)
285
+ return self.fetch_results(f"/api/s/{self._site}/cmd/stamgr", payload=payload)
288
286
 
289
287
  """
290
288
  Unauthorize a client device.
@@ -294,37 +292,32 @@ class Client:
294
292
  throws Exception
295
293
  """
296
294
  def unauthorize_guest(self, mac):
297
- return self._request(
295
+ return self.fetch_results(
298
296
  f"/api/s/{self._site}/cmd/stamgr",
299
- method='POST',
300
297
  payload={'cmd': 'unauthorize-guest', 'mac': mac}
301
298
  )
302
299
 
303
300
  def reconnect_sta(self, mac):
304
- return self._request(
301
+ return self.fetch_results(
305
302
  f"/api/s/{self._site}/cmd/stamgr",
306
- method='POST',
307
303
  payload={'cmd': 'kick-sta', 'mac': mac.lower()}
308
304
  )
309
305
 
310
306
  def block_sta(self, mac):
311
- return self._request(
307
+ return self.fetch_results(
312
308
  f"/api/s/{self._site}/cmd/stamgr",
313
- method='POST',
314
309
  payload={'cmd': 'block-sta', 'mac': mac.lower()}
315
310
  )
316
311
 
317
312
  def unblock_sta(self, mac):
318
- return self._request(
313
+ return self.fetch_results(
319
314
  f"/api/s/{self._site}/cmd/stamgr",
320
- method='POST',
321
315
  payload={'cmd': 'unblock-sta', 'mac': mac.lower()}
322
316
  )
323
317
 
324
318
  def forget_sta(self, mac):
325
- return self._request(
319
+ return self.fetch_results(
326
320
  f"/api/s/{self._site}/cmd/stamgr",
327
- method='POST',
328
321
  payload={'cmd': 'forget-sta', 'mac': mac}
329
322
  )
330
323
 
@@ -375,7 +368,7 @@ class Client:
375
368
  """
376
369
  Remove a user by ID
377
370
  """
378
- return self._request(f"/api/s/{self._site}/rest/user/{user_id}", method='DELETE')
371
+ return self.fetch_results(f"/api/s/{self._site}/rest/user/{user_id}",)
379
372
 
380
373
  def get_user(self, user_id: str):
381
374
  """
@@ -410,9 +403,8 @@ class Client:
410
403
  """
411
404
  Forget (remove) any record of a client's MAC from the site.
412
405
  """
413
- return self._request(
406
+ return self.fetch_results(
414
407
  f"/api/s/{self._site}/cmd/sitemgr",
415
- method='POST',
416
408
  payload={'cmd': 'forget-sta', 'mac': mac}
417
409
  )
418
410
 
@@ -420,13 +412,13 @@ class Client:
420
412
 
421
413
  ## ------------- Make sure these are included in the PHP files ------
422
414
  def get_clients_summary(self):
423
- return self._request(f"/api/s/{self._site}/stat/summary/client")
415
+ return self.fetch_results(f"/api/s/{self._site}/stat/summary/client")
424
416
 
425
417
  def get_user_groups(self):
426
- return self._request(f"/api/s/{self._site}/list/usergroup")
418
+ return self.fetch_results(f"/api/s/{self._site}/list/usergroup")
427
419
 
428
420
  def get_user_group(self, group_id):
429
- return self._request(f"/api/s/{self._site}/list/usergroup/{group_id}")
421
+ return self.fetch_results(f"/api/s/{self._site}/list/usergroup/{group_id}")
430
422
 
431
423
  def create_user_group(self, group_name: str, group_dn: int = -1, group_up: int = -1):
432
424
  """
@@ -457,16 +449,14 @@ class Client:
457
449
  'qos_rate_max_up': group_up,
458
450
  'site_id': site_id,
459
451
  }
460
- return self._request(
452
+ return self.fetch_results(
461
453
  f"/api/s/{self._site}/rest/usergroup",
462
- method='PUT',
463
454
  payload=payload
464
455
  )
465
456
 
466
457
  def delete_user_group(self, group_id):
467
- return self._request(
458
+ return self.fetch_results(
468
459
  f"/api/s/{self._site}/cmd/usergroup/{group_id}",
469
- method='DELETE'
470
460
  )
471
461
 
472
462
 
@@ -477,7 +467,7 @@ class Client:
477
467
  """
478
468
  Fetch AP groups for the current site.
479
469
  """
480
- return self._request(f"/v2/api/site/{self._site}/apgroups")
470
+ return self.fetch_results(f"/v2/api/site/{self._site}/apgroups")
481
471
 
482
472
  def create_apgroup(self, name: str, description: str = None) -> dict:
483
473
  """Create a new AP group with optional description."""
@@ -542,7 +532,7 @@ class Client:
542
532
  return self.fetch_results(f"/api/s/{self._site}/rest/rogueknown")
543
533
 
544
534
  def get_site(self, site_id) -> str:
545
- return self._request(f"/api/s/{site_id}/self")
535
+ return self.fetch_results(f"/api/s/{site_id}/self")
546
536
 
547
537
  def create_site(self, description: str):
548
538
  """
@@ -571,9 +561,8 @@ class Client:
571
561
  self._curl_method = "GET"
572
562
 
573
563
  def delete_site(self, site_id):
574
- return self._request(
564
+ return self.fetch_results(
575
565
  f"/api/s/{site_id}",
576
- method='DELETE',
577
566
  payload={'site': site_id, 'cmd': 'delete-site'}
578
567
  )
579
568
 
@@ -761,13 +750,13 @@ class Client:
761
750
  """
762
751
  Retrieve WLAN configuration by ID
763
752
  """
764
- return self._request(f"/api/s/{self._site}/rest/wlanconf/{wlan_id}")
753
+ return self.fetch_results(f"/api/s/{self._site}/rest/wlanconf/{wlan_id}")
765
754
 
766
755
  def list_wlanconf(self):
767
756
  """
768
757
  List all WLAN configurations on the site.
769
758
  """
770
- return self._request(f"/api/s/{self._site}/rest/wlanconf")
759
+ return self.fetch_results(f"/api/s/{self._site}/rest/wlanconf")
771
760
 
772
761
  def create_wlan(
773
762
  self,
@@ -816,9 +805,8 @@ class Client:
816
805
  data['ap_group_ids'] = ap_group_ids
817
806
 
818
807
  # Perform the request and return True on HTTP 200
819
- self._request(
808
+ self.fetch_results(
820
809
  f"/api/s/{self._site}/add/wlanconf",
821
- method='POST',
822
810
  payload=data
823
811
  )
824
812
  return self._last_response_code == 200
@@ -861,9 +849,8 @@ class Client:
861
849
  data['x_passphrase'] = x_passphrase.strip()
862
850
  if name is not None:
863
851
  data['name'] = name.strip()
864
- return self._request(
852
+ return self.fetch_results(
865
853
  f"/api/s/{self._site}/rest/wlanconf/{wlan_id}",
866
- method='PUT',
867
854
  payload=data
868
855
  )
869
856
 
@@ -871,7 +858,7 @@ class Client:
871
858
  """
872
859
  Delete a WLAN configuration by ID
873
860
  """
874
- return self._request(
861
+ return self.fetch_results(
875
862
  f"/api/s/{self._site}/rest/wlanconf/{wlan_id.strip()}"
876
863
  )
877
864
 
@@ -947,9 +934,8 @@ class Client:
947
934
  """
948
935
  Expire (unauthorize) a guest session immedietely
949
936
  """
950
- return self._request(
937
+ return self.fetch_results(
951
938
  f"/api/s/{self._site}/cmd/stamgr",
952
- method='POST',
953
939
  payload={'cmd': 'unauthorize-guest', 'mac': mac}
954
940
  )
955
941
 
@@ -957,7 +943,7 @@ class Client:
957
943
  """
958
944
  List all hotspot vouchers on the site.
959
945
  """
960
- return self._request(f"/api/s/{self._site}/stat/voucher")
946
+ return self.fetch_results(f"/api/s/{self._site}/stat/voucher")
961
947
 
962
948
  def create_voucher(
963
949
  self,
@@ -995,9 +981,8 @@ class Client:
995
981
  if megabytes is not None:
996
982
  payload['bytes'] = megabytes
997
983
 
998
- return self._request(
984
+ return self.fetch_results(
999
985
  f"/api/s/{self._site}/cmd/hotspot",
1000
- method='POST',
1001
986
  payload=payload
1002
987
  )
1003
988
 
@@ -1009,9 +994,8 @@ class Client:
1009
994
  """
1010
995
  payload = {'_id': voucher_id, 'cmd': 'delete-voucher'}
1011
996
 
1012
- return self._request(
997
+ return self.fetch_results(
1013
998
  f"/api/s/{self._site}/cmd/hotspot",
1014
- method='POST',
1015
999
  payload=payload
1016
1000
  )
1017
1001
 
@@ -1019,7 +1003,7 @@ class Client:
1019
1003
  """
1020
1004
  List all client sessions (stat/session) for the site
1021
1005
  """
1022
- return self._request(f"/api/s/{self._site}/stat/session")
1006
+ return self.fetch_results(f"/api/s/{self._site}/stat/session")
1023
1007
 
1024
1008
  def stat_hourly_site(self, start: int = None, end: int = None, attribs: list = None):
1025
1009
  """
@@ -1040,9 +1024,8 @@ class Client:
1040
1024
  'end': end
1041
1025
  }
1042
1026
 
1043
- return self._request(
1027
+ return self.fetch_results(
1044
1028
  f"/api/s/{self._site}/stat/report/hourly.site",
1045
- method='GET',
1046
1029
  payload=payload
1047
1030
  )
1048
1031
 
@@ -1172,10 +1155,10 @@ class Client:
1172
1155
  return self.fetch_results(f"/api/s/{self._site}/stat/report/monthly.gw", payload=payload)
1173
1156
 
1174
1157
  def list_network(self, network_id: str = ''):
1175
- return self._request(f"/api/s/{self._site}/rest/networkconf{network_id.strip()}")
1158
+ return self.fetch_results(f"/api/s/{self._site}/rest/networkconf{network_id.strip()}")
1176
1159
 
1177
1160
  def list_networkconf(self, network_id: str = ''):
1178
- return self._request(f"/api/s/{self._site}/rest/networkconf{network_id.strip()}")
1161
+ return self.fetch_results(f"/api/s/{self._site}/rest/networkconf{network_id.strip()}")
1179
1162
 
1180
1163
  def list_backups(self):
1181
1164
  payload = {'cmd': 'list-backups'}
@@ -1186,15 +1169,14 @@ class Client:
1186
1169
  """
1187
1170
  Get a specific network configuration by ID
1188
1171
  """
1189
- return self._request(f"/api/s/{self._site}/rest/networkconf/{network_id}")
1172
+ return self.fetch_results(f"/api/s/{self._site}/rest/networkconf/{network_id}")
1190
1173
 
1191
1174
  def create_network(self, payload: dict):
1192
1175
  """
1193
1176
  Create a new network configuration
1194
1177
  """
1195
- return self._request(
1178
+ return self.fetch_results(
1196
1179
  f"/api/s/{self._site}/rest/networkconf",
1197
- method='POST',
1198
1180
  payload=payload
1199
1181
  )
1200
1182
 
@@ -1202,9 +1184,8 @@ class Client:
1202
1184
  """
1203
1185
  Update an existing network configuration
1204
1186
  """
1205
- return self._request(
1187
+ return self.fetch_results(
1206
1188
  f"/api/s/{self._site}/rest/networkconf/{network_id}",
1207
- method='PUT',
1208
1189
  payload=update_fields
1209
1190
  )
1210
1191
 
@@ -1212,9 +1193,8 @@ class Client:
1212
1193
  """
1213
1194
  Delete a network configuration by ID
1214
1195
  """
1215
- return self._request(
1196
+ return self.fetch_results(
1216
1197
  f"/api/s/{self._site}/rest/networkconf{network_id.strip()}",
1217
- method='DELETE'
1218
1198
  )
1219
1199
 
1220
1200
  def list_portconf(self):
@@ -1227,15 +1207,14 @@ class Client:
1227
1207
  """
1228
1208
  Retrieve port configuration by ID
1229
1209
  """
1230
- return self._request(f"/api/s/{self._site}/rest/portconf/{portconf_id}")
1210
+ return self.fetch_results(f"/api/s/{self._site}/rest/portconf/{portconf_id}")
1231
1211
 
1232
1212
  def create_portconf(self, config: dict):
1233
1213
  """
1234
1214
  Create a new port configuration.
1235
1215
  """
1236
- return self._request(
1216
+ return self.fetch_results(
1237
1217
  f"/api/s/{self._site}/rest/portconf",
1238
- method='POST',
1239
1218
  payload=config
1240
1219
  )
1241
1220
 
@@ -1243,9 +1222,8 @@ class Client:
1243
1222
  """
1244
1223
  Update an existing port configuration.
1245
1224
  """
1246
- return self._request(
1225
+ return self.fetch_results(
1247
1226
  f"/api/s/{self._site}/rest/portconf/{portconf_id}",
1248
- method='PUT',
1249
1227
  payload=config
1250
1228
  )
1251
1229
 
@@ -1253,9 +1231,8 @@ class Client:
1253
1231
  """
1254
1232
  Delete a port configuration by ID.
1255
1233
  """
1256
- return self._request(
1234
+ return self.fetch_results(
1257
1235
  f"/api/s/{self._site}/rest/portconf/{portconf_id}",
1258
- method='DELETE'
1259
1236
  )
1260
1237
 
1261
1238
  def stat_ips_events(self, start: int = None, end: int = None, limit: int = None):
@@ -1273,7 +1250,7 @@ class Client:
1273
1250
  end = end if end is not None else int(time.time() * 1000)
1274
1251
  start = start if start is not None else end - (7 * 24 * 3600 * 1000)
1275
1252
  payload = {'mac': mac, 'start': start, 'end': end}
1276
- return self._request(f"/api/s/{self._site}/stat/session", method='POST', payload=payload)
1253
+ return self.fetch_results(f"/api/s/{self._site}/stat/session", payload=payload)
1277
1254
 
1278
1255
  def stat_sta_sessions_latest(self, mac: str, limit: int = None):
1279
1256
  """Fetch latest 'n' login sessions for a client (defaults to 5)."""
@@ -1288,7 +1265,7 @@ class Client:
1288
1265
  end = end if end is not None else int(time.time() * 1000)
1289
1266
  start = start if start is not None else end - (7 * 24 * 3600 * 1000)
1290
1267
  payload = {'mac': mac, 'start': start, 'end': end}
1291
- return self._request(f"/api/s/{self._site}/stat/user", method='POST', payload=payload)
1268
+ return self.fetch_results(f"/api/s/{self._site}/stat/user", payload=payload)
1292
1269
 
1293
1270
  def stat_all_user(self, start: int = None, end: int = None):
1294
1271
  """
@@ -1297,7 +1274,7 @@ class Client:
1297
1274
  end = end if end is not None else int(time.time() * 1000)
1298
1275
  start = start if start is not None else end - (7 * 24 * 3600 * 1000)
1299
1276
  payload = {'start': start, 'end': end}
1300
- return self._request(f"/api/s/{self._site}/stat/alluser", method='POST', payload=payload)
1277
+ return self.fetch_results(f"/api/s/{self._site}/stat/alluser", payload=payload)
1301
1278
 
1302
1279
  def stat_allusers(self, historyhours: int = 8760):
1303
1280
  """Fetch clients seen within the past N hours (all-time totals)."""
@@ -1312,7 +1289,7 @@ class Client:
1312
1289
  start = start if start is not None else end - (7 * 24 * 3600 * 1000)
1313
1290
  attribs = ['time'] + attribs if attribs else ['time'] + self.default_site_stats_attribs
1314
1291
  payload = {'attrs': attribs, 'start': start, 'end': end}
1315
- return self._request(f"/api/s/{self._site}/stat/report/daily.site", method='POST', payload=payload)
1292
+ return self.fetch_results(f"/api/s/{self._site}/stat/report/daily.site", payload=payload)
1316
1293
 
1317
1294
  def stat_monthly_site(self, start: int = None, end: int = None, attribs: list = None):
1318
1295
  """
@@ -1322,33 +1299,33 @@ class Client:
1322
1299
  start = start if start is not None else end - (30 * 24 * 3600 * 1000)
1323
1300
  attribs = ['time'] + attribs if attribs else ['time'] + self.default_site_stats_attribs
1324
1301
  payload = {'attrs': attribs, 'start': start, 'end': end}
1325
- return self._request(f"/api/s/{self._site}/stat/report/monthly.site", method='POST', payload=payload)
1302
+ return self.fetch_results(f"/api/s/{self._site}/stat/report/monthly.site", payload=payload)
1326
1303
 
1327
1304
  def stat_current_user(self):
1328
1305
  """
1329
1306
  Get stats for currently connected users.
1330
1307
  """
1331
- return self._request(f"/api/s/{self._site}/stat/sta")
1308
+ return self.fetch_results(f"/api/s/{self._site}/stat/sta")
1332
1309
 
1333
1310
  def stat_all_users(self):
1334
1311
  """
1335
1312
  Get usage stats for all known users.
1336
1313
  """
1337
- return self._request(f"/api/s/{self._site}/stat/alluser")
1314
+ return self.fetch_results(f"/api/s/{self._site}/stat/alluser")
1338
1315
 
1339
1316
  def stat_voucher(self, create_time: int = None):
1340
1317
  """
1341
1318
  Fetch statistics about vouchers, optionally filtering by creation time
1342
1319
  """
1343
1320
  payload = {'create_time': create_time} if create_time is not None else {}
1344
- return self._request(f"/api/s/{self._site}/stat/voucher", payload=payload)
1321
+ return self.fetch_results(f"/api/s/{self._site}/stat/voucher", payload=payload)
1345
1322
 
1346
1323
  def stat_payment(self, within: int=None):
1347
1324
  """
1348
1325
  Fetch statistics about payments, optionally filtering by time window
1349
1326
  """
1350
1327
  path_suffix = f"?within={within}" if within is not None else ""
1351
- return self._request(f"api/s/{self._site}/stat/payment{path_suffix}")
1328
+ return self.fetch_results(f"api/s/{self._site}/stat/payment{path_suffix}")
1352
1329
 
1353
1330
  def create_hotspotop(self, name: str, x_password: str, note: str = '') -> bool:
1354
1331
  """Create hotspot operator user"""
@@ -1370,7 +1347,7 @@ class Client:
1370
1347
  end = end if end is not None else int(time.time())
1371
1348
  start = start if start is not None else end - (7 * 24 * 3600)
1372
1349
  payload = {'start': start, 'end': end}
1373
- return self._request(f"/api/s/{self._site}/stat/authorization", payload=payload)
1350
+ return self.fetch_results(f"/api/s/{self._site}/stat/authorization", payload=payload)
1374
1351
 
1375
1352
  def stat_sessions(self, start: int = None, end: int = None, mac: str = None, type: str = 'all'):
1376
1353
  """
@@ -1386,7 +1363,7 @@ class Client:
1386
1363
  if mac:
1387
1364
  payload['mac'] = mac.lower()
1388
1365
 
1389
- return self._request(f"/api/s/{self._site}/stat/session", payload=payload)
1366
+ return self.fetch_results(f"/api/s/{self._site}/stat/session", payload=payload)
1390
1367
 
1391
1368
  def stat_client(self, mac: str):
1392
1369
  """Fetch details for a single client device."""
@@ -1459,26 +1436,26 @@ class Client:
1459
1436
  Retrieve list of alarms with optional filtering payload
1460
1437
  """
1461
1438
  payload = payload or {}
1462
- return self._request(f"/api/s/{self._site}/list/alarm", payload=payload)
1439
+ return self.fetch_results(f"/api/s/{self._site}/list/alarm", payload=payload)
1463
1440
 
1464
1441
  def list_events(self, historyhours: int = 720, start: int = 0, limit: int = 3000):
1465
1442
  payload = {
1466
1443
  '_sort': '-time',
1467
1444
  'within': historyhours,
1468
- 'type': null,
1445
+ 'type': None,
1469
1446
  '_start': start,
1470
1447
  '_limit': limit
1471
1448
  }
1472
- return self._request(f"/api/s/{self._site}/stat/event", payload=payload)
1449
+ return self.fetch_results(f"/api/s/{self._site}/stat/event", payload=payload)
1473
1450
 
1474
1451
  def list_tags(self):
1475
- return self._request(f"/api/s/{self._site}/rest/tag")
1452
+ return self.fetch_results(f"/api/s/{self._site}/rest/tag")
1476
1453
 
1477
1454
  def list_dpi_stats(self):
1478
1455
  """
1479
1456
  List DPI stats.
1480
1457
  """
1481
- return self._request(f"/api/s/{self._site}/stat/dpi")
1458
+ return self.fetch_results(f"/api/s/{self._site}/stat/dpi")
1482
1459
 
1483
1460
  def list_dpi_stats_filtered(self, type: str = 'by_cat', cat_filter: list = None):
1484
1461
  """
@@ -1492,7 +1469,7 @@ class Client:
1492
1469
  if isinstance(cat_filter, list) and type == 'by_app':
1493
1470
  payload['cats'] = cat_filter
1494
1471
 
1495
- return self._request(f"/api/s/{self._site}/stat/sitedpi", payload=payload)
1472
+ return self.fetch_results(f"/api/s/{self._site}/stat/sitedpi", payload=payload)
1496
1473
 
1497
1474
  def list_dpi_app_categories(self):
1498
1475
  """Fetch DPI application categories."""
@@ -1513,7 +1490,7 @@ class Client:
1513
1490
  return self.fetch_results(f"/api/s/{self._site}/stat/ccode")
1514
1491
 
1515
1492
  def list_radius_accounts(self):
1516
- return self._request(f"/api/s/{self._site}/rest/account")
1493
+ return self.fetch_results(f"/api/s/{self._site}/rest/account")
1517
1494
 
1518
1495
  def list_radius_profiles(self):
1519
1496
  """Fetch RADIUS profiles"""
@@ -1595,17 +1572,17 @@ class Client:
1595
1572
  return result
1596
1573
 
1597
1574
  def list_readius_profiles(self):
1598
- return self._request(f"/api/s/{self._site}/rest/radiusprofile")
1575
+ return self.fetch_results(f"/api/s/{self._site}/rest/radiusprofile")
1599
1576
 
1600
1577
  def list_hotspot_operators(self):
1601
- return self._request(f"api/s/{self._site}/rest/hotspotop")
1578
+ return self.fetch_results(f"api/s/{self._site}/rest/hotspotop")
1602
1579
 
1603
1580
  def count_alarms(self, archived: bool = None):
1604
1581
  """
1605
1582
  Count alarms; if archived=False counts only non-archived
1606
1583
  """
1607
1584
  suffix = '?archived=false' if archived is False else ''
1608
- return self._request(f"/api/s/{self._site}/cnt/alarm{suffix}")
1585
+ return self.fetch_results(f"/api/s/{self._site}/cnt/alarm{suffix}")
1609
1586
 
1610
1587
  def archive_alarm(self, alarm_id: str = '') -> bool:
1611
1588
  """
@@ -1615,7 +1592,7 @@ class Client:
1615
1592
  payload = {'_id': alarm_id, 'cmd': 'archive-alarm'}
1616
1593
  else:
1617
1594
  payload = {'cmd': 'archive-all-alarms'}
1618
- self._request(f"/api/s/{self._site}/cmd/evtmgr", method="POST", payload=payload)
1595
+ self.fetch_results(f"/api/s/{self._site}/cmd/evtmgr", payload=payload)
1619
1596
  return self._last_response_code == 200
1620
1597
 
1621
1598
  def stat_speedtest_results(self, start: int = None, end: int = None):
@@ -1629,22 +1606,22 @@ class Client:
1629
1606
  'start': start,
1630
1607
  'end': end
1631
1608
  }
1632
- return self._request(f"/api/s/{self._site}/stat/report/archive.speedtest", payload=payload)
1609
+ return self.fetch_results(f"/api/s/{self._site}/stat/report/archive.speedtest", payload=payload)
1633
1610
 
1634
1611
  def list_health(self):
1635
- return self._request(f"/api/s/{self._site}/stat/heatlh")
1612
+ return self.fetch_results(f"/api/s/{self._site}/stat/heatlh")
1636
1613
 
1637
1614
  def stat_user_devices(self):
1638
1615
  """
1639
1616
  Retrieve statistics on user devices.
1640
1617
  """
1641
- return self._request(f"/api/s/{self._site}/stat/user/devices")
1618
+ return self.fetch_results(f"/api/s/{self._site}/stat/user/devices")
1642
1619
 
1643
1620
  def stat_sites(self):
1644
1621
  """
1645
1622
  Retrieve statistics for all available sites.
1646
1623
  """
1647
- return self._request("/api/stat/sites")
1624
+ return self.fetch_results("/api/stat/sites")
1648
1625
 
1649
1626
  def list_devices(self, macs: list[str] = []):
1650
1627
  """
@@ -1660,7 +1637,7 @@ class Client:
1660
1637
  """
1661
1638
  Fetch latest known controller version info
1662
1639
  """
1663
- return self._request(f"/api/s/{self._site}/stat/fwupdate/latest-version")
1640
+ return self.fetch_results(f"/api/s/{self._site}/stat/fwupdate/latest-version")
1664
1641
 
1665
1642
  def get_update_os_console(self):
1666
1643
  """
@@ -1668,7 +1645,7 @@ class Client:
1668
1645
  """
1669
1646
  if not self._unifi_os:
1670
1647
  raise NotAUnifiOsConsoleException()
1671
- return self._request('/api/firmware/update')
1648
+ return self.fetch_results('/api/firmware/update')
1672
1649
 
1673
1650
  def update_os_console(self) -> bool:
1674
1651
  """
@@ -1677,7 +1654,7 @@ class Client:
1677
1654
  if not self._unifi_os:
1678
1655
  raise NotAUnifiOsConsoleException()
1679
1656
  payload = {'persistFullData': True}
1680
- self._request(f"/api/s/{self._site}/cmd/firmware/update", method='POST', payload=payload)
1657
+ self.fetch_results(f"/api/s/{self._site}/cmd/firmware/update", payload=payload)
1681
1658
  return self._last_response_code == 200
1682
1659
 
1683
1660
 
@@ -2097,7 +2074,7 @@ class Client:
2097
2074
  pass
2098
2075
 
2099
2076
  def list_firewallgroups(self, group_id: str = ''):
2100
- return self.fetch_results(f"/api/s/{self._site}/rest/firewallgroup/{group_id.strip()}")
2077
+ return self.fetch_results(f"/api/s/{self._site}/rest/firewallgroup/{group_id.strip()}", prefix_path=True)
2101
2078
 
2102
2079
  def create_firewallgroup(self, group_name: str, group_type: str, group_members: list = []) -> bool:
2103
2080
  """Create a new firewall group"""
@@ -2109,11 +2086,7 @@ class Client:
2109
2086
  'group_type': group_type,
2110
2087
  'group_members': group_members
2111
2088
  }
2112
- return self._request(
2113
- f"/api/s/{self._site}/rest/firewallgroup",
2114
- method='POST',
2115
- payload=payload
2116
- )
2089
+ return self.fetch_results(f"/api/s/{self._site}/rest/firewallgroup", payload=payload, prefix_path=True)
2117
2090
 
2118
2091
  def edit_firewallgroup(self, group_id: str, site_id: str, group_name: str, group_type: str, group_members: list = []) -> bool:
2119
2092
  """Edit an existing firewall group"""
@@ -2128,10 +2101,11 @@ class Client:
2128
2101
  'group_members': group_members,
2129
2102
  'site_id': site_id
2130
2103
  }
2131
- return self._request(
2104
+ self._curl_method = 'PUT'
2105
+ return self.fetch_results(
2132
2106
  f"/api/s/{self._site}/rest/firewallgroup/{group_id.strip()}",
2133
- method='PUT',
2134
- payload=payload
2107
+ payload=payload,
2108
+ prefix_path=True
2135
2109
  )
2136
2110
 
2137
2111
  def delete_firewallgroup(self, group_id: str) -> bool:
@@ -2140,7 +2114,7 @@ class Client:
2140
2114
  self._curl_method = "GET"
2141
2115
 
2142
2116
  def list_firewallrules(self):
2143
- return self._request(f"/api/s/{self._site}/rest/firewallrule")
2117
+ return self.fetch_results(f"/api/s/{self._site}/rest/firewallrule")
2144
2118
 
2145
2119
  def list_routing(self, route_id: str = ''):
2146
2120
  return self.fetch_results(f"/api/s/{self._site}/rest/routing/{route_id.strip()}")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python_unifi_client
3
- Version: 1.2.6
3
+ Version: 1.2.7
4
4
  Home-page: https://github.com/compdat-llc/unifi-client-python
5
5
  Author: Michael Lapinski
6
6
  Author-email: michaellapinski787@gmail.com
@@ -5,7 +5,7 @@ with open("README.md", "r") as fh:
5
5
 
6
6
  setuptools.setup(
7
7
  name="python_unifi_client",
8
- version="1.2.6",
8
+ version="1.2.7",
9
9
  author="Michael Lapinski",
10
10
  author_email="michaellapinski787@gmail.com",
11
11
  descripton="A python version of a github Art-of-Wifi/Unifi-API-Client",