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.
- {tplinkrouterc6u-5.4.2 → tplinkrouterc6u-5.6.0}/PKG-INFO +8 -1
- {tplinkrouterc6u-5.4.2 → tplinkrouterc6u-5.6.0}/README.md +7 -0
- {tplinkrouterc6u-5.4.2 → tplinkrouterc6u-5.6.0}/setup.py +1 -1
- {tplinkrouterc6u-5.4.2 → tplinkrouterc6u-5.6.0}/test/test_client_c6u.py +2 -0
- tplinkrouterc6u-5.6.0/test/test_client_c80.py +455 -0
- {tplinkrouterc6u-5.4.2 → tplinkrouterc6u-5.6.0}/test/test_client_mr.py +1 -0
- {tplinkrouterc6u-5.4.2 → tplinkrouterc6u-5.6.0}/tplinkrouterc6u/__init__.py +2 -1
- {tplinkrouterc6u-5.4.2 → tplinkrouterc6u-5.6.0}/tplinkrouterc6u/client/c6u.py +1 -0
- tplinkrouterc6u-5.6.0/tplinkrouterc6u/client/c80.py +406 -0
- {tplinkrouterc6u-5.4.2 → tplinkrouterc6u-5.6.0}/tplinkrouterc6u/client/ex.py +2 -2
- {tplinkrouterc6u-5.4.2 → tplinkrouterc6u-5.6.0}/tplinkrouterc6u/client/mr.py +209 -208
- tplinkrouterc6u-5.6.0/tplinkrouterc6u/client/vr.py +129 -0
- {tplinkrouterc6u-5.4.2 → tplinkrouterc6u-5.6.0}/tplinkrouterc6u/common/dataclass.py +1 -0
- tplinkrouterc6u-5.6.0/tplinkrouterc6u/provider.py +45 -0
- {tplinkrouterc6u-5.4.2 → tplinkrouterc6u-5.6.0}/tplinkrouterc6u.egg-info/PKG-INFO +8 -1
- {tplinkrouterc6u-5.4.2 → tplinkrouterc6u-5.6.0}/tplinkrouterc6u.egg-info/SOURCES.txt +3 -0
- tplinkrouterc6u-5.4.2/tplinkrouterc6u/provider.py +0 -39
- {tplinkrouterc6u-5.4.2 → tplinkrouterc6u-5.6.0}/LICENSE +0 -0
- {tplinkrouterc6u-5.4.2 → tplinkrouterc6u-5.6.0}/setup.cfg +0 -0
- {tplinkrouterc6u-5.4.2 → tplinkrouterc6u-5.6.0}/test/__init__.py +0 -0
- {tplinkrouterc6u-5.4.2 → tplinkrouterc6u-5.6.0}/test/test_client_c1200.py +0 -0
- {tplinkrouterc6u-5.4.2 → tplinkrouterc6u-5.6.0}/test/test_client_deco.py +0 -0
- {tplinkrouterc6u-5.4.2 → tplinkrouterc6u-5.6.0}/test/test_client_ex.py +0 -0
- {tplinkrouterc6u-5.4.2 → tplinkrouterc6u-5.6.0}/test/test_client_xdr.py +0 -0
- {tplinkrouterc6u-5.4.2 → tplinkrouterc6u-5.6.0}/tplinkrouterc6u/client/__init__.py +0 -0
- {tplinkrouterc6u-5.4.2 → tplinkrouterc6u-5.6.0}/tplinkrouterc6u/client/c1200.py +0 -0
- {tplinkrouterc6u-5.4.2 → tplinkrouterc6u-5.6.0}/tplinkrouterc6u/client/c5400x.py +0 -0
- {tplinkrouterc6u-5.4.2 → tplinkrouterc6u-5.6.0}/tplinkrouterc6u/client/c6v4.py +0 -0
- {tplinkrouterc6u-5.4.2 → tplinkrouterc6u-5.6.0}/tplinkrouterc6u/client/deco.py +0 -0
- {tplinkrouterc6u-5.4.2 → tplinkrouterc6u-5.6.0}/tplinkrouterc6u/client/xdr.py +0 -0
- {tplinkrouterc6u-5.4.2 → tplinkrouterc6u-5.6.0}/tplinkrouterc6u/client_abstract.py +0 -0
- {tplinkrouterc6u-5.4.2 → tplinkrouterc6u-5.6.0}/tplinkrouterc6u/common/__init__.py +0 -0
- {tplinkrouterc6u-5.4.2 → tplinkrouterc6u-5.6.0}/tplinkrouterc6u/common/encryption.py +0 -0
- {tplinkrouterc6u-5.4.2 → tplinkrouterc6u-5.6.0}/tplinkrouterc6u/common/exception.py +0 -0
- {tplinkrouterc6u-5.4.2 → tplinkrouterc6u-5.6.0}/tplinkrouterc6u/common/helper.py +0 -0
- {tplinkrouterc6u-5.4.2 → tplinkrouterc6u-5.6.0}/tplinkrouterc6u/common/package_enum.py +0 -0
- {tplinkrouterc6u-5.4.2 → tplinkrouterc6u-5.6.0}/tplinkrouterc6u.egg-info/dependency_links.txt +0 -0
- {tplinkrouterc6u-5.4.2 → tplinkrouterc6u-5.6.0}/tplinkrouterc6u.egg-info/requires.txt +0 -0
- {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.
|
|
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
|
|
@@ -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.
|
|
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', []))
|