From 78f689eb2c8ab77f48291040fa6d7f0c3d69833f Mon Sep 17 00:00:00 2001 From: Upstream Data Date: Fri, 24 Nov 2023 23:13:56 -0700 Subject: [PATCH] feature: update scan method to use port 80 when possible, and add `.scan()` method. --- pyasic/network/__init__.py | 81 ++++++-------------------------------- 1 file changed, 11 insertions(+), 70 deletions(-) diff --git a/pyasic/network/__init__.py b/pyasic/network/__init__.py index 9d888b36..4cbe4747 100644 --- a/pyasic/network/__init__.py +++ b/pyasic/network/__init__.py @@ -107,12 +107,15 @@ class MinerNetwork: """ return cls(list(ipaddress.ip_network(subnet, strict=False).hosts())) - async def scan_network_for_miners(self) -> List[AnyMiner]: - """Scan the network for miners, and return found miners as a list. + async def scan(self) -> List[AnyMiner]: + """Scan the network for miners. Returns: A list of found miners. """ + return await self.scan_network_for_miners() + + async def scan_network_for_miners(self) -> List[AnyMiner]: logging.debug(f"{self} - (Scan Network For Miners) - Scanning") # clear cached miners @@ -156,76 +159,18 @@ class MinerNetwork: except TimeoutError: yield None - @staticmethod - async def ping_miner( - ip: ipaddress.ip_address, semaphore: asyncio.Semaphore - ) -> Union[None, ipaddress.ip_address]: - async with semaphore: - try: - miner = await ping_miner(ip) - if miner: - return miner - except ConnectionRefusedError: - tasks = [ping_miner(ip, port=port) for port in [4029, 8889]] - for miner in asyncio.as_completed(tasks): - try: - miner = await miner - if miner: - return miner - except ConnectionRefusedError: - pass - @staticmethod async def ping_and_get_miner( ip: ipaddress.ip_address, semaphore: asyncio.Semaphore ) -> Union[None, AnyMiner]: async with semaphore: - try: - miner = await ping_and_get_miner(ip) - if miner: - return miner - except ConnectionRefusedError: - tasks = [ping_and_get_miner(ip, port=port) for port in [4029, 8889]] - for miner in asyncio.as_completed(tasks): - try: - miner = await miner - if miner: - return miner - except ConnectionRefusedError: - pass - - -async def ping_miner( - ip: ipaddress.ip_address, port=4028 -) -> Union[None, ipaddress.ip_address]: - for i in range(settings.get("network_ping_retries", 1)): - try: - connection_fut = asyncio.open_connection(str(ip), port) - # get the read and write streams from the connection - reader, writer = await asyncio.wait_for( - connection_fut, timeout=settings.get("network_ping_timeout", 3) - ) - # immediately close connection, we know connection happened - writer.close() - # make sure the writer is closed - await writer.wait_closed() - # ping was successful - return ip - except asyncio.exceptions.TimeoutError: - # ping failed if we time out - continue - except (ConnectionRefusedError, OSError): - # handle for other connection errors - logging.debug(f"{str(ip)}: Connection Refused.") - raise ConnectionRefusedError - except Exception as e: - logging.warning(f"{str(ip)}: Ping And Get Miner Exception: {e}") - raise ConnectionRefusedError - return + miner = await ping_and_get_miner(ip) + if miner: + return miner async def ping_and_get_miner( - ip: ipaddress.ip_address, port=4028 + ip: ipaddress.ip_address, port=80 ) -> Union[None, AnyMiner]: for i in range(settings.get("network_ping_retries", 1)): try: @@ -243,13 +188,9 @@ async def ping_and_get_miner( except asyncio.exceptions.TimeoutError: # ping failed if we time out continue - except (ConnectionRefusedError, OSError): - # handle for other connection errors - logging.debug(f"{str(ip)}: Connection Refused.") - raise ConnectionRefusedError except Exception as e: - logging.warning(f"{str(ip)}: Ping And Get Miner Exception: {e}") - raise ConnectionRefusedError + logging.warning(f"{str(ip)}: Unhandled ping exception: {e}") + return return