From bae2ee4245d385d0a3d3e427f0b2763fe3aa4e0d Mon Sep 17 00:00:00 2001 From: UpstreamData Date: Wed, 16 Mar 2022 12:05:44 -0600 Subject: [PATCH] changed MinerFactory to a singleton class to ensure clearing its cache is easier and removed creation of independant miner factories for each utility --- miners/miner_factory.py | 10 ++++++++++ network/__init__.py | 9 ++++----- settings/settings.toml | 4 ++-- tools/bad_board_util/__init__.py | 1 - tools/bad_board_util/func/miners.py | 8 ++++---- tools/bad_board_util/miner_factory.py | 7 ------- tools/cfg_util/cfg_util_sg/func/miners.py | 21 +++++++++++---------- tools/cfg_util/cfg_util_sg/miner_factory.py | 7 ------- tools/web_monitor/dashboard/func.py | 4 ++-- tools/web_monitor/miner/ws.py | 4 ++-- tools/web_monitor/miner_factory.py | 7 ------- tools/web_monitor/scan/func.py | 4 ++-- 12 files changed, 37 insertions(+), 49 deletions(-) delete mode 100644 tools/bad_board_util/miner_factory.py delete mode 100644 tools/cfg_util/cfg_util_sg/miner_factory.py delete mode 100644 tools/web_monitor/miner_factory.py diff --git a/miners/miner_factory.py b/miners/miner_factory.py index 671a1f2b..105c920d 100644 --- a/miners/miner_factory.py +++ b/miners/miner_factory.py @@ -37,9 +37,19 @@ from settings import MINER_FACTORY_GET_VERSION_RETRIES as GET_VERSION_RETRIES class MinerFactory: + _instance = None + def __init__(self): self.miners = {} + def __new__(cls): + if not cls._instance: + cls._instance = super( + MinerFactory, + cls + ).__new__(cls) + return cls._instance + async def get_miner_generator(self, ips: list): """ Get Miner objects from ip addresses using an async generator. diff --git a/network/__init__.py b/network/__init__.py index 058846f0..e43d5e38 100644 --- a/network/__init__.py +++ b/network/__init__.py @@ -8,7 +8,6 @@ from settings import NETWORK_PING_RETRIES as PING_RETRIES, NETWORK_PING_TIMEOUT class MinerNetwork: def __init__(self, ip_addr: str or None = None, mask: str or int or None = None) -> None: self.network = None - self.miner_factory = MinerFactory() self.ip_addr = ip_addr self.connected_miners = {} self.mask = mask @@ -50,6 +49,9 @@ class MinerNetwork: local_network = self.get_network() print(f"Scanning {local_network} for miners...") + # clear cached miners + MinerFactory().clear_cached_miners() + # create a list of tasks and miner IPs scan_tasks = [] miner_ips = [] @@ -79,13 +81,10 @@ class MinerNetwork: # create a list of tasks to get miners create_miners_tasks = [] - # clear cached miners - self.miner_factory.clear_cached_miners() - # try to get each miner found for miner_ip in miner_ips: # append to the list of tasks - create_miners_tasks.append(self.miner_factory.get_miner(miner_ip)) + create_miners_tasks.append(MinerFactory().get_miner(miner_ip)) # get all miners in the list miners = await asyncio.gather(*create_miners_tasks) diff --git a/settings/settings.toml b/settings/settings.toml index 81f57ac3..26d83f33 100644 --- a/settings/settings.toml +++ b/settings/settings.toml @@ -16,5 +16,5 @@ whatsminer_pwd = "admin" ### DEBUG MODE ### # change this to debug = true # to enable debug mode. -# debug = false -debug = true +debug = false +# debug = true diff --git a/tools/bad_board_util/__init__.py b/tools/bad_board_util/__init__.py index 750a0856..5c260e98 100644 --- a/tools/bad_board_util/__init__.py +++ b/tools/bad_board_util/__init__.py @@ -1,6 +1,5 @@ # TODO: Add Logging -from tools.bad_board_util.miner_factory import miner_factory from tools.bad_board_util.ui import ui import asyncio diff --git a/tools/bad_board_util/func/miners.py b/tools/bad_board_util/func/miners.py index 227b91a2..066916a6 100644 --- a/tools/bad_board_util/func/miners.py +++ b/tools/bad_board_util/func/miners.py @@ -4,7 +4,7 @@ import warnings from tools.bad_board_util.func.ui import update_ui_with_data, update_prog_bar, set_progress_bar_len from tools.bad_board_util.layout import window -from tools.bad_board_util.miner_factory import miner_factory +from miners.miner_factory import MinerFactory async def scan_network(network): @@ -24,7 +24,7 @@ async def scan_network(network): asyncio.create_task(update_prog_bar(progress_bar_len)) progress_bar_len += network_size - len(miners) asyncio.create_task(update_prog_bar(progress_bar_len)) - get_miner_genenerator = miner_factory.get_miner_generator(miners) + get_miner_genenerator = MinerFactory().get_miner_generator(miners) all_miners = [] async for found_miner in get_miner_genenerator: all_miners.append(found_miner) @@ -118,7 +118,7 @@ async def scan_and_get_data(network): asyncio.create_task(update_prog_bar(progress_bar_len)) progress_bar_len += network_size - len(miners) asyncio.create_task(update_prog_bar(progress_bar_len)) - get_miner_genenerator = miner_factory.get_miner_generator(miners) + get_miner_genenerator = MinerFactory().get_miner_generator(miners) all_miners = [] async for found_miner in get_miner_genenerator: all_miners.append(found_miner) @@ -190,7 +190,7 @@ def split_chips(string, number_of_splits): async def get_formatted_data(ip: ipaddress.ip_address): - miner = await miner_factory.get_miner(ip) + miner = await MinerFactory().get_miner(ip) model = await miner.get_model() warnings.filterwarnings('ignore') board_data = await miner.get_board_info() diff --git a/tools/bad_board_util/miner_factory.py b/tools/bad_board_util/miner_factory.py deleted file mode 100644 index ee8d4141..00000000 --- a/tools/bad_board_util/miner_factory.py +++ /dev/null @@ -1,7 +0,0 @@ -""" -This file stores the MinerFactory instance used by the BadBoardUtility for use in other files. -""" - -from miners.miner_factory import MinerFactory - -miner_factory = MinerFactory() diff --git a/tools/cfg_util/cfg_util_sg/func/miners.py b/tools/cfg_util/cfg_util_sg/func/miners.py index 90dd0cfc..f06d8b12 100644 --- a/tools/cfg_util/cfg_util_sg/func/miners.py +++ b/tools/cfg_util/cfg_util_sg/func/miners.py @@ -8,7 +8,7 @@ from API import APIError from tools.cfg_util.cfg_util_sg.func.parse_data import safe_parse_api_data from tools.cfg_util.cfg_util_sg.func.ui import update_ui_with_data, update_prog_bar, set_progress_bar_len from tools.cfg_util.cfg_util_sg.layout import window -from tools.cfg_util.cfg_util_sg.miner_factory import miner_factory +from miners.miner_factory import MinerFactory from config.bos import bos_config_convert from tools.cfg_util.cfg_util_sg.func.decorators import disable_buttons from settings import CFG_UTIL_CONFIG_THREADS as CONFIG_THREADS, CFG_UTIL_REBOOT_THREADS as REBOOT_THREADS @@ -17,7 +17,7 @@ from settings import CFG_UTIL_CONFIG_THREADS as CONFIG_THREADS, CFG_UTIL_REBOOT_ async def import_config(idx): await update_ui_with_data("status", "Importing") logging.debug(f"{window['ip_table'].Values[idx[0]][0]}: Importing config.") - miner = await miner_factory.get_miner(ipaddress.ip_address(window["ip_table"].Values[idx[0]][0])) + miner = await MinerFactory().get_miner(ipaddress.ip_address(window["ip_table"].Values[idx[0]][0])) await miner.get_config() config = miner.config await update_ui_with_data("config", str(config)) @@ -48,7 +48,7 @@ async def scan_network(network): asyncio.create_task(update_prog_bar(progress_bar_len)) progress_bar_len += network_size - len(miners) asyncio.create_task(update_prog_bar(progress_bar_len)) - get_miner_genenerator = miner_factory.get_miner_generator(miners) + get_miner_genenerator = MinerFactory().get_miner_generator(miners) all_miners = [] async for found_miner in get_miner_genenerator: all_miners.append(found_miner) @@ -67,7 +67,7 @@ async def miner_light(ips: list): async def flip_light(ip): ip_list = window['ip_table'].Widget - miner = await miner_factory.get_miner(ip) + miner = await MinerFactory().get_miner(ip) index = [item[0] for item in window["ip_table"].Values].index(ip) index_tags = ip_list.item(index + 1)['tags'] if "light" not in index_tags: @@ -101,7 +101,7 @@ async def send_ssh_command(miner, command: str): async def send_miners_ssh_commands(ips: list, command: str, ssh_cmd_window): - get_miner_genenerator = miner_factory.get_miner_generator(ips) + get_miner_genenerator = MinerFactory().get_miner_generator(ips) all_miners = [] async for miner in get_miner_genenerator: all_miners.append(miner) @@ -146,7 +146,7 @@ async def reboot_miners(ips: list): await update_ui_with_data("status", "Rebooting") await set_progress_bar_len(2 * len(ips)) progress_bar_len = 0 - get_miner_genenerator = miner_factory.get_miner_generator(ips) + get_miner_genenerator = MinerFactory().get_miner_generator(ips) all_miners = [] async for miner in get_miner_genenerator: all_miners.append(miner) @@ -180,7 +180,7 @@ async def restart_miners_backend(ips: list): await update_ui_with_data("status", "Restarting Backends") await set_progress_bar_len(2 * len(ips)) progress_bar_len = 0 - get_miner_genenerator = miner_factory.get_miner_generator(ips) + get_miner_genenerator = MinerFactory().get_miner_generator(ips) all_miners = [] async for miner in get_miner_genenerator: all_miners.append(miner) @@ -215,7 +215,7 @@ async def send_config(ips: list, config): await set_progress_bar_len(2 * len(ips)) progress_bar_len = 0 asyncio.create_task(update_prog_bar(progress_bar_len)) - get_miner_genenerator = miner_factory.get_miner_generator(ips) + get_miner_genenerator = MinerFactory().get_miner_generator(ips) all_miners = [] async for miner in get_miner_genenerator: all_miners.append(miner) @@ -290,6 +290,7 @@ async def scan_and_get_data(network): await update_ui_with_data("ip_table", []) network_size = len(network) miner_generator = network.scan_network_generator() + MinerFactory().clear_cached_miners() logging.info(f"Scanning network: {str(network)}") @@ -309,7 +310,7 @@ async def scan_and_get_data(network): logging.debug(f"Found miners: {miners}") progress_bar_len += network_size - len(miners) asyncio.create_task(update_prog_bar(progress_bar_len)) - get_miner_genenerator = miner_factory.get_miner_generator(miners) + get_miner_genenerator = MinerFactory().get_miner_generator(miners) all_miners = [] async for found_miner in get_miner_genenerator: all_miners.append(found_miner) @@ -346,7 +347,7 @@ async def scan_and_get_data(network): async def get_formatted_data(ip: ipaddress.ip_address): - miner = await miner_factory.get_miner(ip) + miner = await MinerFactory().get_miner(ip) logging.debug(f"Getting data for miner: {miner.ip}") warnings.filterwarnings('ignore') miner_data = None diff --git a/tools/cfg_util/cfg_util_sg/miner_factory.py b/tools/cfg_util/cfg_util_sg/miner_factory.py deleted file mode 100644 index fa9bb953..00000000 --- a/tools/cfg_util/cfg_util_sg/miner_factory.py +++ /dev/null @@ -1,7 +0,0 @@ -""" -This file stores the MinerFactory instance used by the ConfigUtility for use in other files. -""" - -from miners.miner_factory import MinerFactory - -miner_factory = MinerFactory() diff --git a/tools/web_monitor/dashboard/func.py b/tools/web_monitor/dashboard/func.py index 3ac457b8..dd2cc5dc 100644 --- a/tools/web_monitor/dashboard/func.py +++ b/tools/web_monitor/dashboard/func.py @@ -1,6 +1,6 @@ import asyncio -from tools.web_monitor.miner_factory import miner_factory +from miners.miner_factory import MinerFactory from tools.web_monitor._settings.func import get_current_settings @@ -11,7 +11,7 @@ async def get_miner_data_dashboard(miner_ip): miner_data_timeout = settings["miner_data_timeout"] miner_ip = await asyncio.wait_for( - miner_factory.get_miner(miner_ip), + MinerFactory().get_miner(miner_ip), miner_identify_timeout ) diff --git a/tools/web_monitor/miner/ws.py b/tools/web_monitor/miner/ws.py index e1169a41..ae06e026 100644 --- a/tools/web_monitor/miner/ws.py +++ b/tools/web_monitor/miner/ws.py @@ -4,7 +4,7 @@ import datetime import websockets.exceptions from fastapi import WebSocket, WebSocketDisconnect, APIRouter -from tools.web_monitor.miner_factory import miner_factory +from miners.miner_factory import MinerFactory from tools.web_monitor._settings.func import get_current_settings @@ -22,7 +22,7 @@ async def miner_websocket(websocket: WebSocket, miner_ip): while True: try: cur_miner = await asyncio.wait_for( - miner_factory.get_miner(str(miner_ip)), + MinerFactory().get_miner(str(miner_ip)), miner_identify_timeout ) diff --git a/tools/web_monitor/miner_factory.py b/tools/web_monitor/miner_factory.py deleted file mode 100644 index 157b743a..00000000 --- a/tools/web_monitor/miner_factory.py +++ /dev/null @@ -1,7 +0,0 @@ -""" -This file stores the MinerFactory instance used by the WebMonitor for use in other files. -""" - -from miners.miner_factory import MinerFactory - -miner_factory = MinerFactory() diff --git a/tools/web_monitor/scan/func.py b/tools/web_monitor/scan/func.py index 89ec4c91..03989d2c 100644 --- a/tools/web_monitor/scan/func.py +++ b/tools/web_monitor/scan/func.py @@ -4,7 +4,7 @@ from fastapi import WebSocket from network import MinerNetwork from tools.web_monitor.func import get_current_miner_list -from tools.web_monitor.miner_factory import miner_factory +from miners.miner_factory import MinerFactory async def do_websocket_scan(websocket: WebSocket, network_ip: str): @@ -21,7 +21,7 @@ async def do_websocket_scan(websocket: WebSocket, network_ip: str): if miner_ip and str(miner_ip) not in cur_miners: miners.append(miner_ip) - get_miner_generator = miner_factory.get_miner_generator(miners) + get_miner_generator = MinerFactory().get_miner_generator(miners) all_miners = [] async for found_miner in get_miner_generator: all_miners.append(