bug: improve handling of whatsminers in get_miner.
This commit is contained in:
@@ -47,6 +47,7 @@ from pyasic.miners.whatsminer import *
|
|||||||
|
|
||||||
from pyasic import settings
|
from pyasic import settings
|
||||||
|
|
||||||
|
|
||||||
class MinerTypes(enum.Enum):
|
class MinerTypes(enum.Enum):
|
||||||
ANTMINER = 0
|
ANTMINER = 0
|
||||||
WHATSMINER = 1
|
WHATSMINER = 1
|
||||||
@@ -420,7 +421,9 @@ class MinerFactory:
|
|||||||
for _ in range(settings.get("factory_get_retries", 1)):
|
for _ in range(settings.get("factory_get_retries", 1)):
|
||||||
task = asyncio.create_task(self._get_miner_type(ip))
|
task = asyncio.create_task(self._get_miner_type(ip))
|
||||||
try:
|
try:
|
||||||
miner_type = await asyncio.wait_for(task, timeout=settings.get("factory_get_timeout", 3))
|
miner_type = await asyncio.wait_for(
|
||||||
|
task, timeout=settings.get("factory_get_timeout", 3)
|
||||||
|
)
|
||||||
except asyncio.TimeoutError:
|
except asyncio.TimeoutError:
|
||||||
task.cancel()
|
task.cancel()
|
||||||
else:
|
else:
|
||||||
@@ -445,7 +448,9 @@ class MinerFactory:
|
|||||||
if fn is not None:
|
if fn is not None:
|
||||||
task = asyncio.create_task(fn(ip))
|
task = asyncio.create_task(fn(ip))
|
||||||
try:
|
try:
|
||||||
miner_model = await asyncio.wait_for(task, timeout=settings.get("factory_get_timeout", 3))
|
miner_model = await asyncio.wait_for(
|
||||||
|
task, timeout=settings.get("factory_get_timeout", 3)
|
||||||
|
)
|
||||||
except asyncio.TimeoutError:
|
except asyncio.TimeoutError:
|
||||||
task.cancel()
|
task.cancel()
|
||||||
|
|
||||||
@@ -467,18 +472,18 @@ class MinerFactory:
|
|||||||
async def _get_miner_type(self, ip: str):
|
async def _get_miner_type(self, ip: str):
|
||||||
tasks = [
|
tasks = [
|
||||||
asyncio.create_task(self._get_miner_web(ip)),
|
asyncio.create_task(self._get_miner_web(ip)),
|
||||||
asyncio.create_task(self._get_miner_socket(ip)),
|
# asyncio.create_task(self._get_miner_socket(ip)),
|
||||||
]
|
]
|
||||||
|
|
||||||
return await concurrent_get_first_result(tasks, lambda x: x is not None)
|
return await concurrent_get_first_result(tasks, lambda x: x is not None)
|
||||||
|
|
||||||
async def _get_miner_web(self, ip: str):
|
async def _get_miner_web(self, ip: str):
|
||||||
urls = [f"http://{ip}/", f"https://{ip}/"]
|
urls = [f"http://{ip}/", f"https://{ip}/"]
|
||||||
async with httpx.AsyncClient(verify=settings.ssl_cxt) as session:
|
async with httpx.AsyncClient(verify=False) as session:
|
||||||
tasks = [asyncio.create_task(self._web_ping(session, url)) for url in urls]
|
tasks = [asyncio.create_task(self._web_ping(session, url)) for url in urls]
|
||||||
|
|
||||||
text, resp = await concurrent_get_first_result(
|
text, resp = await concurrent_get_first_result(
|
||||||
tasks, lambda x: x[0] is not None
|
tasks, lambda x: x[0] is not None and self._parse_web_type(x[0], x[1]) is not None
|
||||||
)
|
)
|
||||||
if text is not None:
|
if text is not None:
|
||||||
return self._parse_web_type(text, resp)
|
return self._parse_web_type(text, resp)
|
||||||
@@ -488,7 +493,7 @@ class MinerFactory:
|
|||||||
session: httpx.AsyncClient, url: str
|
session: httpx.AsyncClient, url: str
|
||||||
) -> Tuple[Optional[str], Optional[httpx.Response]]:
|
) -> Tuple[Optional[str], Optional[httpx.Response]]:
|
||||||
try:
|
try:
|
||||||
resp = await session.get(url, follow_redirects=False)
|
resp = await session.get(url, follow_redirects=True)
|
||||||
return resp.text, resp
|
return resp.text, resp
|
||||||
except (
|
except (
|
||||||
httpx.HTTPError,
|
httpx.HTTPError,
|
||||||
@@ -505,10 +510,14 @@ class MinerFactory:
|
|||||||
"www-authenticate", ""
|
"www-authenticate", ""
|
||||||
):
|
):
|
||||||
return MinerTypes.ANTMINER
|
return MinerTypes.ANTMINER
|
||||||
if web_resp.status_code == 307 and "https://" in web_resp.headers.get(
|
if len(web_resp.history) > 0:
|
||||||
"location", ""
|
history_resp = web_resp.history[0]
|
||||||
):
|
if (
|
||||||
return MinerTypes.WHATSMINER
|
"/cgi-bin/luci" in web_text
|
||||||
|
and history_resp.status_code == 307
|
||||||
|
and "https://" in history_resp.headers.get("location", "")
|
||||||
|
):
|
||||||
|
return MinerTypes.WHATSMINER
|
||||||
if "Braiins OS" in web_text:
|
if "Braiins OS" in web_text:
|
||||||
return MinerTypes.BRAIINS_OS
|
return MinerTypes.BRAIINS_OS
|
||||||
if "cloud-box" in web_text:
|
if "cloud-box" in web_text:
|
||||||
@@ -536,7 +545,8 @@ class MinerFactory:
|
|||||||
data = b""
|
data = b""
|
||||||
try:
|
try:
|
||||||
reader, writer = await asyncio.wait_for(
|
reader, writer = await asyncio.wait_for(
|
||||||
asyncio.open_connection(str(ip), 4028), timeout=settings.get("factory_get_timeout", 3)
|
asyncio.open_connection(str(ip), 4028),
|
||||||
|
timeout=settings.get("factory_get_timeout", 3),
|
||||||
)
|
)
|
||||||
except (ConnectionError, OSError, asyncio.TimeoutError):
|
except (ConnectionError, OSError, asyncio.TimeoutError):
|
||||||
return
|
return
|
||||||
|
|||||||
Reference in New Issue
Block a user