tplinkrouterc6u 5.0.3__py3-none-any.whl → 5.1.0__py3-none-any.whl
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.
- test/test_client_ex.py +339 -0
- test/test_client_mr.py +185 -0
- tplinkrouterc6u/__init__.py +13 -12
- tplinkrouterc6u/client/__init__.py +1 -0
- tplinkrouterc6u/client/api_cgi_bin.py +435 -0
- tplinkrouterc6u/client/c1200.py +102 -0
- tplinkrouterc6u/client/c5400x.py +109 -0
- tplinkrouterc6u/client/c6v4.py +38 -0
- tplinkrouterc6u/client/deco.py +177 -0
- tplinkrouterc6u/client/ex.py +295 -0
- tplinkrouterc6u/client/mr.py +645 -0
- tplinkrouterc6u/client_abstract.py +48 -0
- tplinkrouterc6u/common/__init__.py +1 -0
- tplinkrouterc6u/{dataclass.py → common/dataclass.py} +12 -1
- tplinkrouterc6u/provider.py +37 -0
- {tplinkrouterc6u-5.0.3.dist-info → tplinkrouterc6u-5.1.0.dist-info}/METADATA +16 -1
- tplinkrouterc6u-5.1.0.dist-info/RECORD +28 -0
- {tplinkrouterc6u-5.0.3.dist-info → tplinkrouterc6u-5.1.0.dist-info}/WHEEL +1 -1
- tplinkrouterc6u/client.py +0 -1451
- tplinkrouterc6u-5.0.3.dist-info/RECORD +0 -17
- /tplinkrouterc6u/{encryption.py → common/encryption.py} +0 -0
- /tplinkrouterc6u/{exception.py → common/exception.py} +0 -0
- /tplinkrouterc6u/{helper.py → common/helper.py} +0 -0
- /tplinkrouterc6u/{package_enum.py → common/package_enum.py} +0 -0
- {tplinkrouterc6u-5.0.3.dist-info → tplinkrouterc6u-5.1.0.dist-info}/LICENSE +0 -0
- {tplinkrouterc6u-5.0.3.dist-info → tplinkrouterc6u-5.1.0.dist-info}/top_level.txt +0 -0
test/test_client_ex.py
ADDED
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
from unittest import main, TestCase
|
|
2
|
+
from macaddress import EUI48
|
|
3
|
+
from ipaddress import IPv4Address
|
|
4
|
+
from tplinkrouterc6u import (
|
|
5
|
+
TPLinkEXClient,
|
|
6
|
+
Connection,
|
|
7
|
+
Firmware,
|
|
8
|
+
Status,
|
|
9
|
+
Device,
|
|
10
|
+
IPv4Reservation,
|
|
11
|
+
IPv4DHCPLease,
|
|
12
|
+
IPv4Status,
|
|
13
|
+
ClientException,
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class TestTPLinkEXClient(TestCase):
|
|
18
|
+
def test_firmware(self) -> None:
|
|
19
|
+
response = ('{"data":{"hardwareVersion":"EX511 v2.0 00000000","modelName":"EX511",'
|
|
20
|
+
'"softwareVersion":"0.7.0 3.0.0 v607e.0 Build 240930 Rel.11206n","stack":"0,0,0,0,0,0"},'
|
|
21
|
+
'"operation":"go","oid":"DEV2_DEV_INFO","success":true}')
|
|
22
|
+
|
|
23
|
+
class TPLinkEXClientTest(TPLinkEXClient):
|
|
24
|
+
self._token = True
|
|
25
|
+
|
|
26
|
+
def _request(self, url, method='POST', data_str=None, encrypt=False):
|
|
27
|
+
return 200, response
|
|
28
|
+
|
|
29
|
+
client = TPLinkEXClientTest('', '')
|
|
30
|
+
result = client.get_firmware()
|
|
31
|
+
|
|
32
|
+
self.assertIsInstance(result, Firmware)
|
|
33
|
+
self.assertEqual(result.hardware_version, 'EX511 v2.0 00000000')
|
|
34
|
+
self.assertEqual(result.model, 'EX511')
|
|
35
|
+
self.assertEqual(result.firmware_version, '0.7.0 3.0.0 v607e.0 Build 240930 Rel.11206n')
|
|
36
|
+
|
|
37
|
+
def test_get_status_with_5G(self) -> None:
|
|
38
|
+
|
|
39
|
+
DEV2_ADT_LAN = ('{"data":[{"MACAddress":"a0:28:84:de:dd:5c","IPAddress":"192.168.4.1","stack":"1,0,0,0,0,0"}],'
|
|
40
|
+
'"operation":"gl","oid":"DEV2_ADT_LAN","success":true}')
|
|
41
|
+
DEV2_ADT_WAN = ('{"data":[{"enable":"1","MACAddr":"BF-75-44-4C-DC-9E","connIPv4Address":"192.168.30.55",'
|
|
42
|
+
'"connIPv4Gateway":"192.168.30.1","stack":"1,0,0,0,0,0"}],"operation":"gl",'
|
|
43
|
+
'"oid":"DEV2_ADT_WAN","success":true}')
|
|
44
|
+
DEV2_ADT_WIFI_COMMON = ('{"data":[{"primaryEnable":"1","guestEnable":"0","stack":"1,0,0,0,0,0"},'
|
|
45
|
+
'{"primaryEnable":"0","guestEnable":"1","stack":"2,0,0,0,0,0"}],"operation":"gl",'
|
|
46
|
+
'"oid":"DEV2_ADT_WIFI_COMMON","success":true}')
|
|
47
|
+
DEV2_HOST_ENTRY = ('{"data":[{"active":"1","X_TP_LanConnType":"0","physAddress":"66-E2-02-BD-B5-1B",'
|
|
48
|
+
'"IPAddress":"192.168.30.10","hostName":"host1","stack":"1,0,0,0,0,0"},'
|
|
49
|
+
'{"active":"1","X_TP_LanConnType":"1","physAddress":"F4-A3-86-2D-41-B5",'
|
|
50
|
+
'"IPAddress":"192.168.30.11","hostName":"host2","stack":"2,0,0,0,0,0"}],"operation":"gl",'
|
|
51
|
+
'"oid":"DEV2_HOST_ENTRY","success":true}')
|
|
52
|
+
DEV2_MEM_STATUS = ('{"data":{"total":"192780","free":"78400","stack":"0,0,0,0,0,0"},"operation":"go",'
|
|
53
|
+
'"oid":"DEV2_MEM_STATUS","success":true}')
|
|
54
|
+
DEV2_PROC_STATUS = ('{"data":{"CPUUsage":"47","stack":"0,0,0,0,0,0"},"operation":"go",'
|
|
55
|
+
'"oid":"DEV2_PROC_STATUS","success":true}')
|
|
56
|
+
|
|
57
|
+
class TPLinkEXClientTest(TPLinkEXClient):
|
|
58
|
+
self._token = True
|
|
59
|
+
|
|
60
|
+
def _request(self, url, method='POST', data_str=None, encrypt=False):
|
|
61
|
+
if 'DEV2_ADT_LAN' in data_str:
|
|
62
|
+
return 200, DEV2_ADT_LAN
|
|
63
|
+
elif 'DEV2_ADT_WAN' in data_str:
|
|
64
|
+
return 200, DEV2_ADT_WAN
|
|
65
|
+
elif 'DEV2_ADT_WIFI_COMMON' in data_str:
|
|
66
|
+
return 200, DEV2_ADT_WIFI_COMMON
|
|
67
|
+
elif 'DEV2_HOST_ENTRY' in data_str:
|
|
68
|
+
return 200, DEV2_HOST_ENTRY
|
|
69
|
+
elif 'DEV2_MEM_STATUS' in data_str:
|
|
70
|
+
return 200, DEV2_MEM_STATUS
|
|
71
|
+
elif 'DEV2_PROC_STATUS' in data_str:
|
|
72
|
+
return 200, DEV2_PROC_STATUS
|
|
73
|
+
raise ClientException()
|
|
74
|
+
|
|
75
|
+
client = TPLinkEXClientTest('', '')
|
|
76
|
+
status = client.get_status()
|
|
77
|
+
|
|
78
|
+
self.assertIsInstance(status, Status)
|
|
79
|
+
self.assertEqual(status.wan_macaddr, 'BF-75-44-4C-DC-9E')
|
|
80
|
+
self.assertIsInstance(status.wan_macaddress, EUI48)
|
|
81
|
+
self.assertEqual(status.lan_macaddr, 'A0-28-84-DE-DD-5C')
|
|
82
|
+
self.assertIsInstance(status.lan_macaddress, EUI48)
|
|
83
|
+
self.assertEqual(status.wan_ipv4_addr, '192.168.30.55')
|
|
84
|
+
self.assertIsInstance(status.lan_ipv4_address, IPv4Address)
|
|
85
|
+
self.assertEqual(status.lan_ipv4_addr, '192.168.4.1')
|
|
86
|
+
self.assertEqual(status.wan_ipv4_gateway, '192.168.30.1')
|
|
87
|
+
self.assertIsInstance(status.wan_ipv4_address, IPv4Address)
|
|
88
|
+
self.assertEqual(status.wired_total, 1)
|
|
89
|
+
self.assertEqual(status.wifi_clients_total, 1)
|
|
90
|
+
self.assertEqual(status.guest_clients_total, 0)
|
|
91
|
+
self.assertEqual(status.clients_total, 2)
|
|
92
|
+
self.assertEqual(status.guest_2g_enable, False)
|
|
93
|
+
self.assertEqual(status.guest_5g_enable, True)
|
|
94
|
+
self.assertEqual(status.iot_2g_enable, None)
|
|
95
|
+
self.assertEqual(status.iot_5g_enable, None)
|
|
96
|
+
self.assertEqual(status.wifi_2g_enable, True)
|
|
97
|
+
self.assertEqual(status.wifi_5g_enable, False)
|
|
98
|
+
self.assertEqual(status.wan_ipv4_uptime, None)
|
|
99
|
+
self.assertGreaterEqual(status.mem_usage, 0)
|
|
100
|
+
self.assertLessEqual(status.mem_usage, 1)
|
|
101
|
+
self.assertGreaterEqual(status.cpu_usage, 0)
|
|
102
|
+
self.assertLessEqual(status.cpu_usage, 1)
|
|
103
|
+
self.assertEqual(len(status.devices), 2)
|
|
104
|
+
self.assertIsInstance(status.devices[0], Device)
|
|
105
|
+
self.assertEqual(status.devices[0].type, Connection.WIRED)
|
|
106
|
+
self.assertEqual(status.devices[0].macaddr, '66-E2-02-BD-B5-1B')
|
|
107
|
+
self.assertIsInstance(status.devices[0].macaddress, EUI48)
|
|
108
|
+
self.assertEqual(status.devices[0].ipaddr, '192.168.30.10')
|
|
109
|
+
self.assertIsInstance(status.devices[0].ipaddress, IPv4Address)
|
|
110
|
+
self.assertEqual(status.devices[0].hostname, 'host1')
|
|
111
|
+
self.assertEqual(status.devices[0].packets_sent, None)
|
|
112
|
+
self.assertEqual(status.devices[0].packets_received, None)
|
|
113
|
+
self.assertIsInstance(status.devices[1], Device)
|
|
114
|
+
self.assertEqual(status.devices[1].type, Connection.HOST_2G)
|
|
115
|
+
self.assertEqual(status.devices[1].macaddr, 'F4-A3-86-2D-41-B5')
|
|
116
|
+
self.assertIsInstance(status.devices[1].macaddress, EUI48)
|
|
117
|
+
self.assertEqual(status.devices[1].ipaddr, '192.168.30.11')
|
|
118
|
+
self.assertIsInstance(status.devices[1].ipaddress, IPv4Address)
|
|
119
|
+
self.assertEqual(status.devices[1].hostname, 'host2')
|
|
120
|
+
self.assertEqual(status.devices[1].packets_sent, None) # TODO
|
|
121
|
+
self.assertEqual(status.devices[1].packets_received, None) # TODO
|
|
122
|
+
|
|
123
|
+
def test_get_ipv4_reservations(self) -> None:
|
|
124
|
+
|
|
125
|
+
response = ('{"data":[{"enable":"1","chaddr":"bf:75:44:4c:dc:9e","yiaddr":"192.168.8.21",'
|
|
126
|
+
'"stack":"1,1,0,0,0,0"}],"operation":"gl","oid":"DEV2_DHCPV4_POOL_STATICADDR","success":true}')
|
|
127
|
+
|
|
128
|
+
class TPLinkEXClientTest(TPLinkEXClient):
|
|
129
|
+
self._token = True
|
|
130
|
+
|
|
131
|
+
def _request(self, url, method='POST', data_str=None, encrypt=False):
|
|
132
|
+
return 200, response
|
|
133
|
+
|
|
134
|
+
client = TPLinkEXClientTest('', '')
|
|
135
|
+
result = client.get_ipv4_reservations()
|
|
136
|
+
|
|
137
|
+
self.assertEqual(len(result), 1)
|
|
138
|
+
self.assertIsInstance(result[0], IPv4Reservation)
|
|
139
|
+
self.assertEqual(result[0].macaddr, 'BF-75-44-4C-DC-9E')
|
|
140
|
+
self.assertEqual(result[0].ipaddr, '192.168.8.21')
|
|
141
|
+
self.assertEqual(result[0].hostname, '')
|
|
142
|
+
self.assertEqual(result[0].enabled, True)
|
|
143
|
+
|
|
144
|
+
def test_get_ipv4_reservations_no_reservations(self) -> None:
|
|
145
|
+
response = '''
|
|
146
|
+
[error]0
|
|
147
|
+
|
|
148
|
+
'''
|
|
149
|
+
response = '{"data":[],"operation":"gl","oid":"DEV2_DHCPV4_POOL_STATICADDR","success":true}'
|
|
150
|
+
|
|
151
|
+
class TPLinkEXClientTest(TPLinkEXClient):
|
|
152
|
+
self._token = True
|
|
153
|
+
|
|
154
|
+
def _request(self, url, method='POST', data_str=None, encrypt=False):
|
|
155
|
+
return 200, response
|
|
156
|
+
|
|
157
|
+
client = TPLinkEXClientTest('', '')
|
|
158
|
+
result = client.get_ipv4_reservations()
|
|
159
|
+
|
|
160
|
+
self.assertEqual(len(result), 0)
|
|
161
|
+
|
|
162
|
+
def test_get_ipv4_dhcp_leases_no_leases(self) -> None:
|
|
163
|
+
|
|
164
|
+
response = '{"data":[],"operation":"gl","oid":"DEV2_HOST_ENTRY","success":true}'
|
|
165
|
+
|
|
166
|
+
class TPLinkEXClientTest(TPLinkEXClient):
|
|
167
|
+
self._token = True
|
|
168
|
+
|
|
169
|
+
def _request(self, url, method='POST', data_str=None, encrypt=False):
|
|
170
|
+
return 200, response
|
|
171
|
+
|
|
172
|
+
client = TPLinkEXClientTest('', '')
|
|
173
|
+
result = client.get_ipv4_dhcp_leases()
|
|
174
|
+
|
|
175
|
+
self.assertEqual(len(result), 0)
|
|
176
|
+
|
|
177
|
+
def test_get_ipv4_dhcp_leases(self) -> None:
|
|
178
|
+
|
|
179
|
+
response = ('{"data":[{"alias":"","physAddress":"bf:75:44:4c:dc:9e","IPAddress":"192.168.32.175",'
|
|
180
|
+
'"addressSource":"Static","leaseTimeRemaining":"85841","X_TP_IPv6Address":"",'
|
|
181
|
+
'"X_TP_IPv6LinkLocal":"","layer1Interface":"",'
|
|
182
|
+
'"X_TP_Layer2Interface":"Device.WiFi.AccessPoint.1.","vendorClassID":"","clientID":"",'
|
|
183
|
+
'"hostName":"name1","interfaceType":"Wi-Fi","X_TP_LanConnType":"1","X_TP_LanConnDev":"br0",'
|
|
184
|
+
'"active":"1","IPv4AddressNumberOfEntries":"0","X_TP_Vendor":"","X_TP_ClientType":"Other",'
|
|
185
|
+
'"X_TP_DevphyAddress":"","IPv6AddressNumberOfEntries":"0","X_TP_NetworkReadyTime":"0",'
|
|
186
|
+
'"stack":"1,0,0,0,0,0"}],"operation":"gl","oid":"DEV2_HOST_ENTRY","success":true}')
|
|
187
|
+
|
|
188
|
+
class TPLinkEXClientTest(TPLinkEXClient):
|
|
189
|
+
self._token = True
|
|
190
|
+
|
|
191
|
+
def _request(self, url, method='POST', data_str=None, encrypt=False):
|
|
192
|
+
return 200, response
|
|
193
|
+
|
|
194
|
+
client = TPLinkEXClientTest('', '')
|
|
195
|
+
result = client.get_ipv4_dhcp_leases()
|
|
196
|
+
|
|
197
|
+
self.assertEqual(len(result), 1)
|
|
198
|
+
self.assertIsInstance(result[0], IPv4DHCPLease)
|
|
199
|
+
self.assertEqual(result[0].macaddr, 'BF-75-44-4C-DC-9E')
|
|
200
|
+
self.assertEqual(result[0].ipaddr, '192.168.32.175')
|
|
201
|
+
self.assertEqual(result[0].hostname, 'name1')
|
|
202
|
+
self.assertEqual(result[0].lease_time, '23:50:41')
|
|
203
|
+
|
|
204
|
+
def test_get_ipv4_dhcp_leases_permanent(self) -> None:
|
|
205
|
+
|
|
206
|
+
response = ('{"data":[{"alias":"","physAddress":"bf:75:44:4c:dc:9e","IPAddress":"192.168.32.175",'
|
|
207
|
+
'"addressSource":"Static","leaseTimeRemaining":"0","X_TP_IPv6Address":"",'
|
|
208
|
+
'"X_TP_IPv6LinkLocal":"","layer1Interface":"","X_TP_Layer2Interface":"Device.WiFi.AccessPoint.1.",'
|
|
209
|
+
'"vendorClassID":"","clientID":"","hostName":"name1","interfaceType":"Wi-Fi",'
|
|
210
|
+
'"X_TP_LanConnType":"1","X_TP_LanConnDev":"br0","active":"1","IPv4AddressNumberOfEntries":"0",'
|
|
211
|
+
'"X_TP_Vendor":"","X_TP_ClientType":"Other","X_TP_DevphyAddress":"",'
|
|
212
|
+
'"IPv6AddressNumberOfEntries":"0","X_TP_NetworkReadyTime":"0","stack":"1,0,0,0,0,0"},'
|
|
213
|
+
'{"alias":"","physAddress":"a0:28:84:de:dd:5c","IPAddress":"192.168.32.176",'
|
|
214
|
+
'"addressSource":"Static","leaseTimeRemaining":"86372","X_TP_IPv6Address":"",'
|
|
215
|
+
'"X_TP_IPv6LinkLocal":"","layer1Interface":"","X_TP_Layer2Interface":"Device.WiFi.AccessPoint.1.",'
|
|
216
|
+
'"vendorClassID":"","clientID":"","hostName":"name2","interfaceType":"Wi-Fi",'
|
|
217
|
+
'"X_TP_LanConnType":"1","X_TP_LanConnDev":"br0","active":"1","IPv4AddressNumberOfEntries":"0",'
|
|
218
|
+
'"X_TP_Vendor":"","X_TP_ClientType":"Other","X_TP_DevphyAddress":"",'
|
|
219
|
+
'"IPv6AddressNumberOfEntries":"0","X_TP_NetworkReadyTime":"0","stack":"1,0,0,0,0,0"}],'
|
|
220
|
+
'"operation":"gl","oid":"DEV2_HOST_ENTRY","success":true}')
|
|
221
|
+
|
|
222
|
+
class TPLinkEXClientTest(TPLinkEXClient):
|
|
223
|
+
self._token = True
|
|
224
|
+
|
|
225
|
+
def _request(self, url, method='POST', data_str=None, encrypt=False):
|
|
226
|
+
return 200, response
|
|
227
|
+
|
|
228
|
+
client = TPLinkEXClientTest('', '')
|
|
229
|
+
result = client.get_ipv4_dhcp_leases()
|
|
230
|
+
|
|
231
|
+
self.assertEqual(len(result), 2)
|
|
232
|
+
self.assertEqual(result[0].macaddr, 'BF-75-44-4C-DC-9E')
|
|
233
|
+
self.assertEqual(result[0].ipaddr, '192.168.32.175')
|
|
234
|
+
self.assertEqual(result[0].hostname, 'name1')
|
|
235
|
+
self.assertEqual(result[0].lease_time, 'Permanent')
|
|
236
|
+
self.assertEqual(result[1].macaddr, 'A0-28-84-DE-DD-5C')
|
|
237
|
+
self.assertEqual(result[1].ipaddr, '192.168.32.176')
|
|
238
|
+
self.assertEqual(result[1].hostname, 'name2')
|
|
239
|
+
self.assertEqual(result[1].lease_time, '23:59:32')
|
|
240
|
+
|
|
241
|
+
def test_get_ipv4_status(self) -> None:
|
|
242
|
+
|
|
243
|
+
DEV2_ADT_LAN = ('{"data":[{"MACAddress":"bf:75:44:4c:dc:9e","IPAddress":"192.168.5.1",'
|
|
244
|
+
'"IPSubnetMask":"255.255.255.0","DHCPv4Enable":"1","stack":"1,0,0,0,0,0"}],'
|
|
245
|
+
'"operation":"gl","oid":"DEV2_ADT_LAN","success":true}')
|
|
246
|
+
DEV2_ADT_WAN = ('{"data":[{"enable":"1","MACAddr":"a0:28:84:de:dd:5c","connIPv4Address":"10.10.11.5",'
|
|
247
|
+
'"connIPv4Gateway":"11.11.11.11","name":"ipoe_0_0_d","connIPv4SubnetMask":"1.1.1.1",'
|
|
248
|
+
'"connIPv4DnsServer":"8.8.8.8,8.8.4.4","stack":"1,0,0,0,0,0"}],"operation":"gl",'
|
|
249
|
+
'"oid":"DEV2_ADT_WAN","success":true}')
|
|
250
|
+
|
|
251
|
+
class TPLinkEXClientTest(TPLinkEXClient):
|
|
252
|
+
self._token = True
|
|
253
|
+
|
|
254
|
+
def _request(self, url, method='POST', data_str=None, encrypt=False):
|
|
255
|
+
if 'DEV2_ADT_LAN' in data_str:
|
|
256
|
+
return 200, DEV2_ADT_LAN
|
|
257
|
+
elif 'DEV2_ADT_WAN' in data_str:
|
|
258
|
+
return 200, DEV2_ADT_WAN
|
|
259
|
+
raise ClientException()
|
|
260
|
+
|
|
261
|
+
client = TPLinkEXClientTest('', '')
|
|
262
|
+
result = client.get_ipv4_status()
|
|
263
|
+
|
|
264
|
+
self.assertIsInstance(result, IPv4Status)
|
|
265
|
+
self.assertEqual(result.wan_macaddr, 'A0-28-84-DE-DD-5C')
|
|
266
|
+
self.assertEqual(result.wan_ipv4_ipaddr, '10.10.11.5')
|
|
267
|
+
self.assertEqual(result.wan_ipv4_gateway, '11.11.11.11')
|
|
268
|
+
self.assertEqual(result.wan_ipv4_conntype, 'ipoe_0_0_d')
|
|
269
|
+
self.assertEqual(result.wan_ipv4_netmask, '1.1.1.1')
|
|
270
|
+
self.assertEqual(result.wan_ipv4_pridns, '8.8.8.8')
|
|
271
|
+
self.assertEqual(result.wan_ipv4_snddns, '8.8.4.4')
|
|
272
|
+
self.assertEqual(result.lan_macaddr, 'BF-75-44-4C-DC-9E')
|
|
273
|
+
self.assertEqual(result.lan_ipv4_ipaddr, '192.168.5.1')
|
|
274
|
+
self.assertEqual(result.lan_ipv4_netmask, '255.255.255.0')
|
|
275
|
+
self.assertEqual(result.lan_ipv4_dhcp_enable, True)
|
|
276
|
+
self.assertEqual(result.remote, None)
|
|
277
|
+
|
|
278
|
+
def test_get_ipv4_status_one_wlan(self) -> None:
|
|
279
|
+
|
|
280
|
+
DEV2_ADT_LAN = ('{"data":[{"MACAddress":"bf:75:44:4c:dc:9e","IPAddress":"192.168.5.1",'
|
|
281
|
+
'"IPSubnetMask":"255.255.255.0","DHCPv4Enable":"1","stack":"1,0,0,0,0,0"}],'
|
|
282
|
+
'"operation":"gl","oid":"DEV2_ADT_LAN","success":true}')
|
|
283
|
+
DEV2_ADT_WAN = ('{"data":[{"enable":"1","MACAddr":"ba:7a:a4:4a:dc:7e","connIPv4Address":"0.0.0.0",'
|
|
284
|
+
'"connIPv4Gateway":"0.0.0.0","name":"ipoe_0_0_d","connIPv4SubnetMask":"0.0.0.0",'
|
|
285
|
+
'"connIPv4DnsServer":"0.0.0.0,0.0.0.0","stack":"1,0,0,0,0,0"}],"operation":"gl",'
|
|
286
|
+
'"oid":"DEV2_ADT_WAN","success":true}')
|
|
287
|
+
|
|
288
|
+
class TPLinkEXClientTest(TPLinkEXClient):
|
|
289
|
+
self._token = True
|
|
290
|
+
|
|
291
|
+
def _request(self, url, method='POST', data_str=None, encrypt=False):
|
|
292
|
+
if 'DEV2_ADT_LAN' in data_str:
|
|
293
|
+
return 200, DEV2_ADT_LAN
|
|
294
|
+
elif 'DEV2_ADT_WAN' in data_str:
|
|
295
|
+
return 200, DEV2_ADT_WAN
|
|
296
|
+
raise ClientException()
|
|
297
|
+
|
|
298
|
+
client = TPLinkEXClientTest('', '')
|
|
299
|
+
result = client.get_ipv4_status()
|
|
300
|
+
|
|
301
|
+
self.assertIsInstance(result, IPv4Status)
|
|
302
|
+
self.assertEqual(result.wan_macaddr, 'BA-7A-A4-4A-DC-7E')
|
|
303
|
+
self.assertEqual(result.wan_ipv4_ipaddr, '0.0.0.0')
|
|
304
|
+
self.assertEqual(result.wan_ipv4_gateway, '0.0.0.0')
|
|
305
|
+
self.assertEqual(result.wan_ipv4_conntype, 'ipoe_0_0_d')
|
|
306
|
+
self.assertEqual(result.wan_ipv4_netmask, '0.0.0.0')
|
|
307
|
+
self.assertEqual(result.wan_ipv4_pridns, '0.0.0.0')
|
|
308
|
+
self.assertEqual(result.wan_ipv4_snddns, '0.0.0.0')
|
|
309
|
+
self.assertEqual(result.lan_macaddr, 'BF-75-44-4C-DC-9E')
|
|
310
|
+
self.assertEqual(result.lan_ipv4_ipaddr, '192.168.5.1')
|
|
311
|
+
self.assertEqual(result.lan_ipv4_netmask, '255.255.255.0')
|
|
312
|
+
self.assertEqual(result.lan_ipv4_dhcp_enable, True)
|
|
313
|
+
self.assertEqual(result.remote, None)
|
|
314
|
+
|
|
315
|
+
def test_set_wifi(self) -> None:
|
|
316
|
+
response = '{"success":true, "errorcode":0}'
|
|
317
|
+
|
|
318
|
+
check_url = ''
|
|
319
|
+
check_data = ''
|
|
320
|
+
|
|
321
|
+
class TPLinkEXClientTest(TPLinkEXClient):
|
|
322
|
+
self._token = True
|
|
323
|
+
|
|
324
|
+
def _request(self, url, method='POST', data_str=None, encrypt=False):
|
|
325
|
+
nonlocal check_url, check_data
|
|
326
|
+
check_url = url
|
|
327
|
+
check_data = data_str
|
|
328
|
+
return 200, response
|
|
329
|
+
|
|
330
|
+
client = TPLinkEXClientTest('', '')
|
|
331
|
+
client.set_wifi(Connection.HOST_2G, True)
|
|
332
|
+
|
|
333
|
+
self.assertIn('http:///cgi_gdpr?9?_=', check_url)
|
|
334
|
+
self.assertEqual(check_data, '{"data":{"stack":"1,0,0,0,0,0","pstack":"0,0,0,0,0,0",'
|
|
335
|
+
'"primaryEnable":"1"},"operation":"so","oid":"DEV2_ADT_WIFI_COMMON"}')
|
|
336
|
+
|
|
337
|
+
|
|
338
|
+
if __name__ == '__main__':
|
|
339
|
+
main()
|
test/test_client_mr.py
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
from unittest import main, TestCase
|
|
2
2
|
from macaddress import EUI48
|
|
3
3
|
from ipaddress import IPv4Address
|
|
4
|
+
from datetime import datetime
|
|
4
5
|
from tplinkrouterc6u import (
|
|
5
6
|
TPLinkMRClient,
|
|
6
7
|
Connection,
|
|
@@ -10,6 +11,8 @@ from tplinkrouterc6u import (
|
|
|
10
11
|
IPv4Reservation,
|
|
11
12
|
IPv4DHCPLease,
|
|
12
13
|
IPv4Status,
|
|
14
|
+
ClientError,
|
|
15
|
+
SMS,
|
|
13
16
|
)
|
|
14
17
|
|
|
15
18
|
|
|
@@ -679,6 +682,188 @@ DNSServers=0.0.0.0,0.0.0.0
|
|
|
679
682
|
self.assertEqual(check_data, ('2\r\n[LTE_SMS_SENDNEWMSG#0,0,0,0,0,0#0,0,0,0,0,0]0,3\r\nindex=1\r\n'
|
|
680
683
|
'to=534324724234\r\ntextContent=test sms\r\n'))
|
|
681
684
|
|
|
685
|
+
def test_send_ussd(self) -> None:
|
|
686
|
+
responses = ['''[error]0
|
|
687
|
+
|
|
688
|
+
''', '''[0,0,0,0,0,0]0
|
|
689
|
+
sessionStatus=1
|
|
690
|
+
sendResult=1
|
|
691
|
+
response=
|
|
692
|
+
ussdStatus=0
|
|
693
|
+
[error]0
|
|
694
|
+
|
|
695
|
+
''', '''[0,0,0,0,0,0]0
|
|
696
|
+
sessionStatus=0
|
|
697
|
+
sendResult=1
|
|
698
|
+
response=some text
|
|
699
|
+
ussdStatus=1
|
|
700
|
+
[error]0
|
|
701
|
+
|
|
702
|
+
''']
|
|
703
|
+
|
|
704
|
+
check_url = []
|
|
705
|
+
check_data = []
|
|
706
|
+
|
|
707
|
+
class TPLinkMRClientTest(TPLinkMRClient):
|
|
708
|
+
def _request(self, url, method='POST', data_str=None, encrypt=False):
|
|
709
|
+
nonlocal check_url, check_data
|
|
710
|
+
check_url.append(url)
|
|
711
|
+
check_data.append(data_str)
|
|
712
|
+
return 200, responses.pop(0)
|
|
713
|
+
|
|
714
|
+
client = TPLinkMRClientTest('', '')
|
|
715
|
+
|
|
716
|
+
self.assertEqual('some text', client.send_ussd('534324724234'))
|
|
717
|
+
|
|
718
|
+
self.assertIn('http:///cgi_gdpr?_=', check_url.pop(0))
|
|
719
|
+
self.assertEqual(check_data.pop(0),
|
|
720
|
+
'2\r\n[LTE_USSD#0,0,0,0,0,0#0,0,0,0,0,0]0,2\r\naction=1\r\nreqContent=534324724234\r\n')
|
|
721
|
+
|
|
722
|
+
self.assertIn('http:///cgi_gdpr?_=', check_url.pop(0))
|
|
723
|
+
self.assertEqual(check_data.pop(0),
|
|
724
|
+
('1\r\n[LTE_USSD#0,0,0,0,0,0#0,0,0,0,0,0]0,4\r\nsessionStatus\r\n'
|
|
725
|
+
'sendResult\r\nresponse\r\nussdStatus\r\n'))
|
|
726
|
+
|
|
727
|
+
def test_send_ussd_error(self) -> None:
|
|
728
|
+
responses = ['''[error]0
|
|
729
|
+
|
|
730
|
+
''', '''[0,0,0,0,0,0]0
|
|
731
|
+
sessionStatus=1
|
|
732
|
+
sendResult=1
|
|
733
|
+
response=
|
|
734
|
+
ussdStatus=0
|
|
735
|
+
[error]0
|
|
736
|
+
|
|
737
|
+
''', '''[0,0,0,0,0,0]0
|
|
738
|
+
sessionStatus=0
|
|
739
|
+
sendResult=1
|
|
740
|
+
response=
|
|
741
|
+
ussdStatus=2
|
|
742
|
+
[error]0
|
|
743
|
+
|
|
744
|
+
''']
|
|
745
|
+
|
|
746
|
+
check_url = []
|
|
747
|
+
check_data = []
|
|
748
|
+
|
|
749
|
+
class TPLinkMRClientTest(TPLinkMRClient):
|
|
750
|
+
def _request(self, url, method='POST', data_str=None, encrypt=False):
|
|
751
|
+
nonlocal check_url, check_data
|
|
752
|
+
check_url.append(url)
|
|
753
|
+
check_data.append(data_str)
|
|
754
|
+
return 200, responses.pop(0)
|
|
755
|
+
|
|
756
|
+
client = TPLinkMRClientTest('', '')
|
|
757
|
+
|
|
758
|
+
with self.assertRaises(ClientError) as context:
|
|
759
|
+
client.send_ussd('534324724234')
|
|
760
|
+
|
|
761
|
+
self.assertTrue('Cannot send USSD!' in str(context.exception))
|
|
762
|
+
|
|
763
|
+
self.assertIn('http:///cgi_gdpr?_=', check_url.pop(0))
|
|
764
|
+
self.assertEqual(check_data.pop(0),
|
|
765
|
+
'2\r\n[LTE_USSD#0,0,0,0,0,0#0,0,0,0,0,0]0,2\r\naction=1\r\nreqContent=534324724234\r\n')
|
|
766
|
+
|
|
767
|
+
self.assertIn('http:///cgi_gdpr?_=', check_url.pop(0))
|
|
768
|
+
self.assertEqual(check_data.pop(0),
|
|
769
|
+
('1\r\n[LTE_USSD#0,0,0,0,0,0#0,0,0,0,0,0]0,4\r\nsessionStatus\r\nsendResult\r\n'
|
|
770
|
+
'response\r\nussdStatus\r\n'))
|
|
771
|
+
|
|
772
|
+
def test_get_sms(self) -> None:
|
|
773
|
+
response = '''[1,0,0,0,0,0]1
|
|
774
|
+
index=3
|
|
775
|
+
from=sender1
|
|
776
|
+
content=text second
|
|
777
|
+
receivedTime=2024-11-15 22:28:09
|
|
778
|
+
unread=1
|
|
779
|
+
[2,0,0,0,0,0]1
|
|
780
|
+
index=2
|
|
781
|
+
from=sender2
|
|
782
|
+
content=text first
|
|
783
|
+
receivedTime=2024-11-15 22:23:59
|
|
784
|
+
unread=0
|
|
785
|
+
[error]0
|
|
786
|
+
'''
|
|
787
|
+
|
|
788
|
+
class TPLinkMRClientTest(TPLinkMRClient):
|
|
789
|
+
def _request(self, url, method='POST', data_str=None, encrypt=False):
|
|
790
|
+
return 200, response
|
|
791
|
+
|
|
792
|
+
client = TPLinkMRClientTest('', '')
|
|
793
|
+
messages = client.get_sms()
|
|
794
|
+
|
|
795
|
+
self.assertEqual(len(messages), 2)
|
|
796
|
+
self.assertIsInstance(messages[0], SMS)
|
|
797
|
+
self.assertEqual(messages[0].id, 1)
|
|
798
|
+
self.assertEqual(messages[0].sender, 'sender1')
|
|
799
|
+
self.assertEqual(messages[0].content, 'text second')
|
|
800
|
+
self.assertEqual(messages[0].received_at, datetime.fromisoformat('2024-11-15 22:28:09'))
|
|
801
|
+
self.assertEqual(messages[0].unread, True)
|
|
802
|
+
self.assertIsInstance(messages[1], SMS)
|
|
803
|
+
self.assertEqual(messages[1].id, 2)
|
|
804
|
+
self.assertEqual(messages[1].sender, 'sender2')
|
|
805
|
+
self.assertEqual(messages[1].content, 'text first')
|
|
806
|
+
self.assertEqual(messages[1].received_at, datetime.fromisoformat('2024-11-15 22:23:59'))
|
|
807
|
+
self.assertEqual(messages[1].unread, False)
|
|
808
|
+
|
|
809
|
+
def test_get_sms_empty(self) -> None:
|
|
810
|
+
response = '''[error]0
|
|
811
|
+
|
|
812
|
+
'''
|
|
813
|
+
|
|
814
|
+
class TPLinkMRClientTest(TPLinkMRClient):
|
|
815
|
+
def _request(self, url, method='POST', data_str=None, encrypt=False):
|
|
816
|
+
return 200, response
|
|
817
|
+
|
|
818
|
+
client = TPLinkMRClientTest('', '')
|
|
819
|
+
messages = client.get_sms()
|
|
820
|
+
|
|
821
|
+
self.assertEqual([], messages)
|
|
822
|
+
|
|
823
|
+
def test_set_sms_read(self) -> None:
|
|
824
|
+
response = '''
|
|
825
|
+
[error]0
|
|
826
|
+
|
|
827
|
+
'''
|
|
828
|
+
|
|
829
|
+
check_url = ''
|
|
830
|
+
check_data = ''
|
|
831
|
+
|
|
832
|
+
class TPLinkMRClientTest(TPLinkMRClient):
|
|
833
|
+
def _request(self, url, method='POST', data_str=None, encrypt=False):
|
|
834
|
+
nonlocal check_url, check_data
|
|
835
|
+
check_url = url
|
|
836
|
+
check_data = data_str
|
|
837
|
+
return 200, response
|
|
838
|
+
|
|
839
|
+
client = TPLinkMRClientTest('', '')
|
|
840
|
+
client.set_sms_read(SMS(2, '', '', datetime.now(), True))
|
|
841
|
+
|
|
842
|
+
self.assertIn('http:///cgi_gdpr?_=', check_url)
|
|
843
|
+
self.assertEqual(check_data, '2\r\n[LTE_SMS_RECVMSGENTRY#2,0,0,0,0,0#0,0,0,0,0,0]0,1\r\nunread=0\r\n')
|
|
844
|
+
|
|
845
|
+
def test_delete_sms(self) -> None:
|
|
846
|
+
response = '''
|
|
847
|
+
[error]0
|
|
848
|
+
|
|
849
|
+
'''
|
|
850
|
+
|
|
851
|
+
check_url = ''
|
|
852
|
+
check_data = ''
|
|
853
|
+
|
|
854
|
+
class TPLinkMRClientTest(TPLinkMRClient):
|
|
855
|
+
def _request(self, url, method='POST', data_str=None, encrypt=False):
|
|
856
|
+
nonlocal check_url, check_data
|
|
857
|
+
check_url = url
|
|
858
|
+
check_data = data_str
|
|
859
|
+
return 200, response
|
|
860
|
+
|
|
861
|
+
client = TPLinkMRClientTest('', '')
|
|
862
|
+
client.delete_sms(SMS(2, '', '', datetime.now(), True))
|
|
863
|
+
|
|
864
|
+
self.assertIn('http:///cgi_gdpr?_=', check_url)
|
|
865
|
+
self.assertEqual(check_data, '4\r\n[LTE_SMS_RECVMSGENTRY#2,0,0,0,0,0#0,0,0,0,0,0]0,0\r\n\r\n')
|
|
866
|
+
|
|
682
867
|
|
|
683
868
|
if __name__ == '__main__':
|
|
684
869
|
main()
|
tplinkrouterc6u/__init__.py
CHANGED
|
@@ -1,19 +1,20 @@
|
|
|
1
|
-
from tplinkrouterc6u.client import
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
from tplinkrouterc6u.package_enum import Connection
|
|
11
|
-
from tplinkrouterc6u.dataclass import (
|
|
1
|
+
from tplinkrouterc6u.client.api_cgi_bin import TplinkRouter
|
|
2
|
+
from tplinkrouterc6u.client.deco import TPLinkDecoClient
|
|
3
|
+
from tplinkrouterc6u.client_abstract import AbstractRouter
|
|
4
|
+
from tplinkrouterc6u.client.mr import TPLinkMRClient
|
|
5
|
+
from tplinkrouterc6u.client.ex import TPLinkEXClient
|
|
6
|
+
from tplinkrouterc6u.client.c6v4 import TplinkC6V4Router
|
|
7
|
+
from tplinkrouterc6u.client.c5400x import TplinkC5400XRouter
|
|
8
|
+
from tplinkrouterc6u.client.c1200 import TplinkC1200Router
|
|
9
|
+
from tplinkrouterc6u.provider import TplinkRouterProvider
|
|
10
|
+
from tplinkrouterc6u.common.package_enum import Connection
|
|
11
|
+
from tplinkrouterc6u.common.dataclass import (
|
|
12
12
|
Firmware,
|
|
13
13
|
Status,
|
|
14
14
|
Device,
|
|
15
15
|
IPv4Reservation,
|
|
16
16
|
IPv4DHCPLease,
|
|
17
17
|
IPv4Status,
|
|
18
|
+
SMS,
|
|
18
19
|
)
|
|
19
|
-
from tplinkrouterc6u.exception import ClientException
|
|
20
|
+
from tplinkrouterc6u.common.exception import ClientException, ClientError, AuthorizeError
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""All clients are here"""
|