added better logging and process to testbench

This commit is contained in:
UpstreamData
2022-04-20 11:36:09 -06:00
parent ed4122fb21
commit f9f26a5587

View File

@@ -16,7 +16,7 @@ UPDATE_FILE_S9 = os.path.join(os.path.dirname(__file__), "files", "update.tar")
CONFIG_FILE = os.path.join(os.path.dirname(__file__), "files", "config.toml") CONFIG_FILE = os.path.join(os.path.dirname(__file__), "files", "config.toml")
# static states # static states
(START, UNLOCK, INSTALL, UPDATE, REFERRAL, DONE) = range(6) (START, UNLOCK, INSTALL, UPDATE, REFERRAL, DONE, ERROR) = range(7)
class TestbenchMiner: class TestbenchMiner:
@@ -56,13 +56,18 @@ class TestbenchMiner:
if self.host in MinerFactory().miners.keys(): if self.host in MinerFactory().miners.keys():
MinerFactory().miners.remove(self.host) MinerFactory().miners.remove(self.host)
async def wait_for_disconnect(self): async def wait_for_disconnect(self, wait_time: int = 1):
await self.add_to_output("Waiting for disconnect...") await self.add_to_output("Waiting for disconnect...")
while await ping_miner(self.host): while await ping_miner(self.host):
await asyncio.sleep(1) await asyncio.sleep(wait_time)
self.state = START
async def install_start(self): async def install_start(self):
if not await ping_miner(self.host, 80): try:
if not await ping_miner(self.host, 80):
await self.add_to_output("Waiting for miner connection...")
return
except asyncio.exceptions.TimeoutError:
await self.add_to_output("Waiting for miner connection...") await self.add_to_output("Waiting for miner connection...")
return return
self.start_time = datetime.datetime.now() self.start_time = datetime.datetime.now()
@@ -119,33 +124,54 @@ class TestbenchMiner:
) )
async def do_install(self): async def do_install(self):
error = False await self.add_to_output("Running install...")
error = None
proc = await asyncio.create_subprocess_shell( proc = await asyncio.create_subprocess_shell(
f'{os.path.join(os.path.dirname(__file__), "files", "bos-toolbox", "bos-toolbox.bat")} install {str(self.host)} --no-keep-pools --psu-power-limit 900 --no-nand-backup --feeds-url file:./feeds/', f'{os.path.join(os.path.dirname(__file__), "files", "bos-toolbox", "bos-toolbox.bat")} install {str(self.host)} --no-keep-pools --psu-power-limit 900 --no-nand-backup --feeds-url file:./feeds/ -p root',
stdout=asyncio.subprocess.PIPE, stdout=asyncio.subprocess.PIPE,
stderr=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE,
stdin=asyncio.subprocess.PIPE
) )
# get stdout of the install # get stdout of the install
stdout = None
await self.add_to_output("Getting output...")
while True: while True:
try: try:
stdout = await proc.stderr.readuntil(b"\r") stdout = await asyncio.wait_for(proc.stderr.readuntil(b"\r"), 10)
except asyncio.exceptions.IncompleteReadError: except asyncio.exceptions.IncompleteReadError:
break break
except asyncio.exceptions.TimeoutError:
if not stdout:
await self.add_to_output("Miner encountered an error when installing, attempting to re-unlock. If this fails, you may need to factory reset the miner.")
self.state = UNLOCK
proc.kill()
return
continue
stdout_data = stdout.decode("utf-8").strip() stdout_data = stdout.decode("utf-8").strip()
if "ERROR:File" in stdout_data: if "ERROR:File" in stdout_data:
error = True error = "FILE"
if "ERROR:Auth" in stdout_data:
error = "AUTH"
proc.kill()
await self.add_to_output(stdout_data) await self.add_to_output(stdout_data)
if stdout == b"": if stdout == b"":
break break
await self.add_to_output("Waiting for process to complete...")
await proc.wait() await proc.wait()
while not await ping_miner(self.host): if not error:
await asyncio.sleep(3) await self.add_to_output("Waiting for miner to finish rebooting...")
await asyncio.sleep(5) while not await ping_miner(self.host):
if error: await asyncio.sleep(3)
await asyncio.sleep(5)
if error == "FILE":
await self.add_to_output("Encountered error, attempting to fix.") await self.add_to_output("Encountered error, attempting to fix.")
await self.fix_file_exists_bug() await self.fix_file_exists_bug()
self.state = START self.state = START
return return
elif error == "AUTH":
await self.add_to_output("Encountered unlock error, please pin reset.")
self.state = ERROR
return
await self.add_to_output("Install complete, configuring.") await self.add_to_output("Install complete, configuring.")
self.state = REFERRAL self.state = REFERRAL
@@ -312,5 +338,8 @@ class TestbenchMiner:
await self.install_referral() await self.install_referral()
if self.state == DONE: if self.state == DONE:
await self.install_done() await self.install_done()
if self.state == ERROR:
await self.wait_for_disconnect(wait_time=5)
except Exception as E: except Exception as E:
logging.error(f"{self.host}: {E}") logging.error(f"{self.host}: {E}")
await self.add_to_output(f"Error: {E}")