tplinkrouterc6u 5.4.2__tar.gz → 5.6.0__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.
Files changed (39) hide show
  1. {tplinkrouterc6u-5.4.2 → tplinkrouterc6u-5.6.0}/PKG-INFO +8 -1
  2. {tplinkrouterc6u-5.4.2 → tplinkrouterc6u-5.6.0}/README.md +7 -0
  3. {tplinkrouterc6u-5.4.2 → tplinkrouterc6u-5.6.0}/setup.py +1 -1
  4. {tplinkrouterc6u-5.4.2 → tplinkrouterc6u-5.6.0}/test/test_client_c6u.py +2 -0
  5. tplinkrouterc6u-5.6.0/test/test_client_c80.py +455 -0
  6. {tplinkrouterc6u-5.4.2 → tplinkrouterc6u-5.6.0}/test/test_client_mr.py +1 -0
  7. {tplinkrouterc6u-5.4.2 → tplinkrouterc6u-5.6.0}/tplinkrouterc6u/__init__.py +2 -1
  8. {tplinkrouterc6u-5.4.2 → tplinkrouterc6u-5.6.0}/tplinkrouterc6u/client/c6u.py +1 -0
  9. tplinkrouterc6u-5.6.0/tplinkrouterc6u/client/c80.py +406 -0
  10. {tplinkrouterc6u-5.4.2 → tplinkrouterc6u-5.6.0}/tplinkrouterc6u/client/ex.py +2 -2
  11. {tplinkrouterc6u-5.4.2 → tplinkrouterc6u-5.6.0}/tplinkrouterc6u/client/mr.py +209 -208
  12. tplinkrouterc6u-5.6.0/tplinkrouterc6u/client/vr.py +129 -0
  13. {tplinkrouterc6u-5.4.2 → tplinkrouterc6u-5.6.0}/tplinkrouterc6u/common/dataclass.py +1 -0
  14. tplinkrouterc6u-5.6.0/tplinkrouterc6u/provider.py +45 -0
  15. {tplinkrouterc6u-5.4.2 → tplinkrouterc6u-5.6.0}/tplinkrouterc6u.egg-info/PKG-INFO +8 -1
  16. {tplinkrouterc6u-5.4.2 → tplinkrouterc6u-5.6.0}/tplinkrouterc6u.egg-info/SOURCES.txt +3 -0
  17. tplinkrouterc6u-5.4.2/tplinkrouterc6u/provider.py +0 -39
  18. {tplinkrouterc6u-5.4.2 → tplinkrouterc6u-5.6.0}/LICENSE +0 -0
  19. {tplinkrouterc6u-5.4.2 → tplinkrouterc6u-5.6.0}/setup.cfg +0 -0
  20. {tplinkrouterc6u-5.4.2 → tplinkrouterc6u-5.6.0}/test/__init__.py +0 -0
  21. {tplinkrouterc6u-5.4.2 → tplinkrouterc6u-5.6.0}/test/test_client_c1200.py +0 -0
  22. {tplinkrouterc6u-5.4.2 → tplinkrouterc6u-5.6.0}/test/test_client_deco.py +0 -0
  23. {tplinkrouterc6u-5.4.2 → tplinkrouterc6u-5.6.0}/test/test_client_ex.py +0 -0
  24. {tplinkrouterc6u-5.4.2 → tplinkrouterc6u-5.6.0}/test/test_client_xdr.py +0 -0
  25. {tplinkrouterc6u-5.4.2 → tplinkrouterc6u-5.6.0}/tplinkrouterc6u/client/__init__.py +0 -0
  26. {tplinkrouterc6u-5.4.2 → tplinkrouterc6u-5.6.0}/tplinkrouterc6u/client/c1200.py +0 -0
  27. {tplinkrouterc6u-5.4.2 → tplinkrouterc6u-5.6.0}/tplinkrouterc6u/client/c5400x.py +0 -0
  28. {tplinkrouterc6u-5.4.2 → tplinkrouterc6u-5.6.0}/tplinkrouterc6u/client/c6v4.py +0 -0
  29. {tplinkrouterc6u-5.4.2 → tplinkrouterc6u-5.6.0}/tplinkrouterc6u/client/deco.py +0 -0
  30. {tplinkrouterc6u-5.4.2 → tplinkrouterc6u-5.6.0}/tplinkrouterc6u/client/xdr.py +0 -0
  31. {tplinkrouterc6u-5.4.2 → tplinkrouterc6u-5.6.0}/tplinkrouterc6u/client_abstract.py +0 -0
  32. {tplinkrouterc6u-5.4.2 → tplinkrouterc6u-5.6.0}/tplinkrouterc6u/common/__init__.py +0 -0
  33. {tplinkrouterc6u-5.4.2 → tplinkrouterc6u-5.6.0}/tplinkrouterc6u/common/encryption.py +0 -0
  34. {tplinkrouterc6u-5.4.2 → tplinkrouterc6u-5.6.0}/tplinkrouterc6u/common/exception.py +0 -0
  35. {tplinkrouterc6u-5.4.2 → tplinkrouterc6u-5.6.0}/tplinkrouterc6u/common/helper.py +0 -0
  36. {tplinkrouterc6u-5.4.2 → tplinkrouterc6u-5.6.0}/tplinkrouterc6u/common/package_enum.py +0 -0
  37. {tplinkrouterc6u-5.4.2 → tplinkrouterc6u-5.6.0}/tplinkrouterc6u.egg-info/dependency_links.txt +0 -0
  38. {tplinkrouterc6u-5.4.2 → tplinkrouterc6u-5.6.0}/tplinkrouterc6u.egg-info/requires.txt +0 -0
  39. {tplinkrouterc6u-5.4.2 → tplinkrouterc6u-5.6.0}/tplinkrouterc6u.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: tplinkrouterc6u
3
- Version: 5.4.2
3
+ Version: 5.6.0
4
4
  Summary: TP-Link Router API
5
5
  Home-page: https://github.com/AlexandrErohin/TP-Link-Archer-C6U
6
6
  Author: Alex Erohin
@@ -53,9 +53,11 @@ from tplinkrouterc6u import (
53
53
  TplinkC1200Router,
54
54
  TplinkC5400XRouter,
55
55
  TPLinkMRClient,
56
+ TPLinkVRClient,
56
57
  TPLinkEXClient,
57
58
  TPLinkXDRClient,
58
59
  TPLinkDecoClient,
60
+ TplinkC80Router,
59
61
  Connection
60
62
  )
61
63
  from logging import Logger
@@ -167,6 +169,7 @@ or you have TP-link C5400X or similar router you need to get web encrypted passw
167
169
  | wan_ipv4_uptime | Internet Uptime | int, None |
168
170
  | mem_usage | Memory usage in percentage between 0 and 1 | float, None |
169
171
  | cpu_usage | CPU usage in percentage between 0 and 1 | float, None |
