Skip to content

Commit

Permalink
first working version of library
Browse files Browse the repository at this point in the history
  • Loading branch information
quillcraftsman committed Sep 7, 2024
1 parent 798babb commit dfdf882
Show file tree
Hide file tree
Showing 11 changed files with 399 additions and 18 deletions.
29 changes: 25 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -78,8 +78,11 @@ You can find **Full Project Documentation** [here][documentation_path]
## Mission

`tenda-everest` is python package to manage Tenda Everest router.
This package was tested on **EVEREST EWR-F303** Wireless Router with **Tenda** firmware **V02.03.01.125**
(and similar). But this package may work on different routers with other firmwares.

This package was tested on **EVEREST EWR-F303** Wireless Router with **Tenda** firmware **V02.03.01.125**.
It also works with **V12.01.01.33_multi** but may be with some problems.
It could work with other similar firmwares.
But this package may work on different routers with other firmwares.

![Everest ewr-f303 router picture](https://github.com/quillcraftsman/tenda-everest/blob/main/everest.jpeg)

Expand Down Expand Up @@ -117,9 +120,27 @@ See more in [Full Documentation](https://quillcraftsman.github.io/tenda-everest/
## Quickstart

```python
from tenda_everest import info
import pprint
import requests
from tenda_everest import login, get_info, MODULES, request_firmware

host = 'http://192.168.0.1:8081' # There is device located

session = login(requests, host) # connect to device and login

firmware = request_firmware(host, session) # check router firmware
print(firmware)

modules = ( # What do you want to know
MODULES.systemInfo,
MODULES.wanBasicCfg,
MODULES.wifiBasicCfg,
MODULES.softWare,
)

info = get_info(host, session, modules, firmware=firmware)

print(info())
pprint.pprint(info)
```

### More examples in [Full Documentation][documentation_path]
Expand Down
7 changes: 5 additions & 2 deletions docs/about.rst
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,11 @@ Mission
-------

**tenda-everest** is python package to manage Tenda Everest router.
This package was tested on **EVEREST EWR-F303** Wireless Router with **Tenda** firmware **V02.03.01.125**
(and similar). But this package may work on different routers with other firmwares.

This package was tested on **EVEREST EWR-F303** Wireless Router with **Tenda** firmware **V02.03.01.125**.
It also works with **V12.01.01.33_multi** but may be with some problems.
It could work with other similar firmwares.
But this package may work on different routers with other firmwares.

Open Source Project
-------------------
Expand Down
22 changes: 20 additions & 2 deletions quickstart/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,24 @@ def main():
TendaEverest simple usage
:return:
"""
from tenda_everest import info # pylint: disable=import-outside-toplevel
import pprint # pylint: disable=import-outside-toplevel
import requests # pylint: disable=import-outside-toplevel
from tenda_everest import login, get_info, MODULES, request_firmware # pylint: disable=import-outside-toplevel

print(info())
host = 'http://192.168.0.1:8081' # There is device located

session = login(requests, host) # connect to device and login

firmware = request_firmware(host, session) # check router firmware
print(firmware)

modules = ( # What do you want to know
MODULES.systemInfo,
MODULES.wanBasicCfg,
MODULES.wifiBasicCfg,
MODULES.softWare,
)

info = get_info(host, session, modules, firmware=firmware)

pprint.pprint(info)
2 changes: 1 addition & 1 deletion tenda_everest/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
"""
TendaEverest package
"""
from .main import info
from .main import login, get_info, MODULES, request_firmware
154 changes: 152 additions & 2 deletions tenda_everest/main.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,160 @@
"""
Main module
"""
from enum import Enum, verify, UNIQUE, auto

DEFAULT_FIRMWARE = 'V02.03.01.125'

def info():
def login(requests, host):
"""
Info
"""
return 'First steps with TendaEverest'
session = requests.session()

url = '/login/Auth'

referer = f'{host}/login.html'

headers = {
'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:130.0) '
'Gecko/20100101 Firefox/130.0',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,'
'image/avif,image/webp,image/png,image/svg+xml,*/*;q=0.8',
'Accept-Language': 'en-US,en;q=0.5',
'Content-Type': 'application/x-www-form-urlencoded',
'Connection': 'keep-alive',
'Referer': referer

}

data = {
'password': "YWRtaW4=" # admin coded in base64
}

request_url = f'{host}{url}'

session.post(
url=request_url,
headers=headers,
data=data
)

return session

# pylint:disable=invalid-name
@verify(UNIQUE)
class MODULES(Enum):
"""
Available modules
"""
systemInfo = auto()
wifiBasicCfg = auto()
wanBasicCfg = auto()
softWare = auto()
wifiBeamforming = auto()
onlineList = auto()
hasNewSoftVersion = auto()
portList = auto()
sysTime = auto()
wifiRelay = auto()
parentAccessCtrl = auto()
ipv6Status = auto()
LEDControl = auto()
ping = auto()
wifiTime = auto()
parentCtrlList = auto()
macFilter = auto()
internetStatus = auto()
IPTV = auto()
guestList = auto()
lan6Cfg = auto()
wan6BasicCfg = auto()
ipv6Enable = auto()
deviceStatistics = auto()
lanCfg = auto()
wanAdvCfg = auto()
productInfo = auto()
wpsModule = auto()
upnp = auto()
wifiAdvCfg = auto()
staticIPList = auto()
isWifiClients = auto()
localhost = auto()
wifiGuest = auto()
wifiWPS = auto()
remoteWeb = auto()
dmz = auto()
wifiPower = auto()
loginAuth = auto()
ddns = auto()


def get_request_urls(firmware=DEFAULT_FIRMWARE, modules=None):
"""
get different urls for request
"""
if firmware == 'V12.01.01.33_multi':
module_urls = {
MODULES.systemInfo: 'getStatus',
MODULES.wanBasicCfg: 'getWAN',
MODULES.wifiBasicCfg: 'getWifi',
MODULES.softWare: 'getSysTools',
}
result = []
if modules:
for module in modules:
if module in module_urls:
result.append(module_urls[module])
else:
result.append('getStatus')
else:
result.append('getStatus')
return result

return ['getStatus']


def get_info(host, session, modules=(MODULES.systemInfo,), firmware=DEFAULT_FIRMWARE):
"""
Get info using different modules
"""
available_modules = [module.name for module in modules]
modules_str = ','.join(list(available_modules))

request_urls = get_request_urls(firmware, modules)

result = {}
for url_item in request_urls:

url = f'/goform/{url_item}?modules={modules_str}'

headers = {
'User-Agent':
'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:130.0) Gecko/20100101 Firefox/130.0',
'Accept': '*/*',
'Accept-Language': 'en-US,en;q=0.5',
}

request_url = f'{host}{url}'

cookies = {
'bLanguage': 'en',
'ecos_pw': 'ecos_pw=YWRtaW4=wdv:language=cn' # admin in base64
}

response = session.get(
url=request_url,
headers=headers,
cookies=cookies,
)

result.update(response.json())

return result

def request_firmware(host, session):
"""
Request router current firmware
"""
info = get_info(host, session, modules=(MODULES.systemInfo,))
return info['systemInfo']['softVersion']
2 changes: 1 addition & 1 deletion tenda_everest/package.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@
Package info
"""
name = 'tenda-everest'
version = '0.1.0'
version = '0.2.0'
status = '3 - Alpha'
14 changes: 14 additions & 0 deletions testing/test_tenda_everest/conftest.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# import requests
import testing.test_tenda_everest.mocks as mocks
from pytest import fixture


@fixture
def requests_module():
# return requests
return mocks

@fixture
def host():
return '9.9.9.9'
# return 'http://10.173.1.142:8081'
34 changes: 34 additions & 0 deletions testing/test_tenda_everest/mocks/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
from tenda_everest import MODULES
from testing.test_tenda_everest.mocks.expected import expected_info

class MockResponse:

def __init__(self, url):
self.modules = self.get_modules(url)

def json(self):
result = {}
for module in self.modules:
enum_module = MODULES[module]
value = expected_info[enum_module]
result.update(value)

return result

def get_modules(self, url):
host, params = url.split('?')
module, values = params.split('=')
modules = values.split(',')
return modules


class MockSession:

def get(self, url, *args, **kwargs):
return MockResponse(url)

def post(self, *args, **kwargs):
pass

def session():
return MockSession()
63 changes: 63 additions & 0 deletions testing/test_tenda_everest/mocks/expected.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
from tenda_everest import MODULES

hidden_mac = 'XX:XX:XX:XX:XX:XX'
hidden_dns = 'XX.XX.XXX.XXX'
hidden_key = '********'
hidden_user = 'user'
hidden_ssid = 'SSID'

expected_systemInfo = {
'systemInfo': {
'lanIP': '192.168.0.1',
'lanMask': '255.255.255.0',
'macHost': hidden_mac,
'softVersion': 'V02.03.01.125',
'statusWanDns1': hidden_dns,
'statusWanDns2': '1.1.1.1',
'statusWanGaterway': '10.173.255.1',
'statusWanIP': '10.173.1.142',
'statusWanMAC': hidden_mac,
'statusWanMask': '255.255.255.254',
'wanConnectTime': '66039',
'wanType': 'pppoe'
}
}

expected_wanBasicCfg = {
'wanBasicCfg': {
'wanDns1': hidden_dns,
'wanDns2': '1.1.1.1',
'wanGateway': '10.173.255.1',
'wanIP': '10.173.1.142',
'wanMask': '255.255.255.254',
'wanPPPoEPwd': hidden_key,
'wanPPPoEUser': hidden_user,
'wanType': 'pppoe'
}
}

expected_wifiBasicCfg = {
'wifiBasicCfg': {
'HasDoubleBandUnity': 'true',
'doubleBandUnityEnable': 'false',
'wifiEn': 'true',
'wifiEn_5G': 'true',
'wifiHideSSID': 'false',
'wifiHideSSID_5G': 'false',
'wifiNoPwd': 'false',
'wifiNoPwd_5G': 'false',
'wifiPwd': hidden_key,
'wifiPwd_5G': hidden_key,
'wifiSSID': hidden_ssid,
'wifiSSID_5G': hidden_ssid,
'wifiSecurityMode': 'WPAWPA2/AES',
'wifiSecurityMode_5G': 'WPAWPA2/AES',
'wifiTotalEn': 'true'
}
}

expected_info = {
MODULES.systemInfo: expected_systemInfo,
MODULES.wanBasicCfg: expected_wanBasicCfg,
MODULES.wifiBasicCfg: expected_wifiBasicCfg
}
Loading

0 comments on commit dfdf882

Please sign in to comment.