diff --git a/clore_hosting/main.py b/clore_hosting/main.py index b3ceeb3..12ec8b1 100644 --- a/clore_hosting/main.py +++ b/clore_hosting/main.py @@ -455,7 +455,7 @@ class CloreClient: async def submit_specs(self, current_specs): try: if type(current_specs) == dict: - current_specs["backend_version"]=14 + current_specs["backend_version"]=15 current_specs["update_hw"]=True smallest_pcie_width = 999 for gpu in current_specs["gpus"]["nvidia"]: diff --git a/lib/hive_miner_interface.py b/lib/hive_miner_interface.py index 32e361e..fc0a4b0 100644 --- a/lib/hive_miner_interface.py +++ b/lib/hive_miner_interface.py @@ -4,6 +4,20 @@ import asyncio import json import time import os +import re + +def extract_json_with_key(text, key): + json_pattern = r'({.*?})' + json_strings = re.findall(json_pattern, text, re.DOTALL) + json_objects_with_key = [] + for json_str in json_strings: + try: + json_obj = json.loads(json_str) + if key in json.dumps(json_obj): + json_objects_with_key.append(json_obj) + except json.JSONDecodeError: + continue + return json_objects_with_key async def async_run_bash_command(command): process = await asyncio.create_subprocess_exec( @@ -55,7 +69,7 @@ async def get_session_start_time(pid): return None async def get_miner_stats(miner_dir, api_timeout=15): - stdout, stderr, code = await async_run_bash_command(f'export PATH=$PATH:/hive/sbin:/hive/bin && export API_TIMEOUT={api_timeout}'+''' && read -t $((API_TIMEOUT + 5)) -d "" pid khs stats < <(function run_miner_scripts { echo "$BASHPID"; cd '''+miner_dir+''' || exit; source h-manifest.conf; source h-config.sh; source h-stats.sh; printf "%q\n" "$khs"; echo "$stats"; }; run_miner_scripts) && [[ $? -ge 128 ]] && [[ ! -z "$pid" && "$pid" -ne $$ ]] && kill -9 "$pid" 2>/dev/null ; echo $stats''') + stdout, stderr, code = await async_run_bash_command(f'export PATH=$PATH:/hive/sbin:/hive/bin && export API_TIMEOUT={api_timeout}'+''' && read -t $((API_TIMEOUT + 5)) -d "" pid khs stats < <(function run_miner_scripts { echo "$BASHPID"; cd '''+miner_dir+''' || exit; cd '''+miner_dir+'''; source h-manifest.conf; cd '''+miner_dir+'''; source h-config.sh; cd '''+miner_dir+'''; source h-stats.sh; printf "%q\n" "$khs"; echo "$stats"; }; run_miner_scripts) && [[ $? -ge 128 ]] && [[ ! -z "$pid" && "$pid" -ne $$ ]] && kill -9 "$pid" 2>/dev/null ; echo $stats''') try: if stdout and not stderr and code == 0: stats = json.loads(stdout) @@ -63,7 +77,11 @@ async def get_miner_stats(miner_dir, api_timeout=15): else: return 'fail' except Exception as e: - return 'fail' + try: + miner_stat_jsons = extract_json_with_key(stdout, "hs_units") + return miner_stat_jsons[0] if len(miner_stat_jsons) > 0 else 'fail' + except Exception : + return 'fail' async def get_miner_uptime_stats(): stdout, stderr, code = await async_run_bash_command("screen -ls") @@ -85,14 +103,15 @@ def extract_miner_names(rig_conf): if key[:5]=="MINER" and (len(key)==5 or str(key[5:]).isdigit()): if value.startswith('"') and value.endswith('"'): value = value.strip('"') - miner_names.append(value) + if len(value)>0: + miner_names.append(value) return miner_names def extract_miner_config(miner_names, wallet_conf): lines = wallet_conf.split('\n') meta_config = {} miners = {} - for miner_name in miner_names: + for miner_idx, miner_name in enumerate(miner_names): remaining_lines = [] algos = [] for line in lines: @@ -105,6 +124,8 @@ def extract_miner_config(miner_names, wallet_conf): if key[:len(miner_name.replace('-','_'))+1].lower() == f"{miner_name.replace('-','_')}_".lower(): if key.split('_')[-1][:4].lower()=="algo": algos.append(value) + elif miner_name.lower()=="custom" and key.lower()=="custom_miner": + miner_names[miner_idx] = os.path.join(miner_names[miner_idx],value) elif key.lower()=="meta": try: meta_config=json.loads(value) @@ -118,11 +139,13 @@ def extract_miner_config(miner_names, wallet_conf): "coins":[] } for miner_name in miner_names: + if "custom/" in miner_name.lower(): + miner_name = "custom" if miner_name in meta_config and type(meta_config[miner_name]) == dict: for key in meta_config[miner_name].keys(): if "coin" in key: miners[miner_name]["coins"].append(meta_config[miner_name][key]) - return miners + return miner_names, miners def sum_numbers_in_list(lst): if all(isinstance(i, (int, float)) for i in lst): @@ -146,7 +169,7 @@ class hive_interface: async def get_configured_miners(self): rig_conf, wallet_conf = await asyncio.gather(*[check_and_read_file(self.hive_rig_config), check_and_read_file(self.hive_wallet_config)]) miner_names = extract_miner_names(rig_conf) - miner_config = extract_miner_config(miner_names, wallet_conf) + miner_names, miner_config = extract_miner_config(miner_names, wallet_conf) return miner_names, miner_config async def export_miner_stats(self, get_hashrates=False): @@ -160,6 +183,8 @@ class hive_interface: output["miners"]=miner_config if get_hashrates: miners_stats = await self.get_miners_stats(miner_names) + for idx, miner_name in enumerate(miner_names): + miner_names[idx] = "custom" if "custom/" in miner_name.lower() else miner_name for idx, miner_stats in enumerate(miners_stats): if type(miner_stats) == dict: for key in miner_stats.keys():