172
+ | conn_type | Connection type | str, None |
170
173
  | devices | List of all connectedd devices | list[[Device](#device)] |
171
174
 
172
175
  ### <a id="device">Device</a>
@@ -311,6 +314,7 @@ or you have TP-link C5400X or similar router you need to get web encrypted passw
311
314
  - Archer C6 (v2.0, v3.0)
312
315
  - Archer C6U v1.0
313
316
  - Archer C7 (v4.0, v5.0)
317
+ - Archer C80 2.20
314
318
  - Archer C5400X V1
315
319
  - Archer GX90 v1.0
316
320
  - Archer MR200 (v5, v5.3, v6.0)
@@ -318,6 +322,7 @@ or you have TP-link C5400X or similar router you need to get web encrypted passw
318
322
  - Archer MR600 (v1, v2, v3)
319
323
  - Archer VR600 v3
320
324
  - Archer VR900v
325
+ - Archer VR1200v v1
321
326
  - Archer VR2100v v1
322
327
  - Archer VX1800v v1.0
323
328
  - Deco M4 2.0
@@ -331,6 +336,7 @@ or you have TP-link C5400X or similar router you need to get web encrypted passw
331
336
  - Deco X60 V3
332
337
  - Deco X90
333
338
  - Deco XE75 (v1.0, v2.0)
339
+ - Deco XE75PRO (v3.0)
334
340
  - EX511 v2.0
335
341
  - HX510 v1.0
336
342
  - NX510v v1.0
@@ -341,6 +347,7 @@ or you have TP-link C5400X or similar router you need to get web encrypted passw
341
347
  - TL-MR6500v
342
348
  - TL-WA3001 v1.0
343
349
  - TL-XDR3010 V2
350
+ - XC220-G3v v2.30
344
351
 
345
352
  ### Not fully tested Hardware Versions
346
353
  - AD7200 V2
@@ -22,9 +22,11 @@ from tplinkrouterc6u import (
22
22
  TplinkC1200Router,
23
23
  TplinkC5400XRouter,
24
24
  TPLinkMRClient,
25
+ TPLinkVRClient,
25
26
  TPLinkEXClient,
26
27
  TPLinkXDRClient,
27
28
  TPLinkDecoClient,
29
+ TplinkC80Router,
28
30
  Connection
29
31
  )
30
32
  from logging import Logger
@@ -136,6 +138,7 @@ or you have TP-link C5400X or similar router you need to get web encrypted passw
136
138
  | wan_ipv4_uptime | Internet Uptime | int, None |
137
139
  | mem_usage | Memory usage in percentage between 0 and 1 | float, None |
138
140
  | cpu_usage | CPU usage in percentage between 0 and 1 | float, None |
141
+ | conn_type | Connection type | str, None |
139
142
  | devices | List of all connectedd devices | list[[Device](#device)] |
140
143
 
141
144
  ### <a id="device">Device</a>
@@ -280,6 +283,7 @@ or you have TP-link C5400X or similar router you need to get web encrypted passw
280
283
  - Archer C6 (v2.0, v3.0)
281
284
  - Archer C6U v1.0
282
285
  - Archer C7 (v4.0, v5.0)
286
+ - Archer C80 2.20
283
287
  - Archer C5400X V1
284
288
  - Archer GX90 v1.0
285
289
  - Archer MR200 (v5, v5.3, v6.0)
@@ -287,6 +291,7 @@ or you have TP-link C5400X or similar router you need to get web encrypted passw
287
291
  - Archer MR600 (v1, v2, v3)
288
292
  - Archer VR600 v3
289
293
  - Archer VR900v
294
+ - Archer VR1200v v1
290
295
  - Archer VR2100v v1
291
296
  - Archer VX1800v v1.0
292
297
  - Deco M4 2.0
@@ -300,6 +305,7 @@ or you have TP-link C5400X or similar router you need to get web encrypted passw
300
305
  - Deco X60 V3
301
306
  - Deco X90
302
307
  - Deco XE75 (v1.0, v2.0)
308
+ - Deco XE75PRO (v3.0)
303
309
  - EX511 v2.0
304
310
  - HX510 v1.0
305
311
  - NX510v v1.0
@@ -310,6 +316,7 @@ or you have TP-link C5400X or similar router you need to get web encrypted passw
310
316
  - TL-MR6500v
311
317
  - TL-WA3001 v1.0
312
318
  - TL-XDR3010 V2
319
+ - XC220-G3v v2.30
313
320
 
314
321
  ### Not fully tested Hardware Versions
315
322
  - AD7200 V2
@@ -5,7 +5,7 @@ with open("README.md", "r") as fh:
5
5
 
6
6
  setuptools.setup(
7
7
  name="tplinkrouterc6u",
8
- version="5.4.2",
8
+ version="5.6.0",
9
9
  author="Alex Erohin",
10
10
  author_email="alexanderErohin@yandex.ru",
11
11
  description="TP-Link Router API",
@@ -64,6 +64,7 @@ class TestTPLinkClient(TestCase):
64
64
  ],
65
65
  "guest_5g_psk_key": "",
66
66
  "cpu_usage": 0.28,
67
+ "conn_type": "1",
67
68
  "guest_2g_encryption": "none",
68
69
  "wireless_5g_encryption": "psk",
69
70
  "guest_5g_ssid": "TP-Link_Guest_21CC_5G",
@@ -244,6 +245,7 @@ class TestTPLinkClient(TestCase):
244
245
  self.assertEqual(status.wifi_5g_enable, True)
245
246
  self.assertEqual(status.wan_ipv4_uptime, None)
246
247
  self.assertEqual(status.mem_usage, 0.43)
248
+ self.assertEqual(status.conn_type, '1')
247
249
  self.assertEqual(status.cpu_usage, 0.28)
248
250
  self.assertEqual(len(status.devices), 5)
249
251
  self.assertIsInstance(status.devices[0], Device)
@@ -0,0 +1,455 @@
1
+ from unittest import main, TestCase
2
+ from ipaddress import IPv4Address
3
+ from macaddress import EUI48
4
+ from tplinkrouterc6u.common.dataclass import Firmware, Status, Device
5
+ from tplinkrouterc6u.common.dataclass import IPv4Status, IPv4Reservation, IPv4DHCPLease, VPNStatus
6
+ from tplinkrouterc6u import Connection, ClientException
7
+ from tplinkrouterc6u.client.c80 import TplinkC80Router
8
+
9
+
10
+ IPV4_STATUS_RESPONSE = ('00000\r\nid 1|1,0,0\r\nauthKey token\r\nreserved\r\nsetWzd 8\r\nmode 1\r\nlogLevel 3\r\n'
11
+ 'fastpath 1\r\nmac 0 00-00-00-00-00-00\r\nmac 1 00-00-00-00-00-01\r\nwanMacType 0\r\n'
12
+ 'modelMergeCursor 8\r\nid 4|1,0,0\r\nip 192.168.0.1\r\nmask 255.255.255.0\r\nmode 0\r\n'
13
+ 'smartIp 1\r\ngateway 192.168.0.1\r\nid 8|1,0,0\r\nenable 1\r\npoolStart 192.168.0.100\r\n'
14
+ 'poolEnd 192.168.0.249\r\nleaseTime 120\r\ndns 0 0.0.0.0\r\ndns 1 0.0.0.0\r\ngateway 0.0.0.0'
15
+ '\r\nhostName\r\nrelayEnableAll 0\r\nrelayEnable 0\r\nrelayServer 0.0.0.0\r\nid 22|1,0,0'
16
+ '\r\nenable 1\r\nneedPnpDetect 0\r\nocnDetect 0\r\nreserved\r\nlinkMode 0\r\nlinkType 0\r\n'
17
+ 'id 23|1,0,0\r\nip 1.0.1.1\r\nmask 255.255.252.0\r\ngateway 1.0.0.1\r\ndns 0 8.8.8.8\r\n'
18
+ 'dns 1 8.8.8.8\r\nstatus 1\r\ncode 0\r\nupTime 42601\r\ninPkts 12018031\r\ninOctets 1549640652'
19
+ '\r\noutPkts 31192286\r\noutOctets 182616925\r\ninRates 939\r\noutRates 318\r\ndualMode 0\r\n'
20
+ 'dualIp 0.0.0.0\r\ndualMask 0.0.0.0\r\ndualGateway 0.0.0.0\r\ndualDns 0 0.0.0.0\r\n'
21
+ 'dualDns 1 0.0.0.0\r\ndualCode 1\r\ndualStatus 3\r\ninternetDnsDetect 1\r\nid 24|1,0,0\r\n'
22
+ 'ip 1.0.0.1\r\nmask 255.255.255.0\r\ngateway 1.0.0.1\r\ndns 0 8.8.8.8\r\ndns 1 8.8.8.8\r\n'
23
+ 'mtu 1500')
24
+
25
+
26
+ IPV4_RESPONSE_TEXT = ('00000\r\nid 1|1,0,0\r\nauthKey token\r\nreserved\r\nsetWzd 8\r\nmode 1\r\nlogLevel 3'
27
+ '\r\nfastpath 1\r\nmac 0 00-00-00-00-00-00\r\nmac 1 00-00-00-00-00-01\r\nwanMacType 0'
28
+ '\r\nmodelMergeCursor 8\r\nid 4|1,0,0\r\nip 192.168.0.1\r\nmask 255.255.255.0\r\n'
29
+ 'mode 0\r\nsmartIp 1\r\ngateway 192.168.0.1\r\nid 8|1,0,0\r\nenable 1\r\n'
30
+ 'poolStart 192.168.0.100\r\npoolEnd 192.168.0.249\r\nleaseTime 120\r\ndns 0 0.0.0.0'
31
+ '\r\ndns 1 0.0.0.0\r\ngateway 0.0.0.0\r\nhostName\r\nrelayEnableAll 0\r\n'
32
+ 'relayEnable 0\r\nrelayServer 0.0.0.0\r\nid 22|1,0,0\r\nenable 1\r\nneedPnpDetect 0'
33
+ '\r\nocnDetect 0\r\nreserved\r\nlinkMode 0\r\nlinkType 0\r\nid 23|1,0,0\r\n'
34
+ 'ip 1.1.1.1\r\nmask 255.255.252.0\r\ngateway 1.1.1.2\r\ndns 0 5.8.8.8\r\n'
35
+ 'dns 1 5.8.8.8\r\nstatus 1\r\ncode 0\r\nupTime 15000\r\ninPkts 9537954\r\n'
36
+ 'inOctets 327534332\r\noutPkts 24449491\r\noutOctets 2189487468\r\ninRates 42346'
37
+ '\r\noutRates 19222\r\ndualMode 0\r\ndualIp 0.0.0.0\r\ndualMask 0.0.0.0\r\n'
38
+ 'dualGateway 0.0.0.0\r\ndualDns 0 0.0.0.0\r\ndualDns 1 0.0.0.0\r\ndualCode 1'
39
+ '\r\ndualStatus 3\r\ninternetDnsDetect 1\r\nid 24|1,0,0\r\nip 1.0.0.1\r\n'
40
+ 'mask 255.255.255.0\r\ngateway 1.0.0.1\r\ndns 0 8.8.8.8\r\ndns 1 8.8.8.8\r\nmtu 1500')
41
+
42
+ STATUS_RESPONSE_TEXT = ('00000\r\nid 1|1,0,0\r\nauthKey aaa3eKKee\r\nreserved\r\nsetWzd 8\r\nmode 1\r\n'
43
+ 'logLevel 3\r\nfastpath 1\r\nmac 0 00-00-00-00-00-00\r\nmac 1 00-00-00-00-00-01'
44
+ '\r\nwanMacType 0\r\nmodelMergeCursor 8\r\nid 4|1,0,0\r\nip 192.168.0.1\r\n'
45
+ 'mask 255.255.255.0\r\nmode 0\r\nsmartIp 1\r\ngateway 192.168.0.1\r\nid 23|1,0,0'
46
+ '\r\nip 100.100.100.100\r\nmask 255.255.252.0\r\ngateway 100.100.105.1\r\n'
47
+ 'dns 0 100.100.0.1\r\ndns 1 100.100.0.1\r\nstatus 1\r\ncode 0\r\nupTime 30814980'
48
+ '\r\ninPkts 3014881\r\ninOctets 1502000045\r\noutPkts 8216676\r\noutOctets 2500478193'
49
+ '\r\ninRates 337\r\noutRates 714\r\ndualMode 0\r\ndualIp 0.0.0.0\r\ndualMask 0.0.0.0'
50
+ '\r\ndualGateway 0.0.0.0\r\ndualDns 0 0.0.0.0\r\ndualDns 1 0.0.0.0\r\ndualCode 0'
51
+ '\r\ndualStatus 0\r\ninternetDnsDetect 1\r\nid 13|1,0,0\r\nip 0 192.168.0.1\r\n'
52
+ 'ip 1 192.168.0.2\r\nip 2 192.168.0.3\r\nip 3 192.168.0.4\r\nip 4 192.168.0.5'
53
+ '\r\nip 5 192.168.0.6\r\nmac 0 00-00-00-00-00-02\r\nmac 1 00-00-00-00-00-03'
54
+ '\r\nmac 2 00-00-00-00-00-04\r\nmac 3 00-00-00-00-00-05\r\nmac 4 00-00-00-00-00-06'
55
+ '\r\nmac 5 00-00-00-00-00-07\r\nbindEntry 0 0\r\nbindEntry 1 0\r\nbindEntry 2 0'
56
+ '\r\nbindEntry 3 0\r\nbindEntry 4 0\r\nbindEntry 5 0\r\nstaMgtEntry 0 0\r\n'
57
+ 'staMgtEntry 1 0\r\nstaMgtEntry 2 0\r\nstaMgtEntry 3 0\r\nstaMgtEntry 4 1'
58
+ '\r\nstaMgtEntry 5 0\r\ntype 0 3\r\ntype 1 1\r\ntype 2 2\r\ntype 3 1\r\ntype 4 13'
59
+ '\r\ntype 5 0\r\nonline 0 0\r\nonline 1 0\r\nonline 2 1\r\nonline 3 1\r\nonline 4 1'
60
+ '\r\nonline 5 1\r\nblocked 0 0\r\nblocked 1 0\r\nblocked 2 0\r\nblocked 3 0\r\n'
61
+ 'blocked 4 0\r\nblocked 5 0\r\nqosPrior 0 0\r\nqosPrior 1 0\r\nqosPrior 2 0\r\n'
62
+ 'qosPrior 3 0\r\nqosPrior 4 0\r\nqosPrior 5 0\r\nup 0 0\r\nup 1 0\r\nup 2 30\r\n'
63
+ 'up 3 800\r\nup 4 1824\r\nup 5 600\r\ndown 0 0\r\ndown 1 0\r\ndown 2 200\r\n'
64
+ 'down 3 400\r\ndown 4 800\r\ndown 5 50\r\nupLimit 0 204800\r\nupLimit 1 204800\r\n'
65
+ 'upLimit 2 204800\r\nupLimit 3 204800\r\nupLimit 4 204800\r\nupLimit 5 204800\r\n'
66
+ 'downLimit 0 1048576\r\ndownLimit 1 1048576\r\ndownLimit 2 1048576\r\n'
67
+ 'downLimit 3 1048576\r\ndownLimit 4 1048576\r\ndownLimit 5 1048576\r\nname 0 Laptop'
68
+ '\r\nname 1 iPhone\r\nname 2 Laptop2\r\nname 3 iPhone2\r\nname 4 IoT_thing\r\n'
69
+ 'name 5 PC\r\nuBandwidth 0 0\r\nuBandwidth 1 0\r\nuBandwidth 2 0\r\nuBandwidth 3 0'
70
+ '\r\nuBandwidth 4 0\r\nuBandwidth 5 0\r\nuStandard 0 0\r\nuStandard 1 0\r\n'
71
+ 'uStandard 2 0\r\nuStandard 3 2\r\nuStandard 4 2\r\nuStandard 5 0\r\ndevType 0 0'
72
+ '\r\ndevType 1 0\r\ndevType 2 0\r\ndevType 3 0\r\ndevType 4 0\r\ndevType 5 0\r\n'
73
+ 'priTime 0 0\r\npriTime 1 0\r\npriTime 2 0\r\npriTime 3 0\r\npriTime 4 0\r\n'
74
+ 'priTime 5 0\r\nleaseTime 0 0\r\nleaseTime 1 0\r\nleaseTime 2 0\r\nleaseTime 3 0'
75
+ '\r\nleaseTime 4 0\r\nleaseTime 5 0\r\ntotalVal 0 450\r\ntotalVal 1 5\r\n'
76
+ 'totalVal 2 13\r\ntotalVal 3 956\r\ntotalVal 4 13\r\ntotalVal 5 53\r\ntotalUnit 0 2'
77
+ '\r\ntotalUnit 1 2\r\ntotalUnit 2 2\r\ntotalUnit 3 2\r\ntotalUnit 4 2\r\n'
78
+ 'totalUnit 5 2\r\ndhcpsEntry 0 0\r\ndhcpsEntry 1 0\r\ndhcpsEntry 2 0\r\n'
79
+ 'dhcpsEntry 3 0\r\ndhcpsEntry 4 0\r\ndhcpsEntry 5 0\r\nduration 0 0\r\n'
80
+ 'duration 1 0\r\nduration 2 0\r\nduration 3 73\r\nduration 4 5388\r\n'
81
+ 'duration 5 8559\r\ntxRate 0 0\r\ntxRate 1 0\r\ntxRate 2 0\r\ntxRate 3 156\r\n'
82
+ 'txRate 4 130\r\ntxRate 5 0\r\nrxRate 0 0\r\nrxRate 1 0\r\nrxRate 2 0\r\n'
83
+ 'rxRate 3 130\r\nrxRate 4 173\r\nrxRate 5 0\r\naveRssi 0 0\r\naveRssi 1 0\r\n'
84
+ 'aveRssi 2 0\r\naveRssi 3 33\r\naveRssi 4 46\r\naveRssi 5 0\r\nslEnable 0 0\r\n'
85
+ 'slEnable 1 0\r\nslEnable 2 0\r\nslEnable 3 0\r\nslEnable 4 0\r\nslEnable 5 0'
86
+ '\r\npriScheStatus 0 0\r\npriScheStatus 1 0\r\npriScheStatus 2 0\r\n'
87
+ 'priScheStatus 3 0\r\npriScheStatus 4 0\r\npriScheStatus 5 0\r\nstart 0 0\r\n'
88
+ 'start 1 0\r\nstart 2 0\r\nstart 3 0\r\nstart 4 0\r\nstart 5 0\r\nend 0 0\r\n'
89
+ 'end 1 0\r\nend 2 0\r\nend 3 0\r\nend 4 0\r\nend 5 0\r\nday 0 0\r\nday 1 0\r\n'
90
+ 'day 2 0\r\nday 3 0\r\nday 4 0\r\nday 5 0\r\nstartMin 0 0\r\nstartMin 1 0\r\n'
91
+ 'startMin 2 0\r\nstartMin 3 0\r\nstartMin 4 0\r\nstartMin 5 0\r\nendMin 0 0\r\n'
92
+ 'endMin 1 0\r\nendMin 2 0\r\nendMin 3 0\r\nendMin 4 0\r\nendMin 5 0\r\nrate 0 0'
93
+ '\r\nrate 1 0\r\nrate 2 0\r\nrate 3 156\r\nrate 4 173\r\nrate 5 0\r\ntxPkt 0 0'
94
+ '\r\ntxPkt 1 0\r\ntxPkt 2 0\r\ntxPkt 3 42602\r\ntxPkt 4 119683\r\ntxPkt 5 0'
95
+ '\r\nrxPkt 0 0\r\nrxPkt 1 0\r\nrxPkt 2 0\r\nrxPkt 3 6343\r\nrxPkt 4 275076\r\n'
96
+ 'rxPkt 5 0\r\nid 33|1,1,0\r\nuUnit 0\r\ncSsidPrefix\r\nuRadiusIp 0.0.0.0\r\n'
97
+ 'uRadiusGKUpdateIntvl 0\r\nuPskGKUpdateIntvl 0\r\nuKeyLength 0 0\r\nuKeyLength 1 0'
98
+ '\r\nuKeyLength 2 0\r\nuKeyLength 3 0\r\ncKeyVal 0\r\ncKeyVal 1\r\ncKeyVal 2\r\n'
99
+ 'cKeyVal 3\r\nuRadiusPort 1812\r\nuKeyType 0\r\nuDefaultKey 1\r\nbEnable 1\r\n'
100
+ 'bBcastSsid 1\r\ncSsid TP-Link\r\nbSecurityEnable 1\r\nuAuthType 3\r\nuWEPSecOpt 3'
101
+ '\r\nuRadiusSecOpt 3\r\nuPSKSecOpt 2\r\nuRadiusEncryptType 1\r\nuPSKEncryptType 3'
102
+ '\r\ncRadiusSecret\r\ncPskSecret admin\r\nbSecCheck 0\r\nbEnabled 1\r\n'
103
+ 'cUsrPIN 11100111\r\nbConfigured 1\r\nbIsLocked 0\r\nbEnRtPIN 1\r\n'
104
+ 'bWifiBtnRecEnable 1\r\nuVid 0\r\nbMumimo 0\r\nbMwdsEnable 0\r\nbLanAccess 1'
105
+ '\r\nSecurityType 2\r\nbApIsolated 0\r\neffectiveTime 0\r\nuMaxUploadSpeed -1'
106
+ '\r\nuMaxDownloadSpeed -1\r\nbwCtrlEnable 0\r\nenableBackup 1\r\nbTr069APEnable 0'
107
+ '\r\nbTr069SSIDEnable 0\r\nid 33|2,1,0\r\nuUnit 0\r\ncSsidPrefix\r\nuRadiusIp 0.0.0.0'
108
+ '\r\nuRadiusGKUpdateIntvl 0\r\nuPskGKUpdateIntvl 0\r\nuKeyLength 0 0\r\nuKeyLength 1 0'
109
+ '\r\nuKeyLength 2 0\r\nuKeyLength 3 0\r\ncKeyVal 0\r\ncKeyVal 1\r\ncKeyVal 2\r\n'
110
+ 'cKeyVal 3\r\nuRadiusPort 1812\r\nuKeyType 0\r\nuDefaultKey 1\r\nbEnable 1\r\n'
111
+ 'bBcastSsid 1\r\ncSsid TP-Link\r\nbSecurityEnable 1\r\nuAuthType 3\r\nuWEPSecOpt 3'
112
+ '\r\nuRadiusSecOpt 3\r\nuPSKSecOpt 2\r\nuRadiusEncryptType 1\r\nuPSKEncryptType 3'
113
+ '\r\ncRadiusSecret\r\ncPskSecret admin\r\nbSecCheck 0\r\nbEnabled 1\r\n'
114
+ 'cUsrPIN 11100111\r\nbConfigured 1\r\nbIsLocked 0\r\nbEnRtPIN 1\r\nbWifiBtnRecEnable 1'
115
+ '\r\nuVid 0\r\nbMumimo 0\r\nbMwdsEnable 0\r\nbLanAccess 1\r\nSecurityType 2\r\n'
116
+ 'bApIsolated 0\r\neffectiveTime 0\r\nuMaxUploadSpeed -1\r\nuMaxDownloadSpeed -1\r\n'
117
+ 'bwCtrlEnable 0\r\nenableBackup 1\r\nbTr069APEnable 0\r\nbTr069SSIDEnable 0\r\n'
118
+ 'id 33|1,2,0\r\nuUnit 1\r\ncSsidPrefix Guest\r\nuRadiusIp 0.0.0.0\r\n'
119
+ 'uRadiusGKUpdateIntvl 0\r\nuPskGKUpdateIntvl 0\r\nuKeyLength 0 0\r\nuKeyLength 1 0'
120
+ '\r\nuKeyLength 2 0\r\nuKeyLength 3 0\r\ncKeyVal 0\r\ncKeyVal 1\r\ncKeyVal 2\r\n'
121
+ 'cKeyVal 3\r\nuRadiusPort 1812\r\nuKeyType 0\r\nuDefaultKey 1\r\nbEnable 0\r\n'
122
+ 'bBcastSsid 1\r\ncSsid TP-Link_Guest\r\nbSecurityEnable 0\r\nuAuthType 3\r\n'
123
+ 'uWEPSecOpt 3\r\nuRadiusSecOpt 3\r\nuPSKSecOpt 3\r\nuRadiusEncryptType 1\r\n'
124
+ 'uPSKEncryptType 3\r\ncRadiusSecret\r\ncPskSecret\r\nbSecCheck 0\r\nbEnabled 1'
125
+ '\r\ncUsrPIN 11100111\r\nbConfigured 0\r\nbIsLocked 0\r\nbEnRtPIN 0\r\n'
126
+ 'bWifiBtnRecEnable 1\r\nuVid 0\r\nbMumimo 0\r\nbMwdsEnable 0\r\nbLanAccess 0'
127
+ '\r\nSecurityType 1\r\nbApIsolated 1\r\neffectiveTime 0\r\nuMaxUploadSpeed -1'
128
+ '\r\nuMaxDownloadSpeed -1\r\nbwCtrlEnable 0\r\nenableBackup 0\r\nbTr069APEnable 0'
129
+ '\r\nbTr069SSIDEnable 0\r\nid 33|2,2,0\r\nuUnit 1\r\ncSsidPrefix Guest\r\n'
130
+ 'uRadiusIp 0.0.0.0\r\nuRadiusGKUpdateIntvl 0\r\nuPskGKUpdateIntvl 0\r\n'
131
+ 'uKeyLength 0 0\r\nuKeyLength 1 0\r\nuKeyLength 2 0\r\nuKeyLength 3 0\r\n'
132
+ 'cKeyVal 0\r\ncKeyVal 1\r\ncKeyVal 2\r\ncKeyVal 3\r\nuRadiusPort 1812\r\n'
133
+ 'uKeyType 0\r\nuDefaultKey 1\r\nbEnable 0\r\nbBcastSsid 1\r\ncSsid TP-Link_Guest_5G'
134
+ '\r\nbSecurityEnable 0\r\nuAuthType 3\r\nuWEPSecOpt 3\r\nuRadiusSecOpt 3\r\n'
135
+ 'uPSKSecOpt 3\r\nuRadiusEncryptType 1\r\nuPSKEncryptType 3\r\ncRadiusSecret\r\n'
136
+ 'cPskSecret\r\nbSecCheck 0\r\nbEnabled 1\r\ncUsrPIN 11100111\r\nbConfigured 0\r\n'
137
+ 'bIsLocked 0\r\nbEnRtPIN 0\r\nbWifiBtnRecEnable 1\r\nuVid 0\r\nbMumimo 0\r\n'
138
+ 'bMwdsEnable 0\r\nbLanAccess 0\r\nSecurityType 1\r\nbApIsolated 1\r\neffectiveTime 0'
139
+ '\r\nuMaxUploadSpeed -1\r\nuMaxDownloadSpeed -1\r\nbwCtrlEnable 0\r\nenableBackup 0'
140
+ '\r\nbTr069APEnable 0\r\nbTr069SSIDEnable 0\r\nid 33|1,9,0\r\nuUnit 9\r\n'
141
+ 'cSsidPrefix IoT\r\nuRadiusIp 0.0.0.0\r\nuRadiusGKUpdateIntvl 0\r\n'
142
+ 'uPskGKUpdateIntvl 0\r\nuKeyLength 0 0\r\nuKeyLength 1 0\r\nuKeyLength 2 0\r\n'
143
+ 'uKeyLength 3 0\r\ncKeyVal 0\r\ncKeyVal 1\r\ncKeyVal 2\r\ncKeyVal 3\r\n'
144
+ 'uRadiusPort 1812\r\nuKeyType 0\r\nuDefaultKey 1\r\nbEnable 1\r\nbBcastSsid 0'
145
+ '\r\ncSsid TP-Link_IoT\r\nbSecurityEnable 1\r\nuAuthType 3\r\nuWEPSecOpt 3\r\n'
146
+ 'uRadiusSecOpt 3\r\nuPSKSecOpt 2\r\nuRadiusEncryptType 1\r\nuPSKEncryptType 3'
147
+ '\r\ncRadiusSecret\r\ncPskSecret 11100111\r\nbSecCheck 0\r\nbEnabled 1\r\n'
148
+ 'cUsrPIN 11100111\r\nbConfigured 0\r\nbIsLocked 0\r\nbEnRtPIN 0\r\nbWifiBtnRecEnable 1'
149
+ '\r\nuVid 0\r\nbMumimo 0\r\nbMwdsEnable 0\r\nbLanAccess 1\r\nSecurityType 2\r\n'
150
+ 'bApIsolated 0\r\neffectiveTime 0\r\nuMaxUploadSpeed -1\r\nuMaxDownloadSpeed -1'
151
+ '\r\nbwCtrlEnable 0\r\nenableBackup 0\r\nbTr069APEnable 0\r\nbTr069SSIDEnable 0'
152
+ '\r\nid 33|2,9,0\r\nuUnit 9\r\ncSsidPrefix IoT\r\nuRadiusIp 0.0.0.0\r\n'
153
+ 'uRadiusGKUpdateIntvl 0\r\nuPskGKUpdateIntvl 0\r\nuKeyLength 0 0\r\nuKeyLength 1 0'
154
+ '\r\nuKeyLength 2 0\r\nuKeyLength 3 0\r\ncKeyVal 0\r\ncKeyVal 1\r\ncKeyVal 2\r\n'
155
+ 'cKeyVal 3\r\nuRadiusPort 1812\r\nuKeyType 0\r\nuDefaultKey 1\r\nbEnable 1\r\n'
156
+ 'bBcastSsid 0\r\ncSsid TP-Link_IoT\r\nbSecurityEnable 1\r\nuAuthType 3\r\n'
157
+ 'uWEPSecOpt 3\r\nuRadiusSecOpt 3\r\nuPSKSecOpt 2\r\nuRadiusEncryptType 1\r\n'
158
+ 'uPSKEncryptType 3\r\ncRadiusSecret\r\ncPskSecret 11100111\r\nbSecCheck 0\r\n'
159
+ 'bEnabled 1\r\ncUsrPIN 11100111\r\nbConfigured 0\r\nbIsLocked 0\r\nbEnRtPIN 0'
160
+ '\r\nbWifiBtnRecEnable 1\r\nuVid 0\r\nbMumimo 0\r\nbMwdsEnable 0\r\nbLanAccess 1'
161
+ '\r\nSecurityType 2\r\nbApIsolated 0\r\neffectiveTime 0\r\nuMaxUploadSpeed -1'
162
+ '\r\nuMaxDownloadSpeed -1\r\nbwCtrlEnable 0\r\nenableBackup 0\r\nbTr069APEnable 0'
163
+ '\r\nbTr069SSIDEnable 0')
164
+
165
+
166
+ class ResponseMock():
167
+ def __init__(self, text, status_code=0):
168
+ self.text = text
169
+ self.status_code = status_code
170
+
171
+
172
+ class TplinkC80RouterTest(TplinkC80Router):
173
+ response = ''
174
+
175
+ def request(self, code: int, asyn: int, use_token: bool = False, data: str = None) -> dict | None:
176
+
177
+ # Responses
178
+ if code == 2 and asyn == 1:
179
+ if use_token is False:
180
+ if data == '0|1,0,0':
181
+ # Supports
182
+ return ResponseMock(self.response, 200)
183
+ else:
184
+ # Authorization
185
+ return ResponseMock('blabla\r\nblabla\r\nblabla\r\nauthinfo1\r\nauthinfo2')
186
+ elif use_token is True:
187
+ return ResponseMock(self.response)
188
+ elif (code == 16 or code == 7) and asyn == 0:
189
+ if use_token is False:
190
+ # Authorization
191
+ return ResponseMock('00000\r\n010001\r\nBC97577E65233B3E1137C61091D64176C334E52AD78FFBDDABC826B685435E'
192
+ '9D3DE83FE70C2AC62D6B13BD8EADA10B5623F9354DA0E99636A4F5519CA2DC2DC3\r\n12345656')
193
+ elif use_token is True:
194
+ # Authorization
195
+ return ResponseMock('00000')
196
+
197
+ raise ClientException()
198
+
199
+ def set_encrypted_response(self, response_text) -> None:
200
+ self.response = self._encrypt_body(response_text).split('data=')[1]
201
+
202
+
203
+ class TestTPLinkClient(TestCase):
204
+
205
+ def test_supports(self) -> None:
206
+ response = ('00000\r\nid 0|1,0,0\r\nfullName AC1900%20MU-MIMO%20Wi-Fi%20Router\r\nfacturer TP-Link\r\nmodelName'
207
+ ' Archer%20C80\r\nmodelVer 2.20\r\nsoftVer 1.13.15%20Build%20240812%20Rel.53972n(4555)\r\nhardVer'
208
+ ' Archer%20C80%202.20\r\nspecialId 0x5545\r\ncountryCode 0x455a\r\nmainVer 0x5a010d0f\r\nminorVer'
209
+ ' 0x1\r\nfacturerType 0')
210
+
211
+ client = TplinkC80RouterTest('', '')
212
+ client.response = response
213
+ supports = client.supports()
214
+ self.assertTrue(supports)
215
+
216
+ def test_authorize(self) -> None:
217
+ client = TplinkC80RouterTest('', '')
218
+ client.authorize()
219
+
220
+ encryption = client._encryption
221
+ self.assertEqual(encryption.ee_rsa, '010001')
222
+ self.assertEqual(encryption.nn_rsa, 'BC97577E65233B3E1137C61091D64176C334E52AD78FFBDDABC826B685435E9D3DE83FE70C'
223
+ '2AC62D6B13BD8EADA10B5623F9354DA0E99636A4F5519CA2DC2DC3')
224
+ self.assertEqual(encryption.seq, '12345656')
225
+
226
+ def test_get_firmware(self) -> None:
227
+ response = ('00000\r\nid 0|1,0,0\r\nfullName AC1900%20MU-MIMO%20Wi-Fi%20Router\r\nfacturer TP-Link\r\nmodelName'
228
+ ' Archer%20C80\r\nmodelVer 2.20\r\nsoftVer 1.13.15%20Build%20240812%20Rel.53972n(4555)\r\nhardVer'
229
+ ' Archer%20C80%202.20\r\nspecialId 0x5545\r\ncountryCode 0x455a\r\nmainVer 0x5a010d0f\r\nminorVer'
230
+ ' 0x1\r\nfacturerType 0')
231
+
232
+ client = TplinkC80RouterTest('', '')
233
+ client.authorize()
234
+
235
+ client.set_encrypted_response(response)
236
+
237
+ firmware = client.get_firmware()
238
+
239
+ self.assertIsInstance(firmware, Firmware)
240
+ self.assertEqual(firmware.hardware_version, 'Archer C80 2.20')
241
+ self.assertEqual(firmware.model, 'Archer C80')
242
+ self.assertEqual(firmware.firmware_version, '1.13.15 Build 240812 Rel.53972n(4555)')
243
+
244
+ def test_get_ipv4_status(self) -> None:
245
+
246
+ client = TplinkC80RouterTest('', '')
247
+ client.authorize()
248
+
249
+ client.set_encrypted_response(IPV4_STATUS_RESPONSE)
250
+
251
+ ipv4_status: IPv4Status = client.get_ipv4_status()
252
+
253
+ self.assertIsInstance(ipv4_status, IPv4Status)
254
+ self.assertEqual(ipv4_status.wan_macaddress, EUI48('00-00-00-00-00-01'))
255
+ self.assertEqual(ipv4_status._wan_ipv4_ipaddr, IPv4Address('1.0.1.1'))
256
+ self.assertEqual(ipv4_status._wan_ipv4_gateway, IPv4Address('1.0.0.1'))
257
+ self.assertEqual(ipv4_status._wan_ipv4_conntype, 'Dynamic IP')
258
+ self.assertEqual(ipv4_status._wan_ipv4_netmask, IPv4Address('255.255.252.0'))
259
+ self.assertEqual(ipv4_status._wan_ipv4_pridns, IPv4Address('8.8.8.8'))
260
+ self.assertEqual(ipv4_status._wan_ipv4_snddns, IPv4Address('8.8.8.8'))
261
+ self.assertEqual(ipv4_status._lan_macaddr, EUI48('00-00-00-00-00-00'))
262
+ self.assertEqual(ipv4_status._lan_ipv4_ipaddr, IPv4Address('192.168.0.1'))
263
+ self.assertEqual(ipv4_status.lan_ipv4_dhcp_enable, True)
264
+ self.assertEqual(ipv4_status._lan_ipv4_netmask, IPv4Address('255.255.255.0'))
265
+
266
+ def test_get_ipv4_reservations(self) -> None:
267
+ response = ('00000\r\nid 12|1,0,0\r\nip 0 192.168.0.112\r\nip 1 0.0.0.0\r\nmac 0 00-00-00-00-00-00\r\n'
268
+ 'mac 1 00-00-00-00-00-01\r\nreserved 0\r\nreserved 1\r\nbindEntry 0 0\r\nbindEntry 1 0\r\n'
269
+ 'staMgtEntry 0 0\r\nstaMgtEntry 1 1\r\nname 0 Galaxy-S21\r\nname 1 Camera\r\nreserved_name 0\r\n'
270
+ 'reserved_name 1\r\nblocked 0 0\r\nblocked 1 0\r\nupLimit 0 0\r\nupLimit 1 0\r\ndownLimit 0 0'
271
+ '\r\ndownLimit 1 0\r\nqosEntry 0 0\r\nqosEntry 1 0\r\npriTime 0 0\r\npriTime 1 0\r\n'
272
+ 'dhcpsEntry 0 1\r\ndhcpsEntry 1 0\r\ndhcpsEnable 0 1\r\ndhcpsEnable 1 0\r\nslEnable 0 0\r\n'
273
+ 'slEnable 1 0\r\nstart 0 0\r\nstart 1 0\r\nend 0 0\r\nend 1 0\r\nday 0 0\r\nday 1 0\r\n'
274
+ 'startMin 0 0\r\nstartMin 1 0\r\nendMin 0 0\r\nendMin 1 0\r\ndevType 0 0\r\ndevType 1 0\r\n'
275
+ 'reserved2 0 0\r\nreserved2 1 0\r\ndisable 1')
276
+
277
+ client = TplinkC80RouterTest('', '')
278
+ client.authorize()
279
+
280
+ client.set_encrypted_response(response)
281
+
282
+ ipv4_reservations: list[IPv4Reservation] = client.get_ipv4_reservations()
283
+ ipv4_reservation: IPv4Reservation = ipv4_reservations[0]
284
+
285
+ self.assertIsInstance(ipv4_reservation, IPv4Reservation)
286
+ self.assertEqual(ipv4_reservation.macaddress, EUI48('00-00-00-00-00-00'))
287
+ self.assertEqual(ipv4_reservation.ipaddress, IPv4Address('192.168.0.112'))
288
+ self.assertEqual(ipv4_reservation.hostname, 'Galaxy-S21')
289
+ self.assertEqual(ipv4_reservation.enabled, True)
290
+
291
+ def test_get_dhcp_leases(self) -> None:
292
+ response = ('00000\r\nid 9|1,0,0\r\nhostName 0 Galaxy-S21\r\nhostName 1 iPhone\r\nhostName 2 PC\r\n'
293
+ 'hostName 3 Laptop\r\nmac 0 00-00-00-00-00-00\r\nmac 1 00-00-00-00-00-01\r\n'
294
+ 'mac 2 00-00-00-00-00-02\r\nmac 3 00-00-00-00-00-03\r\nreserved 0\r\nreserved 1'
295
+ '\r\nreserved 2\r\nreserved 3\r\nstate 0 5\r\nstate 1 5\r\nstate 2 5\r\nstate 3 5'
296
+ '\r\nip 0 192.168.0.112\r\nip 1 192.168.0.101\r\nip 2 192.168.0.245\r\nip 3 192.168.0.186'
297
+ '\r\nexpires 0 4294967295\r\nexpires 1 3669\r\nexpires 2 4025\r\nexpires 3 4202')
298
+
299
+ client = TplinkC80RouterTest('', '')
300
+ client.authorize()
301
+
302
+ client.set_encrypted_response(response)
303
+
304
+ dhcp_leases: list[IPv4DHCPLease] = client.get_dhcp_leases()
305
+
306
+ self.assertIsInstance(dhcp_leases[0], IPv4DHCPLease)
307
+ self.assertEqual(dhcp_leases[0].macaddress, EUI48('00-00-00-00-00-00'))
308
+ self.assertEqual(dhcp_leases[0].ipaddress, IPv4Address('192.168.0.112'))
309
+ self.assertEqual(dhcp_leases[0].hostname, 'Galaxy-S21')
310
+ self.assertEqual(dhcp_leases[0].lease_time, 'expires 4294967295')
311
+
312
+ self.assertIsInstance(dhcp_leases[1], IPv4DHCPLease)
313
+ self.assertEqual(dhcp_leases[1].macaddress, EUI48('00-00-00-00-00-01'))
314
+ self.assertEqual(dhcp_leases[1].ipaddress, IPv4Address('192.168.0.101'))
315
+ self.assertEqual(dhcp_leases[1].hostname, 'iPhone')
316
+ self.assertEqual(dhcp_leases[1].lease_time, 'expires 3669')
317
+
318
+ def test_get_vpn_status(self) -> None:
319
+ response = '00000\r\nid 22|1,0,0\r\nenable 1\r\nneedPnpDetect 0\r\nocnDetect 0\r\n' \
320
+ 'reserved\r\nlinkMode 0\r\nlinkType 4'
321
+
322
+ client = TplinkC80RouterTest('', '')
323
+ client.authorize()
324
+
325
+ client.set_encrypted_response(response)
326
+
327
+ vpn_status: VPNStatus = client.get_vpn_status()
328
+
329
+ self.assertIsInstance(vpn_status, VPNStatus)
330
+ self.assertEqual(vpn_status.openvpn_clients_total, 0)
331
+ self.assertEqual(vpn_status.pptpvpn_clients_total, 0)
332
+ self.assertEqual(vpn_status.pptpvpn_enable, True)
333
+
334
+ def test_get_status(self) -> None:
335
+ client = TplinkC80RouterTest('', '')
336
+ client.authorize()
337
+
338
+ client.set_encrypted_response(STATUS_RESPONSE_TEXT)
339
+ status = client.get_status()
340
+
341
+ self.assertIsInstance(status, Status)
342
+ self.assertEqual(status.wan_macaddr, '00-00-00-00-00-01')
343
+ self.assertIsInstance(status.wan_macaddress, EUI48)
344
+ self.assertEqual(status.lan_macaddr, '00-00-00-00-00-00')
345
+ self.assertIsInstance(status.lan_macaddress, EUI48)
346
+ self.assertEqual(status.wan_ipv4_addr, '100.100.100.100')
347
+ self.assertIsInstance(status.lan_ipv4_address, IPv4Address)
348
+ self.assertEqual(status.lan_ipv4_addr, '192.168.0.1')
349
+ self.assertEqual(status.wan_ipv4_gateway, '100.100.105.1')
350
+ self.assertIsInstance(status.wan_ipv4_address, IPv4Address)
351
+ self.assertEqual(status.wired_total, 1)
352
+ self.assertEqual(status.wifi_clients_total, 1)
353
+ self.assertEqual(status.guest_clients_total, 1)
354
+ self.assertEqual(status.clients_total, 4)
355
+ self.assertEqual(status.iot_clients_total, 1)
356
+ self.assertFalse(status.guest_2g_enable)
357
+ self.assertFalse(status.guest_5g_enable)
358
+ self.assertTrue(status.iot_2g_enable)
359
+ self.assertTrue(status.iot_5g_enable)
360
+ self.assertTrue(status.wifi_2g_enable)
361
+ self.assertTrue(status.wifi_5g_enable)
362
+ self.assertEqual(status.wan_ipv4_uptime, 308149)
363
+ self.assertEqual(status.mem_usage, None)
364
+ self.assertEqual(status.cpu_usage, None)
365
+ self.assertEqual(len(status.devices), 6)
366
+
367
+ device = status.devices[0]
368
+ self.assertIsInstance(device, Device)
369
+ self.assertEqual(device.type, Connection.UNKNOWN)
370
+ self.assertEqual(device.macaddr, '00-00-00-00-00-02')
371
+ self.assertIsInstance(device.macaddress, EUI48)
372
+ self.assertEqual(device.ipaddr, '192.168.0.1')
373
+ self.assertIsInstance(device.ipaddress, IPv4Address)
374
+ self.assertEqual(device.hostname, 'Laptop')
375
+ self.assertEqual(device.up_speed, 0)
376
+ self.assertEqual(device.down_speed, 0)
377
+
378
+ device = status.devices[1]
379
+ self.assertIsInstance(device, Device)
380
+ self.assertEqual(device.type, Connection.UNKNOWN)
381
+ self.assertEqual(device.macaddr, '00-00-00-00-00-03')
382
+ self.assertIsInstance(device.macaddress, EUI48)
383
+ self.assertEqual(device.ipaddr, '192.168.0.2')
384
+ self.assertIsInstance(device.ipaddress, IPv4Address)
385
+ self.assertEqual(device.hostname, 'iPhone')
386
+ self.assertEqual(device.up_speed, 0)
387
+ self.assertEqual(device.down_speed, 0)
388
+
389
+ device = status.devices[2]
390
+ self.assertIsInstance(device, Device)
391
+ self.assertEqual(device.type, Connection.GUEST_2G)
392
+ self.assertEqual(device.macaddr, '00-00-00-00-00-04')
393
+ self.assertIsInstance(device.macaddress, EUI48)
394
+ self.assertEqual(device.ipaddr, '192.168.0.3')
395
+ self.assertIsInstance(device.ipaddress, IPv4Address)
396
+ self.assertEqual(device.hostname, 'Laptop2')
397
+ self.assertEqual(device.up_speed, 30)
398
+ self.assertEqual(device.down_speed, 200)
399
+
400
+ device = status.devices[3]
401
+ self.assertIsInstance(device, Device)
402
+ self.assertEqual(device.type, Connection.HOST_2G)
403
+ self.assertEqual(device.macaddr, '00-00-00-00-00-05')
404
+ self.assertIsInstance(device.macaddress, EUI48)
405
+ self.assertEqual(device.ipaddr, '192.168.0.4')
406
+ self.assertIsInstance(device.ipaddress, IPv4Address)
407
+ self.assertEqual(device.hostname, 'iPhone2')
408
+ self.assertEqual(device.up_speed, 800)
409
+ self.assertEqual(device.down_speed, 400)
410
+
411
+ device = status.devices[4]
412
+ self.assertIsInstance(device, Device)
413
+ self.assertEqual(device.type, Connection.IOT_2G)
414
+ self.assertEqual(device.macaddr, '00-00-00-00-00-06')
415
+ self.assertIsInstance(device.macaddress, EUI48)
416
+ self.assertEqual(device.ipaddr, '192.168.0.5')
417
+ self.assertIsInstance(device.ipaddress, IPv4Address)
418
+ self.assertEqual(device.hostname, 'IoT_thing')
419
+ self.assertEqual(device.up_speed, 1824)
420
+ self.assertEqual(device.down_speed, 800)
421
+
422
+ device = status.devices[5]
423
+ self.assertIsInstance(device, Device)
424
+ self.assertEqual(device.type, Connection.WIRED)
425
+ self.assertEqual(device.macaddr, '00-00-00-00-00-07')
426
+ self.assertIsInstance(device.macaddress, EUI48)
427
+ self.assertEqual(device.ipaddr, '192.168.0.6')
428
+ self.assertIsInstance(device.ipaddress, IPv4Address)
429
+ self.assertEqual(device.hostname, 'PC')
430
+ self.assertEqual(device.up_speed, 600)
431
+ self.assertEqual(device.down_speed, 50)
432
+
433
+ def test_get_ipv4(self) -> None:
434
+ client = TplinkC80RouterTest('', '')
435
+ client.authorize()
436
+
437
+ client.set_encrypted_response(IPV4_RESPONSE_TEXT)
438
+ ipv4status: IPv4Status = client.get_ipv4_status()
439
+
440
+ self.assertIsInstance(ipv4status, IPv4Status)
441
+ self.assertEqual(ipv4status._wan_macaddr, EUI48('00-00-00-00-00-01'))
442
+ self.assertEqual(ipv4status._wan_ipv4_ipaddr, IPv4Address('1.1.1.1'))
443
+ self.assertEqual(ipv4status._wan_ipv4_gateway, IPv4Address('1.1.1.2'))
444
+ self.assertEqual(ipv4status._wan_ipv4_conntype, 'Dynamic IP')
445
+ self.assertEqual(ipv4status._wan_ipv4_netmask, IPv4Address('255.255.252.0'))
446
+ self.assertEqual(ipv4status._wan_ipv4_pridns, IPv4Address('5.8.8.8'))
447
+ self.assertEqual(ipv4status._wan_ipv4_snddns, IPv4Address('5.8.8.8'))
448
+ self.assertEqual(ipv4status._lan_macaddr, EUI48('00-00-00-00-00-00'))
449
+ self.assertEqual(ipv4status._lan_ipv4_ipaddr, IPv4Address('192.168.0.1'))
450
+ self.assertEqual(ipv4status.lan_ipv4_dhcp_enable, True)
451
+ self.assertEqual(ipv4status._lan_ipv4_netmask, IPv4Address('255.255.255.0'))
452
+
453
+
454
+ if __name__ == '__main__':
455
+ main()
@@ -310,6 +310,7 @@ X_TP_TotalPacketsReceived=467
310
310
  self.assertEqual(status.wan_ipv4_addr, '192.168.30.55')
311
311
  self.assertEqual(status.lan_ipv4_addr, '192.168.4.1')
312
312
  self.assertEqual(status.wan_ipv4_gateway, '192.168.30.1')
313
+ self.assertEqual(status.conn_type, 'ipoe_1_d')
313
314
  self.assertEqual(status.wired_total, 0)
314
315
  self.assertEqual(status.wifi_clients_total, 1)
315
316
  self.assertEqual(status.guest_clients_total, 0)
@@ -3,7 +3,8 @@ from tplinkrouterc6u.client.deco import TPLinkDecoClient
3
3
  from tplinkrouterc6u.client_abstract import AbstractRouter
4
4
  from tplinkrouterc6u.client.mr import TPLinkMRClient
5
5
  from tplinkrouterc6u.client.ex import TPLinkEXClient
6
- from tplinkrouterc6u.client.c6v4 import TplinkC6V4Router
6
+ from tplinkrouterc6u.client.vr import TPLinkVRClient
7
+ from tplinkrouterc6u.client.c80 import TplinkC80Router
7
8
  from tplinkrouterc6u.client.c5400x import TplinkC5400XRouter
8
9
  from tplinkrouterc6u.client.c1200 import TplinkC1200Router
9
10
  from tplinkrouterc6u.client.xdr import TPLinkXDRClient
@@ -284,6 +284,7 @@ class TplinkBaseRouter(AbstractRouter, TplinkRequest):
284
284
  status.wan_ipv4_uptime = data.get('wan_ipv4_uptime')
285
285
  status.mem_usage = data.get('mem_usage')
286
286
  status.cpu_usage = data.get('cpu_usage')
287
+ status.conn_type = data.get('conn_type')
287
288
  status.wired_total = len(data.get('access_devices_wired', []))
288
289
  status.wifi_clients_total = len(data.get('access_devices_wireless_host', []))
289
290
  status.guest_clients_total = len(data.get('access_devices_wireless_guest', []))