improved miner types, added a generalized API to unknown

This commit is contained in:
UpstreamData
2021-10-08 13:41:27 -06:00
parent e0dd2ee1f3
commit 3fa822de3a
8 changed files with 132 additions and 63 deletions

View File

@@ -1,7 +1,5 @@
from miners import BaseMiner
from API.bosminer import BOSMinerAPI
from API.bmminer import BMMinerAPI
from API.cgminer import CGMinerAPI
from miners import BaseMiner
class BMMiner(BaseMiner):

View File

@@ -1,7 +1,5 @@
from miners import BaseMiner
from API.bosminer import BOSMinerAPI
from API.bmminer import BMMinerAPI
from API.cgminer import CGMinerAPI
from miners import BaseMiner
class CGMiner(BaseMiner):

View File

@@ -1,12 +1,13 @@
from miners.bosminer import BOSminer
from miners.bmminer import BMMiner
from miners.cgminer import CGMiner
from miners.unknown_miner import UnknownMiner
from miners.unknown import UnknownMiner
from API import APIError
import asyncio
import ipaddress
import json
class MinerFactory:
async def get_miner(self, ip: ipaddress.ip_address):
version_data = await self._get_version_data(ip)
@@ -23,51 +24,52 @@ class MinerFactory:
return UnknownMiner(str(ip))
async def _get_version_data(self, ip: ipaddress.ip_address):
try:
# get reader and writer streams
reader, writer = await asyncio.open_connection(str(ip), 4028)
for i in range(3):
try:
# get reader and writer streams
reader, writer = await asyncio.open_connection(str(ip), 4028)
# create the command
cmd = {"command": "version"}
# create the command
cmd = {"command": "version"}
# send the command
writer.write(json.dumps(cmd).encode('utf-8'))
await writer.drain()
# send the command
writer.write(json.dumps(cmd).encode('utf-8'))
await writer.drain()
# instantiate data
data = b""
# instantiate data
data = b""
# loop to receive all the data
while True:
d = await reader.read(4096)
if not d:
break
data += d
# loop to receive all the data
while True:
d = await reader.read(4096)
if not d:
break
data += d
data = json.loads(data.decode('utf-8')[:-1])
data = json.loads(data.decode('utf-8')[:-1])
# close the connection
writer.close()
await writer.wait_closed()
# close the connection
writer.close()
await writer.wait_closed()
# check if the data returned is correct or an error
# if status isn't a key, it is a multicommand
if "STATUS" not in data.keys():
for key in data.keys():
# make sure not to try to turn id into a dict
if not key == "id":
# make sure they succeeded
if data[key][0]["STATUS"][0]["STATUS"] not in ["S", "I"]:
# this is an error
raise APIError(data["STATUS"][0]["Msg"])
else:
# make sure the command succeeded
if data["STATUS"][0]["STATUS"] not in ("S", "I"):
# this is an error
raise APIError(data["STATUS"][0]["Msg"])
# check if the data returned is correct or an error
# if status isn't a key, it is a multicommand
if "STATUS" not in data.keys():
for key in data.keys():
# make sure not to try to turn id into a dict
if not key == "id":
# make sure they succeeded
if data[key][0]["STATUS"][0]["STATUS"] not in ["S", "I"]:
# this is an error
raise APIError(data["STATUS"][0]["Msg"])
else:
# make sure the command succeeded
if data["STATUS"][0]["STATUS"] not in ("S", "I"):
# this is an error
raise APIError(data["STATUS"][0]["Msg"])
# return the data
return data
except Exception as e:
print(e)
return None
# return the data
return data
except Exception as e:
print(ip, e)
return None

11
miners/unknown.py Normal file
View File

@@ -0,0 +1,11 @@
from API.unknown import UnknownAPI
from miners import BaseMiner
class UnknownMiner(BaseMiner):
def __init__(self, ip: str):
api = UnknownAPI(ip)
super().__init__(ip, api)
def __repr__(self):
return f"Unknown: {str(self.ip)}"

View File

@@ -1,9 +0,0 @@
import ipaddress
class UnknownMiner():
def __init__(self, ip: str):
self.ip = ipaddress.ip_address(ip)
def __repr__(self):
return f"Unknown: {str(self.ip)}"