172 lines
7.1 KiB
Python
172 lines
7.1 KiB
Python
import asyncio
|
|
import ipaddress
|
|
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
|
|
|
|
|
|
async def scan_network(network):
|
|
await update_ui_with_data("status", "Scanning")
|
|
await update_ui_with_data("ip_count", "")
|
|
window["ip_table"].update([])
|
|
network_size = len(network)
|
|
miner_generator = network.scan_network_generator()
|
|
await set_progress_bar_len(2 * network_size)
|
|
progress_bar_len = 0
|
|
asyncio.create_task(update_prog_bar(progress_bar_len))
|
|
miners = []
|
|
async for miner in miner_generator:
|
|
if miner:
|
|
miners.append(miner)
|
|
progress_bar_len += 1
|
|
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)
|
|
all_miners = []
|
|
async for found_miner in get_miner_genenerator:
|
|
all_miners.append(found_miner)
|
|
all_miners.sort(key=lambda x: x.ip)
|
|
window["ip_table"].update([[str(miner.ip)] for miner in all_miners])
|
|
progress_bar_len += 1
|
|
asyncio.create_task(update_prog_bar(progress_bar_len))
|
|
await update_ui_with_data("ip_count", str(len(all_miners)))
|
|
await update_ui_with_data("status", "")
|
|
|
|
|
|
async def miner_light(ips: list):
|
|
await asyncio.gather(*[flip_light(ip) for ip in ips])
|
|
|
|
|
|
async def flip_light(ip):
|
|
ip_list = window['ip_table'].Widget
|
|
miner = await miner_factory.get_miner(ip)
|
|
index = [item[0] for item in window["ip_table"].Values].index(ip)
|
|
index_tags = ip_list.item(index)['tags']
|
|
if "light" not in index_tags:
|
|
ip_list.item(index, tags=([*index_tags, "light"]))
|
|
window['ip_table'].update(row_colors=[(index, "white", "red")])
|
|
await miner.fault_light_on()
|
|
else:
|
|
index_tags.remove("light")
|
|
ip_list.item(index, tags=index_tags)
|
|
window['ip_table'].update(row_colors=[(index, "black", "white")])
|
|
await miner.fault_light_off()
|
|
|
|
|
|
async def refresh_data(ip_list: list):
|
|
await update_ui_with_data("status", "Getting Data")
|
|
await update_ui_with_data("hr_total", "")
|
|
ips = [ipaddress.ip_address(ip) for ip in ip_list]
|
|
if len(ips) == 0:
|
|
ips = [ipaddress.ip_address(ip) for ip in [item[0] for item in window["ip_table"].Values]]
|
|
await set_progress_bar_len(len(ips))
|
|
progress_bar_len = 0
|
|
asyncio.create_task(update_prog_bar(progress_bar_len))
|
|
reset_table_values = []
|
|
for item in window["ip_table"].Values:
|
|
if item[0] in ip_list:
|
|
reset_table_values.append([item[0]])
|
|
else:
|
|
reset_table_values.append(item)
|
|
window["ip_table"].update(reset_table_values)
|
|
progress_bar_len = 0
|
|
data_gen = asyncio.as_completed([get_formatted_data(miner) for miner in ips])
|
|
ip_table_data = window["ip_table"].Values
|
|
ordered_all_ips = [item[0] for item in ip_table_data]
|
|
for all_data in data_gen:
|
|
data_point = await all_data
|
|
if data_point["IP"] in ordered_all_ips:
|
|
ip_table_index = ordered_all_ips.index(data_point["IP"])
|
|
ip_table_data[ip_table_index] = [
|
|
data_point["IP"], data_point["model"], data_point["host"], str(data_point['TH/s']) + " TH/s",
|
|
data_point["temp"],
|
|
data_point['user'], str(data_point['wattage']) + " W"
|
|
]
|
|
window["ip_table"].update(ip_table_data)
|
|
progress_bar_len += 1
|
|
asyncio.create_task(update_prog_bar(progress_bar_len))
|
|
|
|
hashrate_list = []
|
|
hr_idx = 3
|
|
for item, _ in enumerate(window["ip_table"].Values):
|
|
if len(window["ip_table"].Values[item]) > hr_idx:
|
|
if not window["ip_table"].Values[item][hr_idx] == '':
|
|
hashrate_list.append(float(window["ip_table"].Values[item][hr_idx].replace(" TH/s", "")))
|
|
else:
|
|
hashrate_list.append(0)
|
|
else:
|
|
hashrate_list.append(0)
|
|
|
|
total_hr = round(sum(hashrate_list), 2)
|
|
window["hr_total"].update(f"{total_hr} TH/s")
|
|
|
|
await update_ui_with_data("status", "")
|
|
|
|
|
|
async def scan_and_get_data(network):
|
|
await update_ui_with_data("status", "Scanning")
|
|
await update_ui_with_data("ip_count", "")
|
|
await update_ui_with_data("ip_table", [])
|
|
network_size = len(network)
|
|
miner_generator = network.scan_network_generator()
|
|
await set_progress_bar_len(3 * network_size)
|
|
progress_bar_len = 0
|
|
miners = []
|
|
async for miner in miner_generator:
|
|
if miner:
|
|
miners.append(miner)
|
|
# can output "Identifying" for each found item, but it gets a bit cluttered
|
|
# and could possibly be confusing for the end user because of timing on
|
|
# adding the IPs
|
|
# window["ip_table"].update([["Identifying..."] for miner in miners])
|
|
progress_bar_len += 1
|
|
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)
|
|
all_miners = []
|
|
async for found_miner in get_miner_genenerator:
|
|
all_miners.append(found_miner)
|
|
all_miners.sort(key=lambda x: x.ip)
|
|
window["ip_table"].update([[str(miner.ip)] for miner in all_miners])
|
|
progress_bar_len += 1
|
|
asyncio.create_task(update_prog_bar(progress_bar_len))
|
|
await update_ui_with_data("ip_count", str(len(all_miners)))
|
|
data_gen = asyncio.as_completed([get_formatted_data(miner) for miner in miners])
|
|
ip_table_data = window["ip_table"].Values
|
|
ordered_all_ips = [item[0] for item in ip_table_data]
|
|
progress_bar_len += (network_size - len(miners))
|
|
asyncio.create_task(update_prog_bar(progress_bar_len))
|
|
await update_ui_with_data("status", "Getting Data")
|
|
for all_data in data_gen:
|
|
data_point = await all_data
|
|
if data_point["IP"] in ordered_all_ips:
|
|
ip_table_index = ordered_all_ips.index(data_point["IP"])
|
|
board_6 = " ".join([chain["chip_status"] for chain in data_point["data"][6]]).replace("o", "•")
|
|
board_7 = " ".join([chain["chip_status"] for chain in data_point["data"][7]]).replace("o", "•")
|
|
board_8 = " ".join([chain["chip_status"] for chain in data_point["data"][8]]).replace("o", "•")
|
|
data = [
|
|
data_point["IP"],
|
|
data_point["model"],
|
|
board_6,
|
|
board_7,
|
|
board_8
|
|
]
|
|
ip_table_data[ip_table_index] = data
|
|
window["ip_table"].update(ip_table_data)
|
|
progress_bar_len += 1
|
|
asyncio.create_task(update_prog_bar(progress_bar_len))
|
|
await update_ui_with_data("status", "")
|
|
|
|
|
|
async def get_formatted_data(ip: ipaddress.ip_address):
|
|
miner = await miner_factory.get_miner(ip)
|
|
model = await miner.get_model()
|
|
warnings.filterwarnings('ignore')
|
|
board_data = await miner.get_board_info()
|
|
data = {"IP": str(ip), "model": model, "data": board_data}
|
|
return data
|