import asyncio from miners.miner_factory import MinerFactory from network import MinerNetwork from tools.cfg_util.decorators import disable_buttons from tools.cfg_util.layout import window, update_prog_bar, TABLE_HEADERS from tools.cfg_util.tables import clear_tables, TableManager progress_bar_len = 0 DEFAULT_DATA = set() for table in TABLE_HEADERS: for header in TABLE_HEADERS[table]: DEFAULT_DATA.add(header) async def btn_all(): table = "scan_table" window[table].update( select_rows=([row for row in range(len(window[table].Values))]) ) async def btn_scan(scan_ip: str): network = MinerNetwork("192.168.1.0") if scan_ip: if "/" in scan_ip: ip, mask = scan_ip.split("/") network = MinerNetwork(ip, mask=mask) else: network = MinerNetwork(scan_ip) asyncio.create_task(_scan_miners(network)) @disable_buttons("Scanning") async def _scan_miners(network: MinerNetwork): clear_tables() scan_generator = network.scan_network_generator() MinerFactory().clear_cached_miners() global progress_bar_len progress_bar_len = 0 network_size = len(network) await update_prog_bar(progress_bar_len, _max=(3 * network_size)) scanned_miners = [] async for miner in scan_generator: if miner: scanned_miners.append(miner) progress_bar_len += 1 await update_prog_bar(progress_bar_len) progress_bar_len += network_size - len(scanned_miners) await update_prog_bar(progress_bar_len) get_miner_genenerator = MinerFactory().get_miner_generator(scanned_miners) resolved_miners = [] async for found_miner in get_miner_genenerator: resolved_miners.append(found_miner) resolved_miners.sort(key=lambda x: x.ip) _data = {} for key in DEFAULT_DATA: _data[key] = "" _data["IP"] = str(found_miner.ip) TableManager().update_item(_data) progress_bar_len += 1 await update_prog_bar(progress_bar_len) progress_bar_len += network_size - len(resolved_miners) await update_prog_bar(progress_bar_len) await _get_miners_data(resolved_miners) async def _get_miners_data(miners: list): global progress_bar_len data_generator = asyncio.as_completed([_get_data(miner) for miner in miners]) for all_data in data_generator: data = await all_data TableManager().update_item(data) progress_bar_len += 1 await update_prog_bar(progress_bar_len) async def _get_data(miner): return await miner.get_data()