From dd4c0877494cb4bee63ff1fa09a7ccca863bd26a Mon Sep 17 00:00:00 2001 From: UpstreamData Date: Thu, 25 Jan 2024 14:26:53 -0700 Subject: [PATCH] refactor: move base classes to base.py in their directories, move data locations to miners.data, and rename `types` to `models`. --- docs/generate_miners.py | 2 +- pyasic/__init__.py | 7 +- pyasic/load/__init__.py | 2 +- pyasic/miners/__init__.py | 3 +- pyasic/miners/antminer/bmminer/X17/S17.py | 2 +- pyasic/miners/antminer/bmminer/X17/T17.py | 2 +- pyasic/miners/antminer/bmminer/X19/S19.py | 2 +- pyasic/miners/antminer/bmminer/X19/T19.py | 2 +- pyasic/miners/antminer/bmminer/X3/HS3.py | 2 +- pyasic/miners/antminer/bmminer/X3/L3.py | 2 +- pyasic/miners/antminer/bmminer/X7/L7.py | 2 +- pyasic/miners/antminer/bmminer/X9/E9.py | 2 +- pyasic/miners/antminer/bmminer/X9/S9.py | 2 +- pyasic/miners/antminer/bmminer/X9/T9.py | 2 +- pyasic/miners/antminer/bosminer/X17/S17.py | 2 +- pyasic/miners/antminer/bosminer/X17/T17.py | 2 +- pyasic/miners/antminer/bosminer/X19/S19.py | 2 +- pyasic/miners/antminer/bosminer/X19/T19.py | 2 +- pyasic/miners/antminer/bosminer/X9/S9.py | 2 +- pyasic/miners/antminer/cgminer/X15/Z15.py | 2 +- pyasic/miners/antminer/cgminer/X3/D3.py | 2 +- pyasic/miners/antminer/cgminer/X5/DR5.py | 2 +- pyasic/miners/antminer/epic/X19/S19.py | 2 +- pyasic/miners/antminer/hiveon/X9/T9.py | 4 +- pyasic/miners/antminer/luxos/X9/S9.py | 2 +- pyasic/miners/antminer/vnish/X17/S17.py | 2 +- pyasic/miners/antminer/vnish/X19/S19.py | 2 +- pyasic/miners/antminer/vnish/X19/T19.py | 2 +- pyasic/miners/antminer/vnish/X3/L3.py | 2 +- pyasic/miners/auradine/flux/AD/AT1.py | 2 +- pyasic/miners/auradine/flux/AD/AT2.py | 2 +- pyasic/miners/auradine/flux/AI/AI2.py | 2 +- pyasic/miners/auradine/flux/AI/AI3.py | 2 +- pyasic/miners/auradine/flux/AT/AD2.py | 2 +- pyasic/miners/auradine/flux/AT/AD3.py | 2 +- .../miners/avalonminer/cgminer/A10X/A1026.py | 2 +- .../miners/avalonminer/cgminer/A10X/A1047.py | 2 +- .../miners/avalonminer/cgminer/A10X/A1066.py | 2 +- .../miners/avalonminer/cgminer/A11X/A1166.py | 2 +- .../miners/avalonminer/cgminer/A12X/A1246.py | 2 +- pyasic/miners/avalonminer/cgminer/A7X/A721.py | 2 +- pyasic/miners/avalonminer/cgminer/A7X/A741.py | 2 +- pyasic/miners/avalonminer/cgminer/A7X/A761.py | 2 +- pyasic/miners/avalonminer/cgminer/A8X/A821.py | 2 +- pyasic/miners/avalonminer/cgminer/A8X/A841.py | 2 +- pyasic/miners/avalonminer/cgminer/A8X/A851.py | 2 +- pyasic/miners/avalonminer/cgminer/A9X/A921.py | 2 +- pyasic/miners/backends/antminer.py | 4 +- pyasic/miners/backends/auradine.py | 13 +- pyasic/miners/backends/avalonminer.py | 2 +- pyasic/miners/backends/bfgminer.py | 9 +- pyasic/miners/backends/bmminer.py | 9 +- pyasic/miners/backends/braiins_os.py | 4 +- pyasic/miners/backends/btminer.py | 9 +- pyasic/miners/backends/cgminer.py | 9 +- pyasic/miners/backends/epic.py | 9 +- pyasic/miners/backends/goldshell.py | 2 +- pyasic/miners/backends/innosilicon.py | 2 +- pyasic/miners/backends/luxminer.py | 9 +- pyasic/miners/{ => backends}/unknown.py | 28 +- pyasic/miners/backends/vnish.py | 2 +- pyasic/miners/base.py | 76 +--- pyasic/miners/data.py | 84 +++++ .../miners/{miner_factory.py => factory.py} | 4 +- pyasic/miners/goldshell/bfgminer/X5/CK5.py | 2 +- pyasic/miners/goldshell/bfgminer/X5/HS5.py | 2 +- pyasic/miners/goldshell/bfgminer/X5/KD5.py | 2 +- .../miners/goldshell/bfgminer/XMax/KDMax.py | 2 +- .../miners/innosilicon/cgminer/A10X/A10X.py | 2 +- pyasic/miners/innosilicon/cgminer/T3X/T3H.py | 2 +- .../miners/{miner_listener.py => listener.py} | 0 pyasic/miners/{makes.py => makes/__init__.py} | 0 pyasic/miners/{types => models}/__init__.py | 0 .../{types => models}/antminer/X15/Z15.py | 0 .../antminer/X15/__init__.py | 0 .../{types => models}/antminer/X17/S17.py | 0 .../{types => models}/antminer/X17/T17.py | 0 .../antminer/X17/__init__.py | 0 .../{types => models}/antminer/X19/S19.py | 0 .../{types => models}/antminer/X19/T19.py | 0 .../antminer/X19/__init__.py | 0 .../{types => models}/antminer/X3/D3.py | 0 .../{types => models}/antminer/X3/HS3.py | 0 .../{types => models}/antminer/X3/L3.py | 0 .../{types => models}/antminer/X3/__init__.py | 0 .../{types => models}/antminer/X5/DR5.py | 0 .../{types => models}/antminer/X5/__init__.py | 0 .../{types => models}/antminer/X7/L7.py | 0 .../{types => models}/antminer/X7/__init__.py | 0 .../{types => models}/antminer/X9/E9.py | 0 .../{types => models}/antminer/X9/S9.py | 0 .../{types => models}/antminer/X9/T9.py | 0 .../{types => models}/antminer/X9/__init__.py | 0 .../{types => models}/antminer/__init__.py | 0 .../{types => models}/auradine/AD/AD2.py | 0 .../{types => models}/auradine/AD/AD3.py | 0 .../{types => models}/auradine/AD/__init__.py | 0 .../{types => models}/auradine/AI/AI2.py | 0 .../{types => models}/auradine/AI/AI3.py | 0 .../{types => models}/auradine/AI/__init__.py | 0 .../{types => models}/auradine/AT/AT1.py | 0 .../{types => models}/auradine/AT/AT2.py | 0 .../{types => models}/auradine/AT/__init__.py | 0 .../{types => models}/auradine/__init__.py | 0 .../avalonminer/A10X/A1026.py | 0 .../avalonminer/A10X/A1047.py | 0 .../avalonminer/A10X/A1066.py | 0 .../avalonminer/A10X/__init__.py | 0 .../avalonminer/A11X/A1166.py | 0 .../avalonminer/A11X/__init__.py | 0 .../avalonminer/A12X/A1246.py | 0 .../avalonminer/A12X/__init__.py | 0 .../{types => models}/avalonminer/A7X/A721.py | 0 .../{types => models}/avalonminer/A7X/A741.py | 0 .../{types => models}/avalonminer/A7X/A761.py | 0 .../avalonminer/A7X/__init__.py | 0 .../{types => models}/avalonminer/A8X/A821.py | 0 .../{types => models}/avalonminer/A8X/A841.py | 0 .../{types => models}/avalonminer/A8X/A851.py | 0 .../avalonminer/A8X/__init__.py | 0 .../{types => models}/avalonminer/A9X/A921.py | 0 .../avalonminer/A9X/__init__.py | 0 .../{types => models}/avalonminer/__init__.py | 0 .../{types => models}/goldshell/X5/CK5.py | 0 .../{types => models}/goldshell/X5/HS5.py | 0 .../{types => models}/goldshell/X5/KD5.py | 0 .../goldshell/X5/__init__.py | 0 .../{types => models}/goldshell/XMax/KDMax.py | 0 .../goldshell/XMax/__init__.py | 0 .../{types => models}/goldshell/__init__.py | 0 .../innosilicon/A10X/A10X.py | 0 .../innosilicon/A10X/__init__.py | 0 .../{types => models}/innosilicon/T3X/T3H.py | 0 .../innosilicon/T3X/__init__.py | 0 .../{types => models}/innosilicon/__init__.py | 0 .../{types => models}/whatsminer/M2X/M20.py | 0 .../{types => models}/whatsminer/M2X/M20P.py | 0 .../{types => models}/whatsminer/M2X/M20S.py | 0 .../whatsminer/M2X/M20S_Plus.py | 0 .../{types => models}/whatsminer/M2X/M21.py | 0 .../{types => models}/whatsminer/M2X/M21S.py | 0 .../whatsminer/M2X/M21S_Plus.py | 0 .../{types => models}/whatsminer/M2X/M29.py | 0 .../whatsminer/M2X/__init__.py | 0 .../{types => models}/whatsminer/M3X/M30.py | 0 .../{types => models}/whatsminer/M3X/M30K.py | 0 .../{types => models}/whatsminer/M3X/M30L.py | 0 .../{types => models}/whatsminer/M3X/M30S.py | 0 .../whatsminer/M3X/M30S_Plus.py | 0 .../whatsminer/M3X/M30S_Plus_Plus.py | 0 .../{types => models}/whatsminer/M3X/M31.py | 0 .../{types => models}/whatsminer/M3X/M31H.py | 0 .../{types => models}/whatsminer/M3X/M31L.py | 0 .../{types => models}/whatsminer/M3X/M31S.py | 0 .../{types => models}/whatsminer/M3X/M31SE.py | 0 .../whatsminer/M3X/M31S_Plus.py | 0 .../{types => models}/whatsminer/M3X/M32.py | 0 .../{types => models}/whatsminer/M3X/M32S.py | 0 .../{types => models}/whatsminer/M3X/M33.py | 0 .../{types => models}/whatsminer/M3X/M33S.py | 0 .../whatsminer/M3X/M33S_Plus.py | 0 .../whatsminer/M3X/M33S_Plus_Plus.py | 0 .../whatsminer/M3X/M34S_Plus.py | 0 .../{types => models}/whatsminer/M3X/M36S.py | 0 .../whatsminer/M3X/M36S_Plus.py | 0 .../whatsminer/M3X/M36S_Plus_Plus.py | 0 .../{types => models}/whatsminer/M3X/M39.py | 0 .../whatsminer/M3X/__init__.py | 0 .../{types => models}/whatsminer/M5X/M50.py | 0 .../{types => models}/whatsminer/M5X/M50S.py | 0 .../whatsminer/M5X/M50S_Plus.py | 0 .../whatsminer/M5X/M50S_Plus_Plus.py | 0 .../{types => models}/whatsminer/M5X/M53.py | 0 .../{types => models}/whatsminer/M5X/M53S.py | 0 .../whatsminer/M5X/M53S_Plus.py | 0 .../{types => models}/whatsminer/M5X/M56.py | 0 .../{types => models}/whatsminer/M5X/M56S.py | 0 .../whatsminer/M5X/M56S_Plus.py | 0 .../{types => models}/whatsminer/M5X/M59.py | 0 .../whatsminer/M5X/__init__.py | 0 .../{types => models}/whatsminer/M6X/M60.py | 0 .../{types => models}/whatsminer/M6X/M60S.py | 0 .../{types => models}/whatsminer/M6X/M63.py | 0 .../{types => models}/whatsminer/M6X/M63S.py | 0 .../{types => models}/whatsminer/M6X/M66.py | 0 .../{types => models}/whatsminer/M6X/M66S.py | 0 .../whatsminer/M6X/__init__.py | 0 .../{types => models}/whatsminer/__init__.py | 0 pyasic/miners/whatsminer/btminer/M2X/M20.py | 2 +- pyasic/miners/whatsminer/btminer/M2X/M20P.py | 2 +- pyasic/miners/whatsminer/btminer/M2X/M20S.py | 2 +- .../whatsminer/btminer/M2X/M20S_Plus.py | 2 +- pyasic/miners/whatsminer/btminer/M2X/M21.py | 2 +- pyasic/miners/whatsminer/btminer/M2X/M21S.py | 2 +- .../whatsminer/btminer/M2X/M21S_Plus.py | 2 +- pyasic/miners/whatsminer/btminer/M2X/M29.py | 2 +- pyasic/miners/whatsminer/btminer/M3X/M30.py | 2 +- pyasic/miners/whatsminer/btminer/M3X/M30K.py | 2 +- pyasic/miners/whatsminer/btminer/M3X/M30L.py | 2 +- pyasic/miners/whatsminer/btminer/M3X/M30S.py | 2 +- .../whatsminer/btminer/M3X/M30S_Plus.py | 2 +- .../whatsminer/btminer/M3X/M30S_Plus_Plus.py | 2 +- pyasic/miners/whatsminer/btminer/M3X/M31.py | 2 +- pyasic/miners/whatsminer/btminer/M3X/M31H.py | 2 +- pyasic/miners/whatsminer/btminer/M3X/M31L.py | 2 +- pyasic/miners/whatsminer/btminer/M3X/M31S.py | 2 +- pyasic/miners/whatsminer/btminer/M3X/M31SE.py | 2 +- .../whatsminer/btminer/M3X/M31S_Plus.py | 2 +- pyasic/miners/whatsminer/btminer/M3X/M32.py | 2 +- pyasic/miners/whatsminer/btminer/M3X/M32S.py | 2 +- pyasic/miners/whatsminer/btminer/M3X/M33.py | 2 +- pyasic/miners/whatsminer/btminer/M3X/M33S.py | 2 +- .../whatsminer/btminer/M3X/M33S_Plus.py | 2 +- .../whatsminer/btminer/M3X/M33S_Plus_Plus.py | 2 +- .../whatsminer/btminer/M3X/M34S_Plus.py | 2 +- pyasic/miners/whatsminer/btminer/M3X/M36S.py | 2 +- .../whatsminer/btminer/M3X/M36S_Plus.py | 2 +- .../whatsminer/btminer/M3X/M36S_Plus_Plus.py | 2 +- pyasic/miners/whatsminer/btminer/M3X/M39.py | 2 +- pyasic/miners/whatsminer/btminer/M5X/M50.py | 2 +- pyasic/miners/whatsminer/btminer/M5X/M50S.py | 2 +- .../whatsminer/btminer/M5X/M50S_Plus.py | 2 +- .../whatsminer/btminer/M5X/M50S_Plus_Plus.py | 2 +- pyasic/miners/whatsminer/btminer/M5X/M53.py | 2 +- pyasic/miners/whatsminer/btminer/M5X/M53S.py | 2 +- .../whatsminer/btminer/M5X/M53S_Plus.py | 2 +- pyasic/miners/whatsminer/btminer/M5X/M56.py | 2 +- pyasic/miners/whatsminer/btminer/M5X/M56S.py | 2 +- .../whatsminer/btminer/M5X/M56S_Plus.py | 2 +- pyasic/miners/whatsminer/btminer/M5X/M59.py | 2 +- pyasic/miners/whatsminer/btminer/M6X/M60.py | 2 +- pyasic/miners/whatsminer/btminer/M6X/M60S.py | 2 +- pyasic/miners/whatsminer/btminer/M6X/M63.py | 2 +- pyasic/miners/whatsminer/btminer/M6X/M63S.py | 2 +- pyasic/miners/whatsminer/btminer/M6X/M66.py | 2 +- pyasic/miners/whatsminer/btminer/M6X/M66S.py | 2 +- pyasic/misc/__init__.py | 2 +- pyasic/network/__init__.py | 2 +- pyasic/rpc/__init__.py | 327 +---------------- pyasic/rpc/base.py | 334 ++++++++++++++++++ pyasic/rpc/bosminer.py | 2 +- pyasic/rpc/btminer.py | 28 +- pyasic/rpc/cgminer.py | 2 +- pyasic/rpc/gcminer.py | 3 +- pyasic/rpc/luxminer.py | 2 +- pyasic/ssh/__init__.py | 64 +--- pyasic/ssh/antminer.py | 4 +- pyasic/ssh/base.py | 47 +++ pyasic/ssh/braiins_os.py | 4 +- pyasic/web/__init__.py | 90 +---- pyasic/web/antminer.py | 2 +- pyasic/web/auradine.py | 4 +- pyasic/web/base.py | 98 +++++ pyasic/web/braiins_os/boser.py | 2 +- pyasic/web/braiins_os/bosminer.py | 2 +- pyasic/web/epic.py | 2 +- pyasic/web/goldshell.py | 2 +- pyasic/web/innosilicon.py | 2 +- pyasic/web/vnish.py | 2 +- tests/api_tests/__init__.py | 6 +- tests/miners_tests/__init__.py | 2 +- 261 files changed, 779 insertions(+), 741 deletions(-) rename pyasic/miners/{ => backends}/unknown.py (79%) create mode 100644 pyasic/miners/data.py rename pyasic/miners/{miner_factory.py => factory.py} (99%) rename pyasic/miners/{miner_listener.py => listener.py} (100%) rename pyasic/miners/{makes.py => makes/__init__.py} (100%) rename pyasic/miners/{types => models}/__init__.py (100%) rename pyasic/miners/{types => models}/antminer/X15/Z15.py (100%) rename pyasic/miners/{types => models}/antminer/X15/__init__.py (100%) rename pyasic/miners/{types => models}/antminer/X17/S17.py (100%) rename pyasic/miners/{types => models}/antminer/X17/T17.py (100%) rename pyasic/miners/{types => models}/antminer/X17/__init__.py (100%) rename pyasic/miners/{types => models}/antminer/X19/S19.py (100%) rename pyasic/miners/{types => models}/antminer/X19/T19.py (100%) rename pyasic/miners/{types => models}/antminer/X19/__init__.py (100%) rename pyasic/miners/{types => models}/antminer/X3/D3.py (100%) rename pyasic/miners/{types => models}/antminer/X3/HS3.py (100%) rename pyasic/miners/{types => models}/antminer/X3/L3.py (100%) rename pyasic/miners/{types => models}/antminer/X3/__init__.py (100%) rename pyasic/miners/{types => models}/antminer/X5/DR5.py (100%) rename pyasic/miners/{types => models}/antminer/X5/__init__.py (100%) rename pyasic/miners/{types => models}/antminer/X7/L7.py (100%) rename pyasic/miners/{types => models}/antminer/X7/__init__.py (100%) rename pyasic/miners/{types => models}/antminer/X9/E9.py (100%) rename pyasic/miners/{types => models}/antminer/X9/S9.py (100%) rename pyasic/miners/{types => models}/antminer/X9/T9.py (100%) rename pyasic/miners/{types => models}/antminer/X9/__init__.py (100%) rename pyasic/miners/{types => models}/antminer/__init__.py (100%) rename pyasic/miners/{types => models}/auradine/AD/AD2.py (100%) rename pyasic/miners/{types => models}/auradine/AD/AD3.py (100%) rename pyasic/miners/{types => models}/auradine/AD/__init__.py (100%) rename pyasic/miners/{types => models}/auradine/AI/AI2.py (100%) rename pyasic/miners/{types => models}/auradine/AI/AI3.py (100%) rename pyasic/miners/{types => models}/auradine/AI/__init__.py (100%) rename pyasic/miners/{types => models}/auradine/AT/AT1.py (100%) rename pyasic/miners/{types => models}/auradine/AT/AT2.py (100%) rename pyasic/miners/{types => models}/auradine/AT/__init__.py (100%) rename pyasic/miners/{types => models}/auradine/__init__.py (100%) rename pyasic/miners/{types => models}/avalonminer/A10X/A1026.py (100%) rename pyasic/miners/{types => models}/avalonminer/A10X/A1047.py (100%) rename pyasic/miners/{types => models}/avalonminer/A10X/A1066.py (100%) rename pyasic/miners/{types => models}/avalonminer/A10X/__init__.py (100%) rename pyasic/miners/{types => models}/avalonminer/A11X/A1166.py (100%) rename pyasic/miners/{types => models}/avalonminer/A11X/__init__.py (100%) rename pyasic/miners/{types => models}/avalonminer/A12X/A1246.py (100%) rename pyasic/miners/{types => models}/avalonminer/A12X/__init__.py (100%) rename pyasic/miners/{types => models}/avalonminer/A7X/A721.py (100%) rename pyasic/miners/{types => models}/avalonminer/A7X/A741.py (100%) rename pyasic/miners/{types => models}/avalonminer/A7X/A761.py (100%) rename pyasic/miners/{types => models}/avalonminer/A7X/__init__.py (100%) rename pyasic/miners/{types => models}/avalonminer/A8X/A821.py (100%) rename pyasic/miners/{types => models}/avalonminer/A8X/A841.py (100%) rename pyasic/miners/{types => models}/avalonminer/A8X/A851.py (100%) rename pyasic/miners/{types => models}/avalonminer/A8X/__init__.py (100%) rename pyasic/miners/{types => models}/avalonminer/A9X/A921.py (100%) rename pyasic/miners/{types => models}/avalonminer/A9X/__init__.py (100%) rename pyasic/miners/{types => models}/avalonminer/__init__.py (100%) rename pyasic/miners/{types => models}/goldshell/X5/CK5.py (100%) rename pyasic/miners/{types => models}/goldshell/X5/HS5.py (100%) rename pyasic/miners/{types => models}/goldshell/X5/KD5.py (100%) rename pyasic/miners/{types => models}/goldshell/X5/__init__.py (100%) rename pyasic/miners/{types => models}/goldshell/XMax/KDMax.py (100%) rename pyasic/miners/{types => models}/goldshell/XMax/__init__.py (100%) rename pyasic/miners/{types => models}/goldshell/__init__.py (100%) rename pyasic/miners/{types => models}/innosilicon/A10X/A10X.py (100%) rename pyasic/miners/{types => models}/innosilicon/A10X/__init__.py (100%) rename pyasic/miners/{types => models}/innosilicon/T3X/T3H.py (100%) rename pyasic/miners/{types => models}/innosilicon/T3X/__init__.py (100%) rename pyasic/miners/{types => models}/innosilicon/__init__.py (100%) rename pyasic/miners/{types => models}/whatsminer/M2X/M20.py (100%) rename pyasic/miners/{types => models}/whatsminer/M2X/M20P.py (100%) rename pyasic/miners/{types => models}/whatsminer/M2X/M20S.py (100%) rename pyasic/miners/{types => models}/whatsminer/M2X/M20S_Plus.py (100%) rename pyasic/miners/{types => models}/whatsminer/M2X/M21.py (100%) rename pyasic/miners/{types => models}/whatsminer/M2X/M21S.py (100%) rename pyasic/miners/{types => models}/whatsminer/M2X/M21S_Plus.py (100%) rename pyasic/miners/{types => models}/whatsminer/M2X/M29.py (100%) rename pyasic/miners/{types => models}/whatsminer/M2X/__init__.py (100%) rename pyasic/miners/{types => models}/whatsminer/M3X/M30.py (100%) rename pyasic/miners/{types => models}/whatsminer/M3X/M30K.py (100%) rename pyasic/miners/{types => models}/whatsminer/M3X/M30L.py (100%) rename pyasic/miners/{types => models}/whatsminer/M3X/M30S.py (100%) rename pyasic/miners/{types => models}/whatsminer/M3X/M30S_Plus.py (100%) rename pyasic/miners/{types => models}/whatsminer/M3X/M30S_Plus_Plus.py (100%) rename pyasic/miners/{types => models}/whatsminer/M3X/M31.py (100%) rename pyasic/miners/{types => models}/whatsminer/M3X/M31H.py (100%) rename pyasic/miners/{types => models}/whatsminer/M3X/M31L.py (100%) rename pyasic/miners/{types => models}/whatsminer/M3X/M31S.py (100%) rename pyasic/miners/{types => models}/whatsminer/M3X/M31SE.py (100%) rename pyasic/miners/{types => models}/whatsminer/M3X/M31S_Plus.py (100%) rename pyasic/miners/{types => models}/whatsminer/M3X/M32.py (100%) rename pyasic/miners/{types => models}/whatsminer/M3X/M32S.py (100%) rename pyasic/miners/{types => models}/whatsminer/M3X/M33.py (100%) rename pyasic/miners/{types => models}/whatsminer/M3X/M33S.py (100%) rename pyasic/miners/{types => models}/whatsminer/M3X/M33S_Plus.py (100%) rename pyasic/miners/{types => models}/whatsminer/M3X/M33S_Plus_Plus.py (100%) rename pyasic/miners/{types => models}/whatsminer/M3X/M34S_Plus.py (100%) rename pyasic/miners/{types => models}/whatsminer/M3X/M36S.py (100%) rename pyasic/miners/{types => models}/whatsminer/M3X/M36S_Plus.py (100%) rename pyasic/miners/{types => models}/whatsminer/M3X/M36S_Plus_Plus.py (100%) rename pyasic/miners/{types => models}/whatsminer/M3X/M39.py (100%) rename pyasic/miners/{types => models}/whatsminer/M3X/__init__.py (100%) rename pyasic/miners/{types => models}/whatsminer/M5X/M50.py (100%) rename pyasic/miners/{types => models}/whatsminer/M5X/M50S.py (100%) rename pyasic/miners/{types => models}/whatsminer/M5X/M50S_Plus.py (100%) rename pyasic/miners/{types => models}/whatsminer/M5X/M50S_Plus_Plus.py (100%) rename pyasic/miners/{types => models}/whatsminer/M5X/M53.py (100%) rename pyasic/miners/{types => models}/whatsminer/M5X/M53S.py (100%) rename pyasic/miners/{types => models}/whatsminer/M5X/M53S_Plus.py (100%) rename pyasic/miners/{types => models}/whatsminer/M5X/M56.py (100%) rename pyasic/miners/{types => models}/whatsminer/M5X/M56S.py (100%) rename pyasic/miners/{types => models}/whatsminer/M5X/M56S_Plus.py (100%) rename pyasic/miners/{types => models}/whatsminer/M5X/M59.py (100%) rename pyasic/miners/{types => models}/whatsminer/M5X/__init__.py (100%) rename pyasic/miners/{types => models}/whatsminer/M6X/M60.py (100%) rename pyasic/miners/{types => models}/whatsminer/M6X/M60S.py (100%) rename pyasic/miners/{types => models}/whatsminer/M6X/M63.py (100%) rename pyasic/miners/{types => models}/whatsminer/M6X/M63S.py (100%) rename pyasic/miners/{types => models}/whatsminer/M6X/M66.py (100%) rename pyasic/miners/{types => models}/whatsminer/M6X/M66S.py (100%) rename pyasic/miners/{types => models}/whatsminer/M6X/__init__.py (100%) rename pyasic/miners/{types => models}/whatsminer/__init__.py (100%) create mode 100644 pyasic/rpc/base.py create mode 100644 pyasic/ssh/base.py create mode 100644 pyasic/web/base.py diff --git a/docs/generate_miners.py b/docs/generate_miners.py index 1e196268..cda8d0df 100644 --- a/docs/generate_miners.py +++ b/docs/generate_miners.py @@ -3,7 +3,7 @@ import importlib import os import warnings -from pyasic.miners.miner_factory import MINER_CLASSES, MinerTypes +from pyasic.miners.factory import MINER_CLASSES, MinerTypes warnings.filterwarnings("ignore") diff --git a/pyasic/__init__.py b/pyasic/__init__.py index 88a6dc2f..bf271f84 100644 --- a/pyasic/__init__.py +++ b/pyasic/__init__.py @@ -23,10 +23,9 @@ from pyasic.data import ( X19Error, ) from pyasic.errors import APIError, APIWarning -from pyasic.miners import get_miner -from pyasic.miners.base import AnyMiner, DataOptions -from pyasic.miners.miner_factory import MinerFactory, miner_factory -from pyasic.miners.miner_listener import MinerListener +from pyasic.miners import AnyMiner, DataOptions, get_miner +from pyasic.miners.factory import MinerFactory, miner_factory +from pyasic.miners.listener import MinerListener from pyasic.network import MinerNetwork from pyasic.rpc.bmminer import BMMinerRPCAPI from pyasic.rpc.bosminer import BOSMinerRPCAPI diff --git a/pyasic/load/__init__.py b/pyasic/load/__init__.py index f0d710e1..19922cb5 100644 --- a/pyasic/load/__init__.py +++ b/pyasic/load/__init__.py @@ -20,7 +20,7 @@ from typing import List, Union from pyasic.errors import APIError from pyasic.miners import AnyMiner from pyasic.miners.backends import AntminerModern, BOSMiner, BTMiner -from pyasic.miners.types import S9, S17, T17, S17e, S17Plus, S17Pro, T17e, T17Plus +from pyasic.miners.models import S9, S17, T17, S17e, S17Plus, S17Pro, T17e, T17Plus FAN_USAGE = 50 # 50 W per fan diff --git a/pyasic/miners/__init__.py b/pyasic/miners/__init__.py index 8f72f313..bf58141f 100644 --- a/pyasic/miners/__init__.py +++ b/pyasic/miners/__init__.py @@ -18,7 +18,8 @@ import ipaddress from typing import Union from pyasic.miners.base import AnyMiner, BaseMiner -from pyasic.miners.miner_factory import miner_factory +from pyasic.miners.data import DataOptions +from pyasic.miners.factory import miner_factory # abstracted version of get miner that is easier to access diff --git a/pyasic/miners/antminer/bmminer/X17/S17.py b/pyasic/miners/antminer/bmminer/X17/S17.py index 4e0f48eb..cb49b832 100644 --- a/pyasic/miners/antminer/bmminer/X17/S17.py +++ b/pyasic/miners/antminer/bmminer/X17/S17.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import AntminerOld -from pyasic.miners.types import S17, S17e, S17Plus, S17Pro +from pyasic.miners.models import S17, S17e, S17Plus, S17Pro class BMMinerS17(AntminerOld, S17): diff --git a/pyasic/miners/antminer/bmminer/X17/T17.py b/pyasic/miners/antminer/bmminer/X17/T17.py index 8552e730..7fee7fc8 100644 --- a/pyasic/miners/antminer/bmminer/X17/T17.py +++ b/pyasic/miners/antminer/bmminer/X17/T17.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import AntminerOld -from pyasic.miners.types import T17, T17e, T17Plus +from pyasic.miners.models import T17, T17e, T17Plus class BMMinerT17(AntminerOld, T17): diff --git a/pyasic/miners/antminer/bmminer/X19/S19.py b/pyasic/miners/antminer/bmminer/X19/S19.py index 2a2c6418..ee982340 100644 --- a/pyasic/miners/antminer/bmminer/X19/S19.py +++ b/pyasic/miners/antminer/bmminer/X19/S19.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import AntminerModern -from pyasic.miners.types import ( +from pyasic.miners.models import ( S19, S19L, S19XP, diff --git a/pyasic/miners/antminer/bmminer/X19/T19.py b/pyasic/miners/antminer/bmminer/X19/T19.py index bf100a17..33960013 100644 --- a/pyasic/miners/antminer/bmminer/X19/T19.py +++ b/pyasic/miners/antminer/bmminer/X19/T19.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import AntminerModern -from pyasic.miners.types import T19 +from pyasic.miners.models import T19 class BMMinerT19(AntminerModern, T19): diff --git a/pyasic/miners/antminer/bmminer/X3/HS3.py b/pyasic/miners/antminer/bmminer/X3/HS3.py index d44eeccc..adad62d3 100644 --- a/pyasic/miners/antminer/bmminer/X3/HS3.py +++ b/pyasic/miners/antminer/bmminer/X3/HS3.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import AntminerModern -from pyasic.miners.types import HS3 +from pyasic.miners.models import HS3 class BMMinerHS3(AntminerModern, HS3): diff --git a/pyasic/miners/antminer/bmminer/X3/L3.py b/pyasic/miners/antminer/bmminer/X3/L3.py index d2f4eff9..985af15e 100644 --- a/pyasic/miners/antminer/bmminer/X3/L3.py +++ b/pyasic/miners/antminer/bmminer/X3/L3.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import AntminerOld -from pyasic.miners.types import L3Plus +from pyasic.miners.models import L3Plus class BMMinerL3Plus(AntminerOld, L3Plus): diff --git a/pyasic/miners/antminer/bmminer/X7/L7.py b/pyasic/miners/antminer/bmminer/X7/L7.py index 497a5d03..48530495 100644 --- a/pyasic/miners/antminer/bmminer/X7/L7.py +++ b/pyasic/miners/antminer/bmminer/X7/L7.py @@ -14,7 +14,7 @@ # limitations under the License. - # ------------------------------------------------------------------------------ from pyasic.miners.backends import AntminerModern -from pyasic.miners.types import L7 +from pyasic.miners.models import L7 class BMMinerL7(AntminerModern, L7): diff --git a/pyasic/miners/antminer/bmminer/X9/E9.py b/pyasic/miners/antminer/bmminer/X9/E9.py index 1fc670e8..8616ef14 100644 --- a/pyasic/miners/antminer/bmminer/X9/E9.py +++ b/pyasic/miners/antminer/bmminer/X9/E9.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import AntminerModern -from pyasic.miners.types import E9Pro +from pyasic.miners.models import E9Pro class BMMinerE9Pro(AntminerModern, E9Pro): diff --git a/pyasic/miners/antminer/bmminer/X9/S9.py b/pyasic/miners/antminer/bmminer/X9/S9.py index 77e98b77..ca23a035 100644 --- a/pyasic/miners/antminer/bmminer/X9/S9.py +++ b/pyasic/miners/antminer/bmminer/X9/S9.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import BMMiner -from pyasic.miners.types import S9, S9i, S9j +from pyasic.miners.models import S9, S9i, S9j class BMMinerS9(BMMiner, S9): diff --git a/pyasic/miners/antminer/bmminer/X9/T9.py b/pyasic/miners/antminer/bmminer/X9/T9.py index 0d3729ad..f9543aba 100644 --- a/pyasic/miners/antminer/bmminer/X9/T9.py +++ b/pyasic/miners/antminer/bmminer/X9/T9.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import BMMiner -from pyasic.miners.types import T9 +from pyasic.miners.models import T9 class BMMinerT9(BMMiner, T9): diff --git a/pyasic/miners/antminer/bosminer/X17/S17.py b/pyasic/miners/antminer/bosminer/X17/S17.py index ebd3b83b..935af1db 100644 --- a/pyasic/miners/antminer/bosminer/X17/S17.py +++ b/pyasic/miners/antminer/bosminer/X17/S17.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import BOSer -from pyasic.miners.types import S17, S17e, S17Plus, S17Pro +from pyasic.miners.models import S17, S17e, S17Plus, S17Pro class BOSMinerS17(BOSer, S17): diff --git a/pyasic/miners/antminer/bosminer/X17/T17.py b/pyasic/miners/antminer/bosminer/X17/T17.py index 1350ce58..f58da644 100644 --- a/pyasic/miners/antminer/bosminer/X17/T17.py +++ b/pyasic/miners/antminer/bosminer/X17/T17.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import BOSer -from pyasic.miners.types import T17, T17e, T17Plus +from pyasic.miners.models import T17, T17e, T17Plus class BOSMinerT17(BOSer, T17): diff --git a/pyasic/miners/antminer/bosminer/X19/S19.py b/pyasic/miners/antminer/bosminer/X19/S19.py index 10ad1de8..9f799f1c 100644 --- a/pyasic/miners/antminer/bosminer/X19/S19.py +++ b/pyasic/miners/antminer/bosminer/X19/S19.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import BOSer -from pyasic.miners.types import ( +from pyasic.miners.models import ( S19, S19XP, S19a, diff --git a/pyasic/miners/antminer/bosminer/X19/T19.py b/pyasic/miners/antminer/bosminer/X19/T19.py index b57d0401..3d3fe7df 100644 --- a/pyasic/miners/antminer/bosminer/X19/T19.py +++ b/pyasic/miners/antminer/bosminer/X19/T19.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import BOSer -from pyasic.miners.types import T19 +from pyasic.miners.models import T19 class BOSMinerT19(BOSer, T19): diff --git a/pyasic/miners/antminer/bosminer/X9/S9.py b/pyasic/miners/antminer/bosminer/X9/S9.py index dab09196..ae718fab 100644 --- a/pyasic/miners/antminer/bosminer/X9/S9.py +++ b/pyasic/miners/antminer/bosminer/X9/S9.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import BOSMiner -from pyasic.miners.types import S9 +from pyasic.miners.models import S9 class BOSMinerS9(BOSMiner, S9): diff --git a/pyasic/miners/antminer/cgminer/X15/Z15.py b/pyasic/miners/antminer/cgminer/X15/Z15.py index 3e9c66ce..da98b94a 100644 --- a/pyasic/miners/antminer/cgminer/X15/Z15.py +++ b/pyasic/miners/antminer/cgminer/X15/Z15.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import AntminerOld -from pyasic.miners.types import Z15 +from pyasic.miners.models import Z15 class CGMinerZ15(AntminerOld, Z15): diff --git a/pyasic/miners/antminer/cgminer/X3/D3.py b/pyasic/miners/antminer/cgminer/X3/D3.py index 07e808d0..1b485d8f 100644 --- a/pyasic/miners/antminer/cgminer/X3/D3.py +++ b/pyasic/miners/antminer/cgminer/X3/D3.py @@ -14,7 +14,7 @@ # limitations under the License. - # ------------------------------------------------------------------------------ from pyasic.miners.backends import AntminerOld -from pyasic.miners.types import D3 +from pyasic.miners.models import D3 class CGMinerD3(AntminerOld, D3): diff --git a/pyasic/miners/antminer/cgminer/X5/DR5.py b/pyasic/miners/antminer/cgminer/X5/DR5.py index 93870b46..839d74d9 100644 --- a/pyasic/miners/antminer/cgminer/X5/DR5.py +++ b/pyasic/miners/antminer/cgminer/X5/DR5.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import AntminerOld -from pyasic.miners.types import DR5 +from pyasic.miners.models import DR5 class CGMinerDR5(AntminerOld, DR5): diff --git a/pyasic/miners/antminer/epic/X19/S19.py b/pyasic/miners/antminer/epic/X19/S19.py index 5a5fd934..3bb9d078 100644 --- a/pyasic/miners/antminer/epic/X19/S19.py +++ b/pyasic/miners/antminer/epic/X19/S19.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import ePIC -from pyasic.miners.types import S19, S19XP, S19j, S19jPro, S19jProPlus, S19kPro, S19Pro +from pyasic.miners.models import S19, S19XP, S19j, S19jPro, S19jProPlus, S19kPro, S19Pro class ePICS19(ePIC, S19): diff --git a/pyasic/miners/antminer/hiveon/X9/T9.py b/pyasic/miners/antminer/hiveon/X9/T9.py index 40a88d94..10952752 100644 --- a/pyasic/miners/antminer/hiveon/X9/T9.py +++ b/pyasic/miners/antminer/hiveon/X9/T9.py @@ -21,8 +21,8 @@ import asyncssh from pyasic.data import HashBoard from pyasic.errors import APIError from pyasic.miners.backends import Hiveon -from pyasic.miners.base import DataFunction, DataLocations, DataOptions, RPCAPICommand -from pyasic.miners.types import T9 +from pyasic.miners.data import DataFunction, DataLocations, DataOptions, RPCAPICommand +from pyasic.miners.models import T9 HIVEON_T9_DATA_LOC = DataLocations( **{ diff --git a/pyasic/miners/antminer/luxos/X9/S9.py b/pyasic/miners/antminer/luxos/X9/S9.py index b7454ff2..44828902 100644 --- a/pyasic/miners/antminer/luxos/X9/S9.py +++ b/pyasic/miners/antminer/luxos/X9/S9.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import LUXMiner -from pyasic.miners.types import S9 +from pyasic.miners.models import S9 class LUXMinerS9(LUXMiner, S9): diff --git a/pyasic/miners/antminer/vnish/X17/S17.py b/pyasic/miners/antminer/vnish/X17/S17.py index 36529f6a..ed412037 100644 --- a/pyasic/miners/antminer/vnish/X17/S17.py +++ b/pyasic/miners/antminer/vnish/X17/S17.py @@ -14,7 +14,7 @@ # limitations under the License. - # ------------------------------------------------------------------------------ from pyasic.miners.backends import VNish -from pyasic.miners.types import S17Plus, S17Pro +from pyasic.miners.models import S17Plus, S17Pro class VNishS17Plus(VNish, S17Plus): diff --git a/pyasic/miners/antminer/vnish/X19/S19.py b/pyasic/miners/antminer/vnish/X19/S19.py index 031167c4..d55d8e0e 100644 --- a/pyasic/miners/antminer/vnish/X19/S19.py +++ b/pyasic/miners/antminer/vnish/X19/S19.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import VNish -from pyasic.miners.types import ( +from pyasic.miners.models import ( S19, S19XP, S19a, diff --git a/pyasic/miners/antminer/vnish/X19/T19.py b/pyasic/miners/antminer/vnish/X19/T19.py index bbc7f5de..2c58f15a 100644 --- a/pyasic/miners/antminer/vnish/X19/T19.py +++ b/pyasic/miners/antminer/vnish/X19/T19.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import VNish -from pyasic.miners.types import T19 +from pyasic.miners.models import T19 class VNishT19(VNish, T19): diff --git a/pyasic/miners/antminer/vnish/X3/L3.py b/pyasic/miners/antminer/vnish/X3/L3.py index 2abf9720..2e7b5cf2 100644 --- a/pyasic/miners/antminer/vnish/X3/L3.py +++ b/pyasic/miners/antminer/vnish/X3/L3.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import VNish -from pyasic.miners.types import L3Plus +from pyasic.miners.models import L3Plus class VnishL3Plus(VNish, L3Plus): diff --git a/pyasic/miners/auradine/flux/AD/AT1.py b/pyasic/miners/auradine/flux/AD/AT1.py index 7ac0b7d6..33e26a6c 100644 --- a/pyasic/miners/auradine/flux/AD/AT1.py +++ b/pyasic/miners/auradine/flux/AD/AT1.py @@ -1,5 +1,5 @@ from pyasic.miners.backends import Auradine -from pyasic.miners.types import AuradineAT1500 +from pyasic.miners.models import AuradineAT1500 class AuradineFluxAT1500(AuradineAT1500, Auradine): diff --git a/pyasic/miners/auradine/flux/AD/AT2.py b/pyasic/miners/auradine/flux/AD/AT2.py index 208b6e7e..69d39af9 100644 --- a/pyasic/miners/auradine/flux/AD/AT2.py +++ b/pyasic/miners/auradine/flux/AD/AT2.py @@ -1,5 +1,5 @@ from pyasic.miners.backends import Auradine -from pyasic.miners.types import AuradineAT2860, AuradineAT2880 +from pyasic.miners.models import AuradineAT2860, AuradineAT2880 class AuradineFluxAT2860(AuradineAT2860, Auradine): diff --git a/pyasic/miners/auradine/flux/AI/AI2.py b/pyasic/miners/auradine/flux/AI/AI2.py index ebf6506e..4d260c67 100644 --- a/pyasic/miners/auradine/flux/AI/AI2.py +++ b/pyasic/miners/auradine/flux/AI/AI2.py @@ -1,5 +1,5 @@ from pyasic.miners.backends import Auradine -from pyasic.miners.types import AuradineAI2500 +from pyasic.miners.models import AuradineAI2500 class AuradineFluxAI2500(AuradineAI2500, Auradine): diff --git a/pyasic/miners/auradine/flux/AI/AI3.py b/pyasic/miners/auradine/flux/AI/AI3.py index d495c711..8ce8c3a7 100644 --- a/pyasic/miners/auradine/flux/AI/AI3.py +++ b/pyasic/miners/auradine/flux/AI/AI3.py @@ -1,5 +1,5 @@ from pyasic.miners.backends import Auradine -from pyasic.miners.types import AuradineAI3680 +from pyasic.miners.models import AuradineAI3680 class AuradineFluxAI3680(AuradineAI3680, Auradine): diff --git a/pyasic/miners/auradine/flux/AT/AD2.py b/pyasic/miners/auradine/flux/AT/AD2.py index 051b139c..827d1a7c 100644 --- a/pyasic/miners/auradine/flux/AT/AD2.py +++ b/pyasic/miners/auradine/flux/AT/AD2.py @@ -1,5 +1,5 @@ from pyasic.miners.backends import Auradine -from pyasic.miners.types import AuradineAD2500 +from pyasic.miners.models import AuradineAD2500 class AuradineFluxAD2500(AuradineAD2500, Auradine): diff --git a/pyasic/miners/auradine/flux/AT/AD3.py b/pyasic/miners/auradine/flux/AT/AD3.py index 650ae2aa..0e9d113a 100644 --- a/pyasic/miners/auradine/flux/AT/AD3.py +++ b/pyasic/miners/auradine/flux/AT/AD3.py @@ -1,5 +1,5 @@ from pyasic.miners.backends import Auradine -from pyasic.miners.types import AuradineAD3500 +from pyasic.miners.models import AuradineAD3500 class AuradineFluxAD3500(AuradineAD3500, Auradine): diff --git a/pyasic/miners/avalonminer/cgminer/A10X/A1026.py b/pyasic/miners/avalonminer/cgminer/A10X/A1026.py index 15e25e7d..613f8d2f 100644 --- a/pyasic/miners/avalonminer/cgminer/A10X/A1026.py +++ b/pyasic/miners/avalonminer/cgminer/A10X/A1026.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import AvalonMiner -from pyasic.miners.types import Avalon1026 +from pyasic.miners.models import Avalon1026 class CGMinerAvalon1026(AvalonMiner, Avalon1026): diff --git a/pyasic/miners/avalonminer/cgminer/A10X/A1047.py b/pyasic/miners/avalonminer/cgminer/A10X/A1047.py index 4964a0da..77488f41 100644 --- a/pyasic/miners/avalonminer/cgminer/A10X/A1047.py +++ b/pyasic/miners/avalonminer/cgminer/A10X/A1047.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import AvalonMiner -from pyasic.miners.types import Avalon1047 +from pyasic.miners.models import Avalon1047 class CGMinerAvalon1047(AvalonMiner, Avalon1047): diff --git a/pyasic/miners/avalonminer/cgminer/A10X/A1066.py b/pyasic/miners/avalonminer/cgminer/A10X/A1066.py index f45f1230..2591feff 100644 --- a/pyasic/miners/avalonminer/cgminer/A10X/A1066.py +++ b/pyasic/miners/avalonminer/cgminer/A10X/A1066.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import AvalonMiner -from pyasic.miners.types import Avalon1066 +from pyasic.miners.models import Avalon1066 class CGMinerAvalon1066(AvalonMiner, Avalon1066): diff --git a/pyasic/miners/avalonminer/cgminer/A11X/A1166.py b/pyasic/miners/avalonminer/cgminer/A11X/A1166.py index b912ea02..14642696 100644 --- a/pyasic/miners/avalonminer/cgminer/A11X/A1166.py +++ b/pyasic/miners/avalonminer/cgminer/A11X/A1166.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import AvalonMiner -from pyasic.miners.types import Avalon1166Pro +from pyasic.miners.models import Avalon1166Pro class CGMinerAvalon1166Pro(AvalonMiner, Avalon1166Pro): diff --git a/pyasic/miners/avalonminer/cgminer/A12X/A1246.py b/pyasic/miners/avalonminer/cgminer/A12X/A1246.py index 088e8be1..cbbe55a4 100644 --- a/pyasic/miners/avalonminer/cgminer/A12X/A1246.py +++ b/pyasic/miners/avalonminer/cgminer/A12X/A1246.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import AvalonMiner -from pyasic.miners.types import Avalon1246 +from pyasic.miners.models import Avalon1246 class CGMinerAvalon1246(AvalonMiner, Avalon1246): diff --git a/pyasic/miners/avalonminer/cgminer/A7X/A721.py b/pyasic/miners/avalonminer/cgminer/A7X/A721.py index 8b4d414c..27d029bb 100644 --- a/pyasic/miners/avalonminer/cgminer/A7X/A721.py +++ b/pyasic/miners/avalonminer/cgminer/A7X/A721.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import AvalonMiner -from pyasic.miners.types import Avalon721 +from pyasic.miners.models import Avalon721 class CGMinerAvalon721(AvalonMiner, Avalon721): diff --git a/pyasic/miners/avalonminer/cgminer/A7X/A741.py b/pyasic/miners/avalonminer/cgminer/A7X/A741.py index 9fd0309b..7c7af22f 100644 --- a/pyasic/miners/avalonminer/cgminer/A7X/A741.py +++ b/pyasic/miners/avalonminer/cgminer/A7X/A741.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import AvalonMiner -from pyasic.miners.types import Avalon741 +from pyasic.miners.models import Avalon741 class CGMinerAvalon741(AvalonMiner, Avalon741): diff --git a/pyasic/miners/avalonminer/cgminer/A7X/A761.py b/pyasic/miners/avalonminer/cgminer/A7X/A761.py index 7c612662..e0eebcdb 100644 --- a/pyasic/miners/avalonminer/cgminer/A7X/A761.py +++ b/pyasic/miners/avalonminer/cgminer/A7X/A761.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import AvalonMiner -from pyasic.miners.types import Avalon761 +from pyasic.miners.models import Avalon761 class CGMinerAvalon761(AvalonMiner, Avalon761): diff --git a/pyasic/miners/avalonminer/cgminer/A8X/A821.py b/pyasic/miners/avalonminer/cgminer/A8X/A821.py index 18af2b70..c644d665 100644 --- a/pyasic/miners/avalonminer/cgminer/A8X/A821.py +++ b/pyasic/miners/avalonminer/cgminer/A8X/A821.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import AvalonMiner -from pyasic.miners.types import Avalon821 +from pyasic.miners.models import Avalon821 class CGMinerAvalon821(AvalonMiner, Avalon821): diff --git a/pyasic/miners/avalonminer/cgminer/A8X/A841.py b/pyasic/miners/avalonminer/cgminer/A8X/A841.py index cc218914..0293ce09 100644 --- a/pyasic/miners/avalonminer/cgminer/A8X/A841.py +++ b/pyasic/miners/avalonminer/cgminer/A8X/A841.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import AvalonMiner -from pyasic.miners.types import Avalon841 +from pyasic.miners.models import Avalon841 class CGMinerAvalon841(AvalonMiner, Avalon841): diff --git a/pyasic/miners/avalonminer/cgminer/A8X/A851.py b/pyasic/miners/avalonminer/cgminer/A8X/A851.py index e65e4500..05f7ac35 100644 --- a/pyasic/miners/avalonminer/cgminer/A8X/A851.py +++ b/pyasic/miners/avalonminer/cgminer/A8X/A851.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import AvalonMiner -from pyasic.miners.types import Avalon851 +from pyasic.miners.models import Avalon851 class CGMinerAvalon851(AvalonMiner, Avalon851): diff --git a/pyasic/miners/avalonminer/cgminer/A9X/A921.py b/pyasic/miners/avalonminer/cgminer/A9X/A921.py index dbc26dfc..b513d89f 100644 --- a/pyasic/miners/avalonminer/cgminer/A9X/A921.py +++ b/pyasic/miners/avalonminer/cgminer/A9X/A921.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import AvalonMiner -from pyasic.miners.types import Avalon921 +from pyasic.miners.models import Avalon921 class CGMinerAvalon921(AvalonMiner, Avalon921): diff --git a/pyasic/miners/backends/antminer.py b/pyasic/miners/backends/antminer.py index 7d321316..20916e72 100644 --- a/pyasic/miners/backends/antminer.py +++ b/pyasic/miners/backends/antminer.py @@ -19,16 +19,16 @@ from typing import List, Optional, Union from pyasic.config import MinerConfig, MiningModeConfig from pyasic.data import Fan, HashBoard from pyasic.data.error_codes import MinerErrorData, X19Error +from pyasic.errors import APIError from pyasic.miners.backends.bmminer import BMMiner from pyasic.miners.backends.cgminer import CGMiner -from pyasic.miners.base import ( +from pyasic.miners.data import ( DataFunction, DataLocations, DataOptions, RPCAPICommand, WebAPICommand, ) -from pyasic.rpc import APIError from pyasic.ssh.antminer import AntminerModernSSH from pyasic.web.antminer import AntminerModernWebAPI, AntminerOldWebAPI diff --git a/pyasic/miners/backends/auradine.py b/pyasic/miners/backends/auradine.py index d84d5763..3be33724 100644 --- a/pyasic/miners/backends/auradine.py +++ b/pyasic/miners/backends/auradine.py @@ -17,10 +17,11 @@ import logging from enum import Enum from typing import List, Optional -from pyasic import APIError, MinerConfig +from pyasic.config import MinerConfig from pyasic.data import Fan, HashBoard -from pyasic.miners.base import ( - BaseMiner, +from pyasic.errors import APIError +from pyasic.miners.base import BaseMiner +from pyasic.miners.data import ( DataFunction, DataLocations, DataOptions, @@ -28,7 +29,7 @@ from pyasic.miners.base import ( WebAPICommand, ) from pyasic.rpc.gcminer import GCMinerRPCAPI -from pyasic.web.auradine import FluxWebAPI +from pyasic.web.auradine import AuradineWebAPI AURADINE_DATA_LOC = DataLocations( **{ @@ -117,8 +118,8 @@ class Auradine(BaseMiner): _api_cls = GCMinerRPCAPI api: GCMinerRPCAPI - _web_cls = FluxWebAPI - web: FluxWebAPI + _web_cls = AuradineWebAPI + web: AuradineWebAPI data_locations = AURADINE_DATA_LOC diff --git a/pyasic/miners/backends/avalonminer.py b/pyasic/miners/backends/avalonminer.py index ecfea159..994d9eb9 100644 --- a/pyasic/miners/backends/avalonminer.py +++ b/pyasic/miners/backends/avalonminer.py @@ -20,7 +20,7 @@ from typing import List, Optional from pyasic.data import Fan, HashBoard from pyasic.errors import APIError from pyasic.miners.backends.cgminer import CGMiner -from pyasic.miners.base import DataFunction, DataLocations, DataOptions, RPCAPICommand +from pyasic.miners.data import DataFunction, DataLocations, DataOptions, RPCAPICommand AVALON_DATA_LOC = DataLocations( **{ diff --git a/pyasic/miners/backends/bfgminer.py b/pyasic/miners/backends/bfgminer.py index 15d8d90b..9d26216e 100644 --- a/pyasic/miners/backends/bfgminer.py +++ b/pyasic/miners/backends/bfgminer.py @@ -19,13 +19,8 @@ from typing import List, Optional from pyasic.config import MinerConfig from pyasic.data import Fan, HashBoard from pyasic.errors import APIError -from pyasic.miners.base import ( - BaseMiner, - DataFunction, - DataLocations, - DataOptions, - RPCAPICommand, -) +from pyasic.miners.base import BaseMiner +from pyasic.miners.data import DataFunction, DataLocations, DataOptions, RPCAPICommand from pyasic.rpc.bfgminer import BFGMinerRPCAPI BFGMINER_DATA_LOC = DataLocations( diff --git a/pyasic/miners/backends/bmminer.py b/pyasic/miners/backends/bmminer.py index 11c692ae..d305ea77 100644 --- a/pyasic/miners/backends/bmminer.py +++ b/pyasic/miners/backends/bmminer.py @@ -19,13 +19,8 @@ from typing import List, Optional from pyasic.config import MinerConfig from pyasic.data import Fan, HashBoard from pyasic.errors import APIError -from pyasic.miners.base import ( - BaseMiner, - DataFunction, - DataLocations, - DataOptions, - RPCAPICommand, -) +from pyasic.miners.base import BaseMiner +from pyasic.miners.data import DataFunction, DataLocations, DataOptions, RPCAPICommand from pyasic.rpc.bmminer import BMMinerRPCAPI BMMINER_DATA_LOC = DataLocations( diff --git a/pyasic/miners/backends/braiins_os.py b/pyasic/miners/backends/braiins_os.py index 4a6efd64..736f0f3d 100644 --- a/pyasic/miners/backends/braiins_os.py +++ b/pyasic/miners/backends/braiins_os.py @@ -24,8 +24,8 @@ from pyasic.config.mining import MiningModePowerTune from pyasic.data import Fan, HashBoard from pyasic.data.error_codes import BraiinsOSError, MinerErrorData from pyasic.errors import APIError -from pyasic.miners.base import ( - BaseMiner, +from pyasic.miners.base import BaseMiner +from pyasic.miners.data import ( DataFunction, DataLocations, DataOptions, diff --git a/pyasic/miners/backends/btminer.py b/pyasic/miners/backends/btminer.py index 2dbc69ef..25dde5d2 100644 --- a/pyasic/miners/backends/btminer.py +++ b/pyasic/miners/backends/btminer.py @@ -21,13 +21,8 @@ from pyasic.config import MinerConfig, MiningModeConfig from pyasic.data import Fan, HashBoard from pyasic.data.error_codes import MinerErrorData, WhatsminerError from pyasic.errors import APIError -from pyasic.miners.base import ( - BaseMiner, - DataFunction, - DataLocations, - DataOptions, - RPCAPICommand, -) +from pyasic.miners.base import BaseMiner +from pyasic.miners.data import DataFunction, DataLocations, DataOptions, RPCAPICommand from pyasic.rpc.btminer import BTMinerRPCAPI BTMINER_DATA_LOC = DataLocations( diff --git a/pyasic/miners/backends/cgminer.py b/pyasic/miners/backends/cgminer.py index acfd9a39..a38d5073 100644 --- a/pyasic/miners/backends/cgminer.py +++ b/pyasic/miners/backends/cgminer.py @@ -18,13 +18,8 @@ from typing import Optional from pyasic.config import MinerConfig from pyasic.errors import APIError -from pyasic.miners.base import ( - BaseMiner, - DataFunction, - DataLocations, - DataOptions, - RPCAPICommand, -) +from pyasic.miners.base import BaseMiner +from pyasic.miners.data import DataFunction, DataLocations, DataOptions, RPCAPICommand from pyasic.rpc.cgminer import CGMinerRPCAPI CGMINER_DATA_LOC = DataLocations( diff --git a/pyasic/miners/backends/epic.py b/pyasic/miners/backends/epic.py index 16b8d79c..e4621b35 100644 --- a/pyasic/miners/backends/epic.py +++ b/pyasic/miners/backends/epic.py @@ -21,13 +21,8 @@ from pyasic.data import Fan, HashBoard from pyasic.data.error_codes import MinerErrorData, X19Error from pyasic.errors import APIError from pyasic.logger import logger -from pyasic.miners.base import ( - BaseMiner, - DataFunction, - DataLocations, - DataOptions, - WebAPICommand, -) +from pyasic.miners.base import BaseMiner +from pyasic.miners.data import DataFunction, DataLocations, DataOptions, WebAPICommand from pyasic.web.epic import ePICWebAPI EPIC_DATA_LOC = DataLocations( diff --git a/pyasic/miners/backends/goldshell.py b/pyasic/miners/backends/goldshell.py index 3356eba1..d17ee38a 100644 --- a/pyasic/miners/backends/goldshell.py +++ b/pyasic/miners/backends/goldshell.py @@ -20,7 +20,7 @@ from pyasic.data import HashBoard from pyasic.errors import APIError from pyasic.logger import logger from pyasic.miners.backends import BFGMiner -from pyasic.miners.base import ( +from pyasic.miners.data import ( DataFunction, DataLocations, DataOptions, diff --git a/pyasic/miners/backends/innosilicon.py b/pyasic/miners/backends/innosilicon.py index 4ef2f024..648378b6 100644 --- a/pyasic/miners/backends/innosilicon.py +++ b/pyasic/miners/backends/innosilicon.py @@ -21,7 +21,7 @@ from pyasic.data.error_codes import MinerErrorData from pyasic.data.error_codes.innosilicon import InnosiliconError from pyasic.errors import APIError from pyasic.miners.backends import CGMiner -from pyasic.miners.base import ( +from pyasic.miners.data import ( DataFunction, DataLocations, DataOptions, diff --git a/pyasic/miners/backends/luxminer.py b/pyasic/miners/backends/luxminer.py index da0fe274..aff8303c 100644 --- a/pyasic/miners/backends/luxminer.py +++ b/pyasic/miners/backends/luxminer.py @@ -18,13 +18,8 @@ from typing import List, Optional from pyasic.config import MinerConfig from pyasic.data import Fan, HashBoard from pyasic.errors import APIError -from pyasic.miners.base import ( - BaseMiner, - DataFunction, - DataLocations, - DataOptions, - RPCAPICommand, -) +from pyasic.miners.base import BaseMiner +from pyasic.miners.data import DataFunction, DataLocations, DataOptions, RPCAPICommand from pyasic.rpc.luxminer import LUXMinerRPCAPI LUXMINER_DATA_LOC = DataLocations( diff --git a/pyasic/miners/unknown.py b/pyasic/miners/backends/unknown.py similarity index 79% rename from pyasic/miners/unknown.py rename to pyasic/miners/backends/unknown.py index 2a112018..a74ae984 100644 --- a/pyasic/miners/unknown.py +++ b/pyasic/miners/backends/unknown.py @@ -1,18 +1,16 @@ -# ------------------------------------------------------------------------------ -# Copyright 2022 Upstream Data Inc - -# - -# Licensed under the Apache License, Version 2.0 (the "License"); - -# you may not use this file except in compliance with the License. - -# You may obtain a copy of the License at - -# - -# http://www.apache.org/licenses/LICENSE-2.0 - -# - -# Unless required by applicable law or agreed to in writing, software - -# distributed under the License is distributed on an "AS IS" BASIS, - -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -# See the License for the specific language governing permissions and - -# limitations under the License. - -# ------------------------------------------------------------------------------ +# Copyright 2022 Upstream Data Inc +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. from typing import List, Optional, Tuple diff --git a/pyasic/miners/backends/vnish.py b/pyasic/miners/backends/vnish.py index d1e1f757..959e66cd 100644 --- a/pyasic/miners/backends/vnish.py +++ b/pyasic/miners/backends/vnish.py @@ -19,7 +19,7 @@ from typing import Optional from pyasic import MinerConfig from pyasic.errors import APIError from pyasic.miners.backends.bmminer import BMMiner -from pyasic.miners.base import ( +from pyasic.miners.data import ( DataFunction, DataLocations, DataOptions, diff --git a/pyasic/miners/base.py b/pyasic/miners/base.py index 8d2588f8..3ca549c2 100644 --- a/pyasic/miners/base.py +++ b/pyasic/miners/base.py @@ -16,8 +16,6 @@ import asyncio import ipaddress import warnings -from dataclasses import dataclass, field, make_dataclass -from enum import Enum from typing import List, Optional, Protocol, Tuple, Type, TypeVar, Union from pyasic.config import MinerConfig @@ -25,79 +23,7 @@ from pyasic.data import Fan, HashBoard, MinerData from pyasic.data.error_codes import MinerErrorData from pyasic.errors import APIError from pyasic.logger import logger - - -class DataOptions(Enum): - MAC = "mac" - API_VERSION = "api_ver" - FW_VERSION = "fw_ver" - HOSTNAME = "hostname" - HASHRATE = "hashrate" - EXPECTED_HASHRATE = "expected_hashrate" - HASHBOARDS = "hashboards" - ENVIRONMENT_TEMP = "env_temp" - WATTAGE = "wattage" - WATTAGE_LIMIT = "wattage_limit" - FANS = "fans" - FAN_PSU = "fan_psu" - ERRORS = "errors" - FAULT_LIGHT = "fault_light" - IS_MINING = "is_mining" - UPTIME = "uptime" - CONFIG = "config" - - def __str__(self): - return self.value - - def default_command(self): - if str(self.value) == "config": - return "get_config" - elif str(self.value) == "is_mining": - return "_is_mining" - else: - return f"_get_{str(self.value)}" - - -@dataclass -class RPCAPICommand: - name: str - cmd: str - - -@dataclass -class WebAPICommand: - name: str - cmd: str - - -@dataclass -class GRPCCommand(WebAPICommand): - name: str - cmd: str - - -@dataclass -class DataFunction: - cmd: str - kwargs: List[Union[RPCAPICommand, WebAPICommand, GRPCCommand]] = field( - default_factory=list - ) - - def __call__(self, *args, **kwargs): - return self - - -DataLocations = make_dataclass( - "DataLocations", - [ - ( - enum_value.value, - DataFunction, - field(default_factory=DataFunction(enum_value.default_command())), - ) - for enum_value in DataOptions - ], -) +from pyasic.miners.data import DataLocations, DataOptions, RPCAPICommand, WebAPICommand class MinerProtocol(Protocol): diff --git a/pyasic/miners/data.py b/pyasic/miners/data.py new file mode 100644 index 00000000..a21ccd16 --- /dev/null +++ b/pyasic/miners/data.py @@ -0,0 +1,84 @@ +# ------------------------------------------------------------------------------ +# Copyright 2022 Upstream Data Inc - +# - +# Licensed under the Apache License, Version 2.0 (the "License"); - +# you may not use this file except in compliance with the License. - +# You may obtain a copy of the License at - +# - +# http://www.apache.org/licenses/LICENSE-2.0 - +# - +# Unless required by applicable law or agreed to in writing, software - +# distributed under the License is distributed on an "AS IS" BASIS, - +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - +# See the License for the specific language governing permissions and - +# limitations under the License. - +# ------------------------------------------------------------------------------ + +from dataclasses import dataclass, field, make_dataclass +from enum import Enum +from typing import List, Union + + +class DataOptions(Enum): + MAC = "mac" + API_VERSION = "api_ver" + FW_VERSION = "fw_ver" + HOSTNAME = "hostname" + HASHRATE = "hashrate" + EXPECTED_HASHRATE = "expected_hashrate" + HASHBOARDS = "hashboards" + ENVIRONMENT_TEMP = "env_temp" + WATTAGE = "wattage" + WATTAGE_LIMIT = "wattage_limit" + FANS = "fans" + FAN_PSU = "fan_psu" + ERRORS = "errors" + FAULT_LIGHT = "fault_light" + IS_MINING = "is_mining" + UPTIME = "uptime" + CONFIG = "config" + + def __str__(self): + return self.value + + def default_command(self): + if str(self.value) == "config": + return "get_config" + elif str(self.value) == "is_mining": + return "_is_mining" + else: + return f"_get_{str(self.value)}" + + +@dataclass +class RPCAPICommand: + name: str + cmd: str + + +@dataclass +class WebAPICommand: + name: str + cmd: str + + +@dataclass +class DataFunction: + cmd: str + kwargs: List[Union[RPCAPICommand, WebAPICommand]] = field(default_factory=list) + + def __call__(self, *args, **kwargs): + return self + + +DataLocations = make_dataclass( + "DataLocations", + [ + ( + enum_value.value, + DataFunction, + field(default_factory=DataFunction(enum_value.default_command())), + ) + for enum_value in DataOptions + ], +) diff --git a/pyasic/miners/miner_factory.py b/pyasic/miners/factory.py similarity index 99% rename from pyasic/miners/miner_factory.py rename to pyasic/miners/factory.py index 0a64cd26..e6648c26 100644 --- a/pyasic/miners/miner_factory.py +++ b/pyasic/miners/factory.py @@ -25,6 +25,7 @@ import httpx from pyasic import settings from pyasic.logger import logger +from pyasic.miners import AnyMiner from pyasic.miners.antminer import * from pyasic.miners.auradine import * from pyasic.miners.avalonminer import * @@ -41,10 +42,9 @@ from pyasic.miners.backends import ( VNish, ePIC, ) -from pyasic.miners.base import AnyMiner +from pyasic.miners.backends.unknown import UnknownMiner from pyasic.miners.goldshell import * from pyasic.miners.innosilicon import * -from pyasic.miners.unknown import UnknownMiner from pyasic.miners.whatsminer import * diff --git a/pyasic/miners/goldshell/bfgminer/X5/CK5.py b/pyasic/miners/goldshell/bfgminer/X5/CK5.py index 186b1149..177e5266 100644 --- a/pyasic/miners/goldshell/bfgminer/X5/CK5.py +++ b/pyasic/miners/goldshell/bfgminer/X5/CK5.py @@ -14,7 +14,7 @@ # limitations under the License. - # ------------------------------------------------------------------------------ from pyasic.miners.backends import GoldshellMiner -from pyasic.miners.types import CK5 +from pyasic.miners.models import CK5 class GoldshellCK5(GoldshellMiner, CK5): diff --git a/pyasic/miners/goldshell/bfgminer/X5/HS5.py b/pyasic/miners/goldshell/bfgminer/X5/HS5.py index 279baa3d..292b45dd 100644 --- a/pyasic/miners/goldshell/bfgminer/X5/HS5.py +++ b/pyasic/miners/goldshell/bfgminer/X5/HS5.py @@ -14,7 +14,7 @@ # limitations under the License. - # ------------------------------------------------------------------------------ from pyasic.miners.backends import GoldshellMiner -from pyasic.miners.types import HS5 +from pyasic.miners.models import HS5 class GoldshellHS5(GoldshellMiner, HS5): diff --git a/pyasic/miners/goldshell/bfgminer/X5/KD5.py b/pyasic/miners/goldshell/bfgminer/X5/KD5.py index 1c44e343..ca312aab 100644 --- a/pyasic/miners/goldshell/bfgminer/X5/KD5.py +++ b/pyasic/miners/goldshell/bfgminer/X5/KD5.py @@ -14,7 +14,7 @@ # limitations under the License. - # ------------------------------------------------------------------------------ from pyasic.miners.backends import GoldshellMiner -from pyasic.miners.types import KD5 +from pyasic.miners.models import KD5 class GoldshellKD5(GoldshellMiner, KD5): diff --git a/pyasic/miners/goldshell/bfgminer/XMax/KDMax.py b/pyasic/miners/goldshell/bfgminer/XMax/KDMax.py index 8b2d3f02..d7ed94f0 100644 --- a/pyasic/miners/goldshell/bfgminer/XMax/KDMax.py +++ b/pyasic/miners/goldshell/bfgminer/XMax/KDMax.py @@ -14,7 +14,7 @@ # limitations under the License. - # ------------------------------------------------------------------------------ from pyasic.miners.backends import GoldshellMiner -from pyasic.miners.types import KDMax +from pyasic.miners.models import KDMax class GoldshellKDMax(GoldshellMiner, KDMax): diff --git a/pyasic/miners/innosilicon/cgminer/A10X/A10X.py b/pyasic/miners/innosilicon/cgminer/A10X/A10X.py index 54394037..6f1acfa4 100644 --- a/pyasic/miners/innosilicon/cgminer/A10X/A10X.py +++ b/pyasic/miners/innosilicon/cgminer/A10X/A10X.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends.innosilicon import Innosilicon -from pyasic.miners.types import A10X +from pyasic.miners.models import A10X class InnosiliconA10X(Innosilicon, A10X): diff --git a/pyasic/miners/innosilicon/cgminer/T3X/T3H.py b/pyasic/miners/innosilicon/cgminer/T3X/T3H.py index 5e34366a..ec6a7f01 100644 --- a/pyasic/miners/innosilicon/cgminer/T3X/T3H.py +++ b/pyasic/miners/innosilicon/cgminer/T3X/T3H.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends.innosilicon import Innosilicon -from pyasic.miners.types import T3HPlus +from pyasic.miners.models import T3HPlus class InnosiliconT3HPlus(Innosilicon, T3HPlus): diff --git a/pyasic/miners/miner_listener.py b/pyasic/miners/listener.py similarity index 100% rename from pyasic/miners/miner_listener.py rename to pyasic/miners/listener.py diff --git a/pyasic/miners/makes.py b/pyasic/miners/makes/__init__.py similarity index 100% rename from pyasic/miners/makes.py rename to pyasic/miners/makes/__init__.py diff --git a/pyasic/miners/types/__init__.py b/pyasic/miners/models/__init__.py similarity index 100% rename from pyasic/miners/types/__init__.py rename to pyasic/miners/models/__init__.py diff --git a/pyasic/miners/types/antminer/X15/Z15.py b/pyasic/miners/models/antminer/X15/Z15.py similarity index 100% rename from pyasic/miners/types/antminer/X15/Z15.py rename to pyasic/miners/models/antminer/X15/Z15.py diff --git a/pyasic/miners/types/antminer/X15/__init__.py b/pyasic/miners/models/antminer/X15/__init__.py similarity index 100% rename from pyasic/miners/types/antminer/X15/__init__.py rename to pyasic/miners/models/antminer/X15/__init__.py diff --git a/pyasic/miners/types/antminer/X17/S17.py b/pyasic/miners/models/antminer/X17/S17.py similarity index 100% rename from pyasic/miners/types/antminer/X17/S17.py rename to pyasic/miners/models/antminer/X17/S17.py diff --git a/pyasic/miners/types/antminer/X17/T17.py b/pyasic/miners/models/antminer/X17/T17.py similarity index 100% rename from pyasic/miners/types/antminer/X17/T17.py rename to pyasic/miners/models/antminer/X17/T17.py diff --git a/pyasic/miners/types/antminer/X17/__init__.py b/pyasic/miners/models/antminer/X17/__init__.py similarity index 100% rename from pyasic/miners/types/antminer/X17/__init__.py rename to pyasic/miners/models/antminer/X17/__init__.py diff --git a/pyasic/miners/types/antminer/X19/S19.py b/pyasic/miners/models/antminer/X19/S19.py similarity index 100% rename from pyasic/miners/types/antminer/X19/S19.py rename to pyasic/miners/models/antminer/X19/S19.py diff --git a/pyasic/miners/types/antminer/X19/T19.py b/pyasic/miners/models/antminer/X19/T19.py similarity index 100% rename from pyasic/miners/types/antminer/X19/T19.py rename to pyasic/miners/models/antminer/X19/T19.py diff --git a/pyasic/miners/types/antminer/X19/__init__.py b/pyasic/miners/models/antminer/X19/__init__.py similarity index 100% rename from pyasic/miners/types/antminer/X19/__init__.py rename to pyasic/miners/models/antminer/X19/__init__.py diff --git a/pyasic/miners/types/antminer/X3/D3.py b/pyasic/miners/models/antminer/X3/D3.py similarity index 100% rename from pyasic/miners/types/antminer/X3/D3.py rename to pyasic/miners/models/antminer/X3/D3.py diff --git a/pyasic/miners/types/antminer/X3/HS3.py b/pyasic/miners/models/antminer/X3/HS3.py similarity index 100% rename from pyasic/miners/types/antminer/X3/HS3.py rename to pyasic/miners/models/antminer/X3/HS3.py diff --git a/pyasic/miners/types/antminer/X3/L3.py b/pyasic/miners/models/antminer/X3/L3.py similarity index 100% rename from pyasic/miners/types/antminer/X3/L3.py rename to pyasic/miners/models/antminer/X3/L3.py diff --git a/pyasic/miners/types/antminer/X3/__init__.py b/pyasic/miners/models/antminer/X3/__init__.py similarity index 100% rename from pyasic/miners/types/antminer/X3/__init__.py rename to pyasic/miners/models/antminer/X3/__init__.py diff --git a/pyasic/miners/types/antminer/X5/DR5.py b/pyasic/miners/models/antminer/X5/DR5.py similarity index 100% rename from pyasic/miners/types/antminer/X5/DR5.py rename to pyasic/miners/models/antminer/X5/DR5.py diff --git a/pyasic/miners/types/antminer/X5/__init__.py b/pyasic/miners/models/antminer/X5/__init__.py similarity index 100% rename from pyasic/miners/types/antminer/X5/__init__.py rename to pyasic/miners/models/antminer/X5/__init__.py diff --git a/pyasic/miners/types/antminer/X7/L7.py b/pyasic/miners/models/antminer/X7/L7.py similarity index 100% rename from pyasic/miners/types/antminer/X7/L7.py rename to pyasic/miners/models/antminer/X7/L7.py diff --git a/pyasic/miners/types/antminer/X7/__init__.py b/pyasic/miners/models/antminer/X7/__init__.py similarity index 100% rename from pyasic/miners/types/antminer/X7/__init__.py rename to pyasic/miners/models/antminer/X7/__init__.py diff --git a/pyasic/miners/types/antminer/X9/E9.py b/pyasic/miners/models/antminer/X9/E9.py similarity index 100% rename from pyasic/miners/types/antminer/X9/E9.py rename to pyasic/miners/models/antminer/X9/E9.py diff --git a/pyasic/miners/types/antminer/X9/S9.py b/pyasic/miners/models/antminer/X9/S9.py similarity index 100% rename from pyasic/miners/types/antminer/X9/S9.py rename to pyasic/miners/models/antminer/X9/S9.py diff --git a/pyasic/miners/types/antminer/X9/T9.py b/pyasic/miners/models/antminer/X9/T9.py similarity index 100% rename from pyasic/miners/types/antminer/X9/T9.py rename to pyasic/miners/models/antminer/X9/T9.py diff --git a/pyasic/miners/types/antminer/X9/__init__.py b/pyasic/miners/models/antminer/X9/__init__.py similarity index 100% rename from pyasic/miners/types/antminer/X9/__init__.py rename to pyasic/miners/models/antminer/X9/__init__.py diff --git a/pyasic/miners/types/antminer/__init__.py b/pyasic/miners/models/antminer/__init__.py similarity index 100% rename from pyasic/miners/types/antminer/__init__.py rename to pyasic/miners/models/antminer/__init__.py diff --git a/pyasic/miners/types/auradine/AD/AD2.py b/pyasic/miners/models/auradine/AD/AD2.py similarity index 100% rename from pyasic/miners/types/auradine/AD/AD2.py rename to pyasic/miners/models/auradine/AD/AD2.py diff --git a/pyasic/miners/types/auradine/AD/AD3.py b/pyasic/miners/models/auradine/AD/AD3.py similarity index 100% rename from pyasic/miners/types/auradine/AD/AD3.py rename to pyasic/miners/models/auradine/AD/AD3.py diff --git a/pyasic/miners/types/auradine/AD/__init__.py b/pyasic/miners/models/auradine/AD/__init__.py similarity index 100% rename from pyasic/miners/types/auradine/AD/__init__.py rename to pyasic/miners/models/auradine/AD/__init__.py diff --git a/pyasic/miners/types/auradine/AI/AI2.py b/pyasic/miners/models/auradine/AI/AI2.py similarity index 100% rename from pyasic/miners/types/auradine/AI/AI2.py rename to pyasic/miners/models/auradine/AI/AI2.py diff --git a/pyasic/miners/types/auradine/AI/AI3.py b/pyasic/miners/models/auradine/AI/AI3.py similarity index 100% rename from pyasic/miners/types/auradine/AI/AI3.py rename to pyasic/miners/models/auradine/AI/AI3.py diff --git a/pyasic/miners/types/auradine/AI/__init__.py b/pyasic/miners/models/auradine/AI/__init__.py similarity index 100% rename from pyasic/miners/types/auradine/AI/__init__.py rename to pyasic/miners/models/auradine/AI/__init__.py diff --git a/pyasic/miners/types/auradine/AT/AT1.py b/pyasic/miners/models/auradine/AT/AT1.py similarity index 100% rename from pyasic/miners/types/auradine/AT/AT1.py rename to pyasic/miners/models/auradine/AT/AT1.py diff --git a/pyasic/miners/types/auradine/AT/AT2.py b/pyasic/miners/models/auradine/AT/AT2.py similarity index 100% rename from pyasic/miners/types/auradine/AT/AT2.py rename to pyasic/miners/models/auradine/AT/AT2.py diff --git a/pyasic/miners/types/auradine/AT/__init__.py b/pyasic/miners/models/auradine/AT/__init__.py similarity index 100% rename from pyasic/miners/types/auradine/AT/__init__.py rename to pyasic/miners/models/auradine/AT/__init__.py diff --git a/pyasic/miners/types/auradine/__init__.py b/pyasic/miners/models/auradine/__init__.py similarity index 100% rename from pyasic/miners/types/auradine/__init__.py rename to pyasic/miners/models/auradine/__init__.py diff --git a/pyasic/miners/types/avalonminer/A10X/A1026.py b/pyasic/miners/models/avalonminer/A10X/A1026.py similarity index 100% rename from pyasic/miners/types/avalonminer/A10X/A1026.py rename to pyasic/miners/models/avalonminer/A10X/A1026.py diff --git a/pyasic/miners/types/avalonminer/A10X/A1047.py b/pyasic/miners/models/avalonminer/A10X/A1047.py similarity index 100% rename from pyasic/miners/types/avalonminer/A10X/A1047.py rename to pyasic/miners/models/avalonminer/A10X/A1047.py diff --git a/pyasic/miners/types/avalonminer/A10X/A1066.py b/pyasic/miners/models/avalonminer/A10X/A1066.py similarity index 100% rename from pyasic/miners/types/avalonminer/A10X/A1066.py rename to pyasic/miners/models/avalonminer/A10X/A1066.py diff --git a/pyasic/miners/types/avalonminer/A10X/__init__.py b/pyasic/miners/models/avalonminer/A10X/__init__.py similarity index 100% rename from pyasic/miners/types/avalonminer/A10X/__init__.py rename to pyasic/miners/models/avalonminer/A10X/__init__.py diff --git a/pyasic/miners/types/avalonminer/A11X/A1166.py b/pyasic/miners/models/avalonminer/A11X/A1166.py similarity index 100% rename from pyasic/miners/types/avalonminer/A11X/A1166.py rename to pyasic/miners/models/avalonminer/A11X/A1166.py diff --git a/pyasic/miners/types/avalonminer/A11X/__init__.py b/pyasic/miners/models/avalonminer/A11X/__init__.py similarity index 100% rename from pyasic/miners/types/avalonminer/A11X/__init__.py rename to pyasic/miners/models/avalonminer/A11X/__init__.py diff --git a/pyasic/miners/types/avalonminer/A12X/A1246.py b/pyasic/miners/models/avalonminer/A12X/A1246.py similarity index 100% rename from pyasic/miners/types/avalonminer/A12X/A1246.py rename to pyasic/miners/models/avalonminer/A12X/A1246.py diff --git a/pyasic/miners/types/avalonminer/A12X/__init__.py b/pyasic/miners/models/avalonminer/A12X/__init__.py similarity index 100% rename from pyasic/miners/types/avalonminer/A12X/__init__.py rename to pyasic/miners/models/avalonminer/A12X/__init__.py diff --git a/pyasic/miners/types/avalonminer/A7X/A721.py b/pyasic/miners/models/avalonminer/A7X/A721.py similarity index 100% rename from pyasic/miners/types/avalonminer/A7X/A721.py rename to pyasic/miners/models/avalonminer/A7X/A721.py diff --git a/pyasic/miners/types/avalonminer/A7X/A741.py b/pyasic/miners/models/avalonminer/A7X/A741.py similarity index 100% rename from pyasic/miners/types/avalonminer/A7X/A741.py rename to pyasic/miners/models/avalonminer/A7X/A741.py diff --git a/pyasic/miners/types/avalonminer/A7X/A761.py b/pyasic/miners/models/avalonminer/A7X/A761.py similarity index 100% rename from pyasic/miners/types/avalonminer/A7X/A761.py rename to pyasic/miners/models/avalonminer/A7X/A761.py diff --git a/pyasic/miners/types/avalonminer/A7X/__init__.py b/pyasic/miners/models/avalonminer/A7X/__init__.py similarity index 100% rename from pyasic/miners/types/avalonminer/A7X/__init__.py rename to pyasic/miners/models/avalonminer/A7X/__init__.py diff --git a/pyasic/miners/types/avalonminer/A8X/A821.py b/pyasic/miners/models/avalonminer/A8X/A821.py similarity index 100% rename from pyasic/miners/types/avalonminer/A8X/A821.py rename to pyasic/miners/models/avalonminer/A8X/A821.py diff --git a/pyasic/miners/types/avalonminer/A8X/A841.py b/pyasic/miners/models/avalonminer/A8X/A841.py similarity index 100% rename from pyasic/miners/types/avalonminer/A8X/A841.py rename to pyasic/miners/models/avalonminer/A8X/A841.py diff --git a/pyasic/miners/types/avalonminer/A8X/A851.py b/pyasic/miners/models/avalonminer/A8X/A851.py similarity index 100% rename from pyasic/miners/types/avalonminer/A8X/A851.py rename to pyasic/miners/models/avalonminer/A8X/A851.py diff --git a/pyasic/miners/types/avalonminer/A8X/__init__.py b/pyasic/miners/models/avalonminer/A8X/__init__.py similarity index 100% rename from pyasic/miners/types/avalonminer/A8X/__init__.py rename to pyasic/miners/models/avalonminer/A8X/__init__.py diff --git a/pyasic/miners/types/avalonminer/A9X/A921.py b/pyasic/miners/models/avalonminer/A9X/A921.py similarity index 100% rename from pyasic/miners/types/avalonminer/A9X/A921.py rename to pyasic/miners/models/avalonminer/A9X/A921.py diff --git a/pyasic/miners/types/avalonminer/A9X/__init__.py b/pyasic/miners/models/avalonminer/A9X/__init__.py similarity index 100% rename from pyasic/miners/types/avalonminer/A9X/__init__.py rename to pyasic/miners/models/avalonminer/A9X/__init__.py diff --git a/pyasic/miners/types/avalonminer/__init__.py b/pyasic/miners/models/avalonminer/__init__.py similarity index 100% rename from pyasic/miners/types/avalonminer/__init__.py rename to pyasic/miners/models/avalonminer/__init__.py diff --git a/pyasic/miners/types/goldshell/X5/CK5.py b/pyasic/miners/models/goldshell/X5/CK5.py similarity index 100% rename from pyasic/miners/types/goldshell/X5/CK5.py rename to pyasic/miners/models/goldshell/X5/CK5.py diff --git a/pyasic/miners/types/goldshell/X5/HS5.py b/pyasic/miners/models/goldshell/X5/HS5.py similarity index 100% rename from pyasic/miners/types/goldshell/X5/HS5.py rename to pyasic/miners/models/goldshell/X5/HS5.py diff --git a/pyasic/miners/types/goldshell/X5/KD5.py b/pyasic/miners/models/goldshell/X5/KD5.py similarity index 100% rename from pyasic/miners/types/goldshell/X5/KD5.py rename to pyasic/miners/models/goldshell/X5/KD5.py diff --git a/pyasic/miners/types/goldshell/X5/__init__.py b/pyasic/miners/models/goldshell/X5/__init__.py similarity index 100% rename from pyasic/miners/types/goldshell/X5/__init__.py rename to pyasic/miners/models/goldshell/X5/__init__.py diff --git a/pyasic/miners/types/goldshell/XMax/KDMax.py b/pyasic/miners/models/goldshell/XMax/KDMax.py similarity index 100% rename from pyasic/miners/types/goldshell/XMax/KDMax.py rename to pyasic/miners/models/goldshell/XMax/KDMax.py diff --git a/pyasic/miners/types/goldshell/XMax/__init__.py b/pyasic/miners/models/goldshell/XMax/__init__.py similarity index 100% rename from pyasic/miners/types/goldshell/XMax/__init__.py rename to pyasic/miners/models/goldshell/XMax/__init__.py diff --git a/pyasic/miners/types/goldshell/__init__.py b/pyasic/miners/models/goldshell/__init__.py similarity index 100% rename from pyasic/miners/types/goldshell/__init__.py rename to pyasic/miners/models/goldshell/__init__.py diff --git a/pyasic/miners/types/innosilicon/A10X/A10X.py b/pyasic/miners/models/innosilicon/A10X/A10X.py similarity index 100% rename from pyasic/miners/types/innosilicon/A10X/A10X.py rename to pyasic/miners/models/innosilicon/A10X/A10X.py diff --git a/pyasic/miners/types/innosilicon/A10X/__init__.py b/pyasic/miners/models/innosilicon/A10X/__init__.py similarity index 100% rename from pyasic/miners/types/innosilicon/A10X/__init__.py rename to pyasic/miners/models/innosilicon/A10X/__init__.py diff --git a/pyasic/miners/types/innosilicon/T3X/T3H.py b/pyasic/miners/models/innosilicon/T3X/T3H.py similarity index 100% rename from pyasic/miners/types/innosilicon/T3X/T3H.py rename to pyasic/miners/models/innosilicon/T3X/T3H.py diff --git a/pyasic/miners/types/innosilicon/T3X/__init__.py b/pyasic/miners/models/innosilicon/T3X/__init__.py similarity index 100% rename from pyasic/miners/types/innosilicon/T3X/__init__.py rename to pyasic/miners/models/innosilicon/T3X/__init__.py diff --git a/pyasic/miners/types/innosilicon/__init__.py b/pyasic/miners/models/innosilicon/__init__.py similarity index 100% rename from pyasic/miners/types/innosilicon/__init__.py rename to pyasic/miners/models/innosilicon/__init__.py diff --git a/pyasic/miners/types/whatsminer/M2X/M20.py b/pyasic/miners/models/whatsminer/M2X/M20.py similarity index 100% rename from pyasic/miners/types/whatsminer/M2X/M20.py rename to pyasic/miners/models/whatsminer/M2X/M20.py diff --git a/pyasic/miners/types/whatsminer/M2X/M20P.py b/pyasic/miners/models/whatsminer/M2X/M20P.py similarity index 100% rename from pyasic/miners/types/whatsminer/M2X/M20P.py rename to pyasic/miners/models/whatsminer/M2X/M20P.py diff --git a/pyasic/miners/types/whatsminer/M2X/M20S.py b/pyasic/miners/models/whatsminer/M2X/M20S.py similarity index 100% rename from pyasic/miners/types/whatsminer/M2X/M20S.py rename to pyasic/miners/models/whatsminer/M2X/M20S.py diff --git a/pyasic/miners/types/whatsminer/M2X/M20S_Plus.py b/pyasic/miners/models/whatsminer/M2X/M20S_Plus.py similarity index 100% rename from pyasic/miners/types/whatsminer/M2X/M20S_Plus.py rename to pyasic/miners/models/whatsminer/M2X/M20S_Plus.py diff --git a/pyasic/miners/types/whatsminer/M2X/M21.py b/pyasic/miners/models/whatsminer/M2X/M21.py similarity index 100% rename from pyasic/miners/types/whatsminer/M2X/M21.py rename to pyasic/miners/models/whatsminer/M2X/M21.py diff --git a/pyasic/miners/types/whatsminer/M2X/M21S.py b/pyasic/miners/models/whatsminer/M2X/M21S.py similarity index 100% rename from pyasic/miners/types/whatsminer/M2X/M21S.py rename to pyasic/miners/models/whatsminer/M2X/M21S.py diff --git a/pyasic/miners/types/whatsminer/M2X/M21S_Plus.py b/pyasic/miners/models/whatsminer/M2X/M21S_Plus.py similarity index 100% rename from pyasic/miners/types/whatsminer/M2X/M21S_Plus.py rename to pyasic/miners/models/whatsminer/M2X/M21S_Plus.py diff --git a/pyasic/miners/types/whatsminer/M2X/M29.py b/pyasic/miners/models/whatsminer/M2X/M29.py similarity index 100% rename from pyasic/miners/types/whatsminer/M2X/M29.py rename to pyasic/miners/models/whatsminer/M2X/M29.py diff --git a/pyasic/miners/types/whatsminer/M2X/__init__.py b/pyasic/miners/models/whatsminer/M2X/__init__.py similarity index 100% rename from pyasic/miners/types/whatsminer/M2X/__init__.py rename to pyasic/miners/models/whatsminer/M2X/__init__.py diff --git a/pyasic/miners/types/whatsminer/M3X/M30.py b/pyasic/miners/models/whatsminer/M3X/M30.py similarity index 100% rename from pyasic/miners/types/whatsminer/M3X/M30.py rename to pyasic/miners/models/whatsminer/M3X/M30.py diff --git a/pyasic/miners/types/whatsminer/M3X/M30K.py b/pyasic/miners/models/whatsminer/M3X/M30K.py similarity index 100% rename from pyasic/miners/types/whatsminer/M3X/M30K.py rename to pyasic/miners/models/whatsminer/M3X/M30K.py diff --git a/pyasic/miners/types/whatsminer/M3X/M30L.py b/pyasic/miners/models/whatsminer/M3X/M30L.py similarity index 100% rename from pyasic/miners/types/whatsminer/M3X/M30L.py rename to pyasic/miners/models/whatsminer/M3X/M30L.py diff --git a/pyasic/miners/types/whatsminer/M3X/M30S.py b/pyasic/miners/models/whatsminer/M3X/M30S.py similarity index 100% rename from pyasic/miners/types/whatsminer/M3X/M30S.py rename to pyasic/miners/models/whatsminer/M3X/M30S.py diff --git a/pyasic/miners/types/whatsminer/M3X/M30S_Plus.py b/pyasic/miners/models/whatsminer/M3X/M30S_Plus.py similarity index 100% rename from pyasic/miners/types/whatsminer/M3X/M30S_Plus.py rename to pyasic/miners/models/whatsminer/M3X/M30S_Plus.py diff --git a/pyasic/miners/types/whatsminer/M3X/M30S_Plus_Plus.py b/pyasic/miners/models/whatsminer/M3X/M30S_Plus_Plus.py similarity index 100% rename from pyasic/miners/types/whatsminer/M3X/M30S_Plus_Plus.py rename to pyasic/miners/models/whatsminer/M3X/M30S_Plus_Plus.py diff --git a/pyasic/miners/types/whatsminer/M3X/M31.py b/pyasic/miners/models/whatsminer/M3X/M31.py similarity index 100% rename from pyasic/miners/types/whatsminer/M3X/M31.py rename to pyasic/miners/models/whatsminer/M3X/M31.py diff --git a/pyasic/miners/types/whatsminer/M3X/M31H.py b/pyasic/miners/models/whatsminer/M3X/M31H.py similarity index 100% rename from pyasic/miners/types/whatsminer/M3X/M31H.py rename to pyasic/miners/models/whatsminer/M3X/M31H.py diff --git a/pyasic/miners/types/whatsminer/M3X/M31L.py b/pyasic/miners/models/whatsminer/M3X/M31L.py similarity index 100% rename from pyasic/miners/types/whatsminer/M3X/M31L.py rename to pyasic/miners/models/whatsminer/M3X/M31L.py diff --git a/pyasic/miners/types/whatsminer/M3X/M31S.py b/pyasic/miners/models/whatsminer/M3X/M31S.py similarity index 100% rename from pyasic/miners/types/whatsminer/M3X/M31S.py rename to pyasic/miners/models/whatsminer/M3X/M31S.py diff --git a/pyasic/miners/types/whatsminer/M3X/M31SE.py b/pyasic/miners/models/whatsminer/M3X/M31SE.py similarity index 100% rename from pyasic/miners/types/whatsminer/M3X/M31SE.py rename to pyasic/miners/models/whatsminer/M3X/M31SE.py diff --git a/pyasic/miners/types/whatsminer/M3X/M31S_Plus.py b/pyasic/miners/models/whatsminer/M3X/M31S_Plus.py similarity index 100% rename from pyasic/miners/types/whatsminer/M3X/M31S_Plus.py rename to pyasic/miners/models/whatsminer/M3X/M31S_Plus.py diff --git a/pyasic/miners/types/whatsminer/M3X/M32.py b/pyasic/miners/models/whatsminer/M3X/M32.py similarity index 100% rename from pyasic/miners/types/whatsminer/M3X/M32.py rename to pyasic/miners/models/whatsminer/M3X/M32.py diff --git a/pyasic/miners/types/whatsminer/M3X/M32S.py b/pyasic/miners/models/whatsminer/M3X/M32S.py similarity index 100% rename from pyasic/miners/types/whatsminer/M3X/M32S.py rename to pyasic/miners/models/whatsminer/M3X/M32S.py diff --git a/pyasic/miners/types/whatsminer/M3X/M33.py b/pyasic/miners/models/whatsminer/M3X/M33.py similarity index 100% rename from pyasic/miners/types/whatsminer/M3X/M33.py rename to pyasic/miners/models/whatsminer/M3X/M33.py diff --git a/pyasic/miners/types/whatsminer/M3X/M33S.py b/pyasic/miners/models/whatsminer/M3X/M33S.py similarity index 100% rename from pyasic/miners/types/whatsminer/M3X/M33S.py rename to pyasic/miners/models/whatsminer/M3X/M33S.py diff --git a/pyasic/miners/types/whatsminer/M3X/M33S_Plus.py b/pyasic/miners/models/whatsminer/M3X/M33S_Plus.py similarity index 100% rename from pyasic/miners/types/whatsminer/M3X/M33S_Plus.py rename to pyasic/miners/models/whatsminer/M3X/M33S_Plus.py diff --git a/pyasic/miners/types/whatsminer/M3X/M33S_Plus_Plus.py b/pyasic/miners/models/whatsminer/M3X/M33S_Plus_Plus.py similarity index 100% rename from pyasic/miners/types/whatsminer/M3X/M33S_Plus_Plus.py rename to pyasic/miners/models/whatsminer/M3X/M33S_Plus_Plus.py diff --git a/pyasic/miners/types/whatsminer/M3X/M34S_Plus.py b/pyasic/miners/models/whatsminer/M3X/M34S_Plus.py similarity index 100% rename from pyasic/miners/types/whatsminer/M3X/M34S_Plus.py rename to pyasic/miners/models/whatsminer/M3X/M34S_Plus.py diff --git a/pyasic/miners/types/whatsminer/M3X/M36S.py b/pyasic/miners/models/whatsminer/M3X/M36S.py similarity index 100% rename from pyasic/miners/types/whatsminer/M3X/M36S.py rename to pyasic/miners/models/whatsminer/M3X/M36S.py diff --git a/pyasic/miners/types/whatsminer/M3X/M36S_Plus.py b/pyasic/miners/models/whatsminer/M3X/M36S_Plus.py similarity index 100% rename from pyasic/miners/types/whatsminer/M3X/M36S_Plus.py rename to pyasic/miners/models/whatsminer/M3X/M36S_Plus.py diff --git a/pyasic/miners/types/whatsminer/M3X/M36S_Plus_Plus.py b/pyasic/miners/models/whatsminer/M3X/M36S_Plus_Plus.py similarity index 100% rename from pyasic/miners/types/whatsminer/M3X/M36S_Plus_Plus.py rename to pyasic/miners/models/whatsminer/M3X/M36S_Plus_Plus.py diff --git a/pyasic/miners/types/whatsminer/M3X/M39.py b/pyasic/miners/models/whatsminer/M3X/M39.py similarity index 100% rename from pyasic/miners/types/whatsminer/M3X/M39.py rename to pyasic/miners/models/whatsminer/M3X/M39.py diff --git a/pyasic/miners/types/whatsminer/M3X/__init__.py b/pyasic/miners/models/whatsminer/M3X/__init__.py similarity index 100% rename from pyasic/miners/types/whatsminer/M3X/__init__.py rename to pyasic/miners/models/whatsminer/M3X/__init__.py diff --git a/pyasic/miners/types/whatsminer/M5X/M50.py b/pyasic/miners/models/whatsminer/M5X/M50.py similarity index 100% rename from pyasic/miners/types/whatsminer/M5X/M50.py rename to pyasic/miners/models/whatsminer/M5X/M50.py diff --git a/pyasic/miners/types/whatsminer/M5X/M50S.py b/pyasic/miners/models/whatsminer/M5X/M50S.py similarity index 100% rename from pyasic/miners/types/whatsminer/M5X/M50S.py rename to pyasic/miners/models/whatsminer/M5X/M50S.py diff --git a/pyasic/miners/types/whatsminer/M5X/M50S_Plus.py b/pyasic/miners/models/whatsminer/M5X/M50S_Plus.py similarity index 100% rename from pyasic/miners/types/whatsminer/M5X/M50S_Plus.py rename to pyasic/miners/models/whatsminer/M5X/M50S_Plus.py diff --git a/pyasic/miners/types/whatsminer/M5X/M50S_Plus_Plus.py b/pyasic/miners/models/whatsminer/M5X/M50S_Plus_Plus.py similarity index 100% rename from pyasic/miners/types/whatsminer/M5X/M50S_Plus_Plus.py rename to pyasic/miners/models/whatsminer/M5X/M50S_Plus_Plus.py diff --git a/pyasic/miners/types/whatsminer/M5X/M53.py b/pyasic/miners/models/whatsminer/M5X/M53.py similarity index 100% rename from pyasic/miners/types/whatsminer/M5X/M53.py rename to pyasic/miners/models/whatsminer/M5X/M53.py diff --git a/pyasic/miners/types/whatsminer/M5X/M53S.py b/pyasic/miners/models/whatsminer/M5X/M53S.py similarity index 100% rename from pyasic/miners/types/whatsminer/M5X/M53S.py rename to pyasic/miners/models/whatsminer/M5X/M53S.py diff --git a/pyasic/miners/types/whatsminer/M5X/M53S_Plus.py b/pyasic/miners/models/whatsminer/M5X/M53S_Plus.py similarity index 100% rename from pyasic/miners/types/whatsminer/M5X/M53S_Plus.py rename to pyasic/miners/models/whatsminer/M5X/M53S_Plus.py diff --git a/pyasic/miners/types/whatsminer/M5X/M56.py b/pyasic/miners/models/whatsminer/M5X/M56.py similarity index 100% rename from pyasic/miners/types/whatsminer/M5X/M56.py rename to pyasic/miners/models/whatsminer/M5X/M56.py diff --git a/pyasic/miners/types/whatsminer/M5X/M56S.py b/pyasic/miners/models/whatsminer/M5X/M56S.py similarity index 100% rename from pyasic/miners/types/whatsminer/M5X/M56S.py rename to pyasic/miners/models/whatsminer/M5X/M56S.py diff --git a/pyasic/miners/types/whatsminer/M5X/M56S_Plus.py b/pyasic/miners/models/whatsminer/M5X/M56S_Plus.py similarity index 100% rename from pyasic/miners/types/whatsminer/M5X/M56S_Plus.py rename to pyasic/miners/models/whatsminer/M5X/M56S_Plus.py diff --git a/pyasic/miners/types/whatsminer/M5X/M59.py b/pyasic/miners/models/whatsminer/M5X/M59.py similarity index 100% rename from pyasic/miners/types/whatsminer/M5X/M59.py rename to pyasic/miners/models/whatsminer/M5X/M59.py diff --git a/pyasic/miners/types/whatsminer/M5X/__init__.py b/pyasic/miners/models/whatsminer/M5X/__init__.py similarity index 100% rename from pyasic/miners/types/whatsminer/M5X/__init__.py rename to pyasic/miners/models/whatsminer/M5X/__init__.py diff --git a/pyasic/miners/types/whatsminer/M6X/M60.py b/pyasic/miners/models/whatsminer/M6X/M60.py similarity index 100% rename from pyasic/miners/types/whatsminer/M6X/M60.py rename to pyasic/miners/models/whatsminer/M6X/M60.py diff --git a/pyasic/miners/types/whatsminer/M6X/M60S.py b/pyasic/miners/models/whatsminer/M6X/M60S.py similarity index 100% rename from pyasic/miners/types/whatsminer/M6X/M60S.py rename to pyasic/miners/models/whatsminer/M6X/M60S.py diff --git a/pyasic/miners/types/whatsminer/M6X/M63.py b/pyasic/miners/models/whatsminer/M6X/M63.py similarity index 100% rename from pyasic/miners/types/whatsminer/M6X/M63.py rename to pyasic/miners/models/whatsminer/M6X/M63.py diff --git a/pyasic/miners/types/whatsminer/M6X/M63S.py b/pyasic/miners/models/whatsminer/M6X/M63S.py similarity index 100% rename from pyasic/miners/types/whatsminer/M6X/M63S.py rename to pyasic/miners/models/whatsminer/M6X/M63S.py diff --git a/pyasic/miners/types/whatsminer/M6X/M66.py b/pyasic/miners/models/whatsminer/M6X/M66.py similarity index 100% rename from pyasic/miners/types/whatsminer/M6X/M66.py rename to pyasic/miners/models/whatsminer/M6X/M66.py diff --git a/pyasic/miners/types/whatsminer/M6X/M66S.py b/pyasic/miners/models/whatsminer/M6X/M66S.py similarity index 100% rename from pyasic/miners/types/whatsminer/M6X/M66S.py rename to pyasic/miners/models/whatsminer/M6X/M66S.py diff --git a/pyasic/miners/types/whatsminer/M6X/__init__.py b/pyasic/miners/models/whatsminer/M6X/__init__.py similarity index 100% rename from pyasic/miners/types/whatsminer/M6X/__init__.py rename to pyasic/miners/models/whatsminer/M6X/__init__.py diff --git a/pyasic/miners/types/whatsminer/__init__.py b/pyasic/miners/models/whatsminer/__init__.py similarity index 100% rename from pyasic/miners/types/whatsminer/__init__.py rename to pyasic/miners/models/whatsminer/__init__.py diff --git a/pyasic/miners/whatsminer/btminer/M2X/M20.py b/pyasic/miners/whatsminer/btminer/M2X/M20.py index 55663303..8191209b 100644 --- a/pyasic/miners/whatsminer/btminer/M2X/M20.py +++ b/pyasic/miners/whatsminer/btminer/M2X/M20.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import M2X -from pyasic.miners.types import M20V10 +from pyasic.miners.models import M20V10 class BTMinerM20V10(M2X, M20V10): diff --git a/pyasic/miners/whatsminer/btminer/M2X/M20P.py b/pyasic/miners/whatsminer/btminer/M2X/M20P.py index 276f1493..6fb2f445 100644 --- a/pyasic/miners/whatsminer/btminer/M2X/M20P.py +++ b/pyasic/miners/whatsminer/btminer/M2X/M20P.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import M2X -from pyasic.miners.types import M20PV10, M20PV30 +from pyasic.miners.models import M20PV10, M20PV30 class BTMinerM20PV10(M2X, M20PV10): diff --git a/pyasic/miners/whatsminer/btminer/M2X/M20S.py b/pyasic/miners/whatsminer/btminer/M2X/M20S.py index badf877a..e2c87863 100644 --- a/pyasic/miners/whatsminer/btminer/M2X/M20S.py +++ b/pyasic/miners/whatsminer/btminer/M2X/M20S.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import M2X -from pyasic.miners.types import M20SV10, M20SV20, M20SV30 +from pyasic.miners.models import M20SV10, M20SV20, M20SV30 class BTMinerM20SV10(M2X, M20SV10): diff --git a/pyasic/miners/whatsminer/btminer/M2X/M20S_Plus.py b/pyasic/miners/whatsminer/btminer/M2X/M20S_Plus.py index b028f873..4473c7ef 100644 --- a/pyasic/miners/whatsminer/btminer/M2X/M20S_Plus.py +++ b/pyasic/miners/whatsminer/btminer/M2X/M20S_Plus.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import M2X -from pyasic.miners.types import M20SPlusV30 +from pyasic.miners.models import M20SPlusV30 class BTMinerM20SPlusV30(M2X, M20SPlusV30): diff --git a/pyasic/miners/whatsminer/btminer/M2X/M21.py b/pyasic/miners/whatsminer/btminer/M2X/M21.py index b7f9c1f1..91f26991 100644 --- a/pyasic/miners/whatsminer/btminer/M2X/M21.py +++ b/pyasic/miners/whatsminer/btminer/M2X/M21.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import M2X -from pyasic.miners.types import M21V10 +from pyasic.miners.models import M21V10 class BTMinerM21V10(M2X, M21V10): diff --git a/pyasic/miners/whatsminer/btminer/M2X/M21S.py b/pyasic/miners/whatsminer/btminer/M2X/M21S.py index 7bffbdfd..b0b9ebd7 100644 --- a/pyasic/miners/whatsminer/btminer/M2X/M21S.py +++ b/pyasic/miners/whatsminer/btminer/M2X/M21S.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import M2X -from pyasic.miners.types import M21SV20, M21SV60, M21SV70 +from pyasic.miners.models import M21SV20, M21SV60, M21SV70 class BTMinerM21SV20(M2X, M21SV20): diff --git a/pyasic/miners/whatsminer/btminer/M2X/M21S_Plus.py b/pyasic/miners/whatsminer/btminer/M2X/M21S_Plus.py index 7f18af26..fb1c9cfd 100644 --- a/pyasic/miners/whatsminer/btminer/M2X/M21S_Plus.py +++ b/pyasic/miners/whatsminer/btminer/M2X/M21S_Plus.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import M2X -from pyasic.miners.types import M21SPlusV20 +from pyasic.miners.models import M21SPlusV20 class BTMinerM21SPlusV20(M2X, M21SPlusV20): diff --git a/pyasic/miners/whatsminer/btminer/M2X/M29.py b/pyasic/miners/whatsminer/btminer/M2X/M29.py index 42810a6d..0747e3bd 100644 --- a/pyasic/miners/whatsminer/btminer/M2X/M29.py +++ b/pyasic/miners/whatsminer/btminer/M2X/M29.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import M2X -from pyasic.miners.types import M29V10 +from pyasic.miners.models import M29V10 class BTMinerM29V10(M2X, M29V10): diff --git a/pyasic/miners/whatsminer/btminer/M3X/M30.py b/pyasic/miners/whatsminer/btminer/M3X/M30.py index df7549fa..aa0f8ede 100644 --- a/pyasic/miners/whatsminer/btminer/M3X/M30.py +++ b/pyasic/miners/whatsminer/btminer/M3X/M30.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import M3X -from pyasic.miners.types import M30V10, M30V20 +from pyasic.miners.models import M30V10, M30V20 class BTMinerM30V10(M3X, M30V10): diff --git a/pyasic/miners/whatsminer/btminer/M3X/M30K.py b/pyasic/miners/whatsminer/btminer/M3X/M30K.py index af3d9518..82224539 100644 --- a/pyasic/miners/whatsminer/btminer/M3X/M30K.py +++ b/pyasic/miners/whatsminer/btminer/M3X/M30K.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import M3X -from pyasic.miners.types import M30KV10 +from pyasic.miners.models import M30KV10 class BTMinerM30KV10(M3X, M30KV10): diff --git a/pyasic/miners/whatsminer/btminer/M3X/M30L.py b/pyasic/miners/whatsminer/btminer/M3X/M30L.py index 3dc9e9fe..2d1954fd 100644 --- a/pyasic/miners/whatsminer/btminer/M3X/M30L.py +++ b/pyasic/miners/whatsminer/btminer/M3X/M30L.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import M3X -from pyasic.miners.types import M30LV10 +from pyasic.miners.models import M30LV10 class BTMinerM30LV10(M3X, M30LV10): diff --git a/pyasic/miners/whatsminer/btminer/M3X/M30S.py b/pyasic/miners/whatsminer/btminer/M3X/M30S.py index 6e5a9f88..695a8264 100644 --- a/pyasic/miners/whatsminer/btminer/M3X/M30S.py +++ b/pyasic/miners/whatsminer/btminer/M3X/M30S.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import M3X -from pyasic.miners.types import ( +from pyasic.miners.models import ( M30SV10, M30SV20, M30SV30, diff --git a/pyasic/miners/whatsminer/btminer/M3X/M30S_Plus.py b/pyasic/miners/whatsminer/btminer/M3X/M30S_Plus.py index 3ea54afb..83ef256e 100644 --- a/pyasic/miners/whatsminer/btminer/M3X/M30S_Plus.py +++ b/pyasic/miners/whatsminer/btminer/M3X/M30S_Plus.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import M3X -from pyasic.miners.types import ( +from pyasic.miners.models import ( M30SPlusV10, M30SPlusV20, M30SPlusV30, diff --git a/pyasic/miners/whatsminer/btminer/M3X/M30S_Plus_Plus.py b/pyasic/miners/whatsminer/btminer/M3X/M30S_Plus_Plus.py index 675ec76c..77c5fa54 100644 --- a/pyasic/miners/whatsminer/btminer/M3X/M30S_Plus_Plus.py +++ b/pyasic/miners/whatsminer/btminer/M3X/M30S_Plus_Plus.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import M3X -from pyasic.miners.types import ( +from pyasic.miners.models import ( M30SPlusPlusV10, M30SPlusPlusV20, M30SPlusPlusVE30, diff --git a/pyasic/miners/whatsminer/btminer/M3X/M31.py b/pyasic/miners/whatsminer/btminer/M3X/M31.py index a8c51032..f5d0c71d 100644 --- a/pyasic/miners/whatsminer/btminer/M3X/M31.py +++ b/pyasic/miners/whatsminer/btminer/M3X/M31.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import M3X -from pyasic.miners.types import M31V10, M31V20 +from pyasic.miners.models import M31V10, M31V20 class BTMinerM31V10(M3X, M31V10): diff --git a/pyasic/miners/whatsminer/btminer/M3X/M31H.py b/pyasic/miners/whatsminer/btminer/M3X/M31H.py index b6a36d42..dc5df52b 100644 --- a/pyasic/miners/whatsminer/btminer/M3X/M31H.py +++ b/pyasic/miners/whatsminer/btminer/M3X/M31H.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import M3X -from pyasic.miners.types import M31HV10, M31HV40 +from pyasic.miners.models import M31HV10, M31HV40 class BTMinerM31HV10(M3X, M31HV10): diff --git a/pyasic/miners/whatsminer/btminer/M3X/M31L.py b/pyasic/miners/whatsminer/btminer/M3X/M31L.py index 80934be1..8bdbe34b 100644 --- a/pyasic/miners/whatsminer/btminer/M3X/M31L.py +++ b/pyasic/miners/whatsminer/btminer/M3X/M31L.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import M3X -from pyasic.miners.types import M30LV10 +from pyasic.miners.models import M30LV10 class BTMinerM31LV10(M3X, M30LV10): diff --git a/pyasic/miners/whatsminer/btminer/M3X/M31S.py b/pyasic/miners/whatsminer/btminer/M3X/M31S.py index 5248c89f..c8acd011 100644 --- a/pyasic/miners/whatsminer/btminer/M3X/M31S.py +++ b/pyasic/miners/whatsminer/btminer/M3X/M31S.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import M3X -from pyasic.miners.types import ( +from pyasic.miners.models import ( M31SV10, M31SV20, M31SV30, diff --git a/pyasic/miners/whatsminer/btminer/M3X/M31SE.py b/pyasic/miners/whatsminer/btminer/M3X/M31SE.py index 40f124d1..8f8e127e 100644 --- a/pyasic/miners/whatsminer/btminer/M3X/M31SE.py +++ b/pyasic/miners/whatsminer/btminer/M3X/M31SE.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import M3X -from pyasic.miners.types import M31SEV10, M31SEV20, M31SEV30 +from pyasic.miners.models import M31SEV10, M31SEV20, M31SEV30 class BTMinerM31SEV10(M3X, M31SEV10): diff --git a/pyasic/miners/whatsminer/btminer/M3X/M31S_Plus.py b/pyasic/miners/whatsminer/btminer/M3X/M31S_Plus.py index 2da72e6d..8ed13a8c 100644 --- a/pyasic/miners/whatsminer/btminer/M3X/M31S_Plus.py +++ b/pyasic/miners/whatsminer/btminer/M3X/M31S_Plus.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import M3X -from pyasic.miners.types import ( +from pyasic.miners.models import ( M31SPlusV10, M31SPlusV20, M31SPlusV30, diff --git a/pyasic/miners/whatsminer/btminer/M3X/M32.py b/pyasic/miners/whatsminer/btminer/M3X/M32.py index bfca1797..98da3f05 100644 --- a/pyasic/miners/whatsminer/btminer/M3X/M32.py +++ b/pyasic/miners/whatsminer/btminer/M3X/M32.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import M3X -from pyasic.miners.types import M32V10, M32V20 +from pyasic.miners.models import M32V10, M32V20 class BTMinerM32V10(M3X, M32V10): diff --git a/pyasic/miners/whatsminer/btminer/M3X/M32S.py b/pyasic/miners/whatsminer/btminer/M3X/M32S.py index 0cdc586f..e6ba475b 100644 --- a/pyasic/miners/whatsminer/btminer/M3X/M32S.py +++ b/pyasic/miners/whatsminer/btminer/M3X/M32S.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import M3X -from pyasic.miners.types import M32S +from pyasic.miners.models import M32S class BTMinerM32S(M3X, M32S): diff --git a/pyasic/miners/whatsminer/btminer/M3X/M33.py b/pyasic/miners/whatsminer/btminer/M3X/M33.py index b5049811..d2ba6519 100644 --- a/pyasic/miners/whatsminer/btminer/M3X/M33.py +++ b/pyasic/miners/whatsminer/btminer/M3X/M33.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import M3X -from pyasic.miners.types import M33V10, M33V20, M33V30 +from pyasic.miners.models import M33V10, M33V20, M33V30 class BTMinerM33V10(M3X, M33V10): diff --git a/pyasic/miners/whatsminer/btminer/M3X/M33S.py b/pyasic/miners/whatsminer/btminer/M3X/M33S.py index 346633fe..6286db37 100644 --- a/pyasic/miners/whatsminer/btminer/M3X/M33S.py +++ b/pyasic/miners/whatsminer/btminer/M3X/M33S.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import M3X -from pyasic.miners.types import M33SVG30 +from pyasic.miners.models import M33SVG30 class BTMinerM33SVG30(M3X, M33SVG30): diff --git a/pyasic/miners/whatsminer/btminer/M3X/M33S_Plus.py b/pyasic/miners/whatsminer/btminer/M3X/M33S_Plus.py index 673a997d..dddbbce0 100644 --- a/pyasic/miners/whatsminer/btminer/M3X/M33S_Plus.py +++ b/pyasic/miners/whatsminer/btminer/M3X/M33S_Plus.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import M3X -from pyasic.miners.types import M33SPlusVG20, M33SPlusVH20, M33SPlusVH30 +from pyasic.miners.models import M33SPlusVG20, M33SPlusVH20, M33SPlusVH30 class BTMinerM33SPlusVG20(M3X, M33SPlusVG20): diff --git a/pyasic/miners/whatsminer/btminer/M3X/M33S_Plus_Plus.py b/pyasic/miners/whatsminer/btminer/M3X/M33S_Plus_Plus.py index b8651f44..ee8f198c 100644 --- a/pyasic/miners/whatsminer/btminer/M3X/M33S_Plus_Plus.py +++ b/pyasic/miners/whatsminer/btminer/M3X/M33S_Plus_Plus.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import M3X -from pyasic.miners.types import M33SPlusPlusVG40, M33SPlusPlusVH20, M33SPlusPlusVH30 +from pyasic.miners.models import M33SPlusPlusVG40, M33SPlusPlusVH20, M33SPlusPlusVH30 class BTMinerM33SPlusPlusVH20(M3X, M33SPlusPlusVH20): diff --git a/pyasic/miners/whatsminer/btminer/M3X/M34S_Plus.py b/pyasic/miners/whatsminer/btminer/M3X/M34S_Plus.py index c4e0c6ea..d66cb244 100644 --- a/pyasic/miners/whatsminer/btminer/M3X/M34S_Plus.py +++ b/pyasic/miners/whatsminer/btminer/M3X/M34S_Plus.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import M3X -from pyasic.miners.types import M34SPlusVE10 +from pyasic.miners.models import M34SPlusVE10 class BTMinerM34SPlusVE10(M3X, M34SPlusVE10): diff --git a/pyasic/miners/whatsminer/btminer/M3X/M36S.py b/pyasic/miners/whatsminer/btminer/M3X/M36S.py index 7713b751..e83d9c2c 100644 --- a/pyasic/miners/whatsminer/btminer/M3X/M36S.py +++ b/pyasic/miners/whatsminer/btminer/M3X/M36S.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import M3X -from pyasic.miners.types import M36SVE10 +from pyasic.miners.models import M36SVE10 class BTMinerM36SVE10(M3X, M36SVE10): diff --git a/pyasic/miners/whatsminer/btminer/M3X/M36S_Plus.py b/pyasic/miners/whatsminer/btminer/M3X/M36S_Plus.py index e2dd40c5..f637590b 100644 --- a/pyasic/miners/whatsminer/btminer/M3X/M36S_Plus.py +++ b/pyasic/miners/whatsminer/btminer/M3X/M36S_Plus.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import M3X -from pyasic.miners.types import M36SPlusVG30 +from pyasic.miners.models import M36SPlusVG30 class BTMinerM36SPlusVG30(M3X, M36SPlusVG30): diff --git a/pyasic/miners/whatsminer/btminer/M3X/M36S_Plus_Plus.py b/pyasic/miners/whatsminer/btminer/M3X/M36S_Plus_Plus.py index f59456c7..cc307b06 100644 --- a/pyasic/miners/whatsminer/btminer/M3X/M36S_Plus_Plus.py +++ b/pyasic/miners/whatsminer/btminer/M3X/M36S_Plus_Plus.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import M3X -from pyasic.miners.types import M36SPlusPlusVH30 +from pyasic.miners.models import M36SPlusPlusVH30 class BTMinerM36SPlusPlusVH30(M3X, M36SPlusPlusVH30): diff --git a/pyasic/miners/whatsminer/btminer/M3X/M39.py b/pyasic/miners/whatsminer/btminer/M3X/M39.py index 805e8f13..df599b05 100644 --- a/pyasic/miners/whatsminer/btminer/M3X/M39.py +++ b/pyasic/miners/whatsminer/btminer/M3X/M39.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import M3X -from pyasic.miners.types import M39V10, M39V20, M39V30 +from pyasic.miners.models import M39V10, M39V20, M39V30 class BTMinerM39V10(M3X, M39V10): diff --git a/pyasic/miners/whatsminer/btminer/M5X/M50.py b/pyasic/miners/whatsminer/btminer/M5X/M50.py index 54aaa3ea..13f9bd5a 100644 --- a/pyasic/miners/whatsminer/btminer/M5X/M50.py +++ b/pyasic/miners/whatsminer/btminer/M5X/M50.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import M5X -from pyasic.miners.types import ( +from pyasic.miners.models import ( M50VE30, M50VG30, M50VH10, diff --git a/pyasic/miners/whatsminer/btminer/M5X/M50S.py b/pyasic/miners/whatsminer/btminer/M5X/M50S.py index ecef9195..a76054b3 100644 --- a/pyasic/miners/whatsminer/btminer/M5X/M50S.py +++ b/pyasic/miners/whatsminer/btminer/M5X/M50S.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import M5X -from pyasic.miners.types import ( +from pyasic.miners.models import ( M50SVH10, M50SVH20, M50SVH30, diff --git a/pyasic/miners/whatsminer/btminer/M5X/M50S_Plus.py b/pyasic/miners/whatsminer/btminer/M5X/M50S_Plus.py index 3d35b778..062065b1 100644 --- a/pyasic/miners/whatsminer/btminer/M5X/M50S_Plus.py +++ b/pyasic/miners/whatsminer/btminer/M5X/M50S_Plus.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import M5X -from pyasic.miners.types import M50SPlusVH30, M50SPlusVH40, M50SPlusVJ30, M50SPlusVK20 +from pyasic.miners.models import M50SPlusVH30, M50SPlusVH40, M50SPlusVJ30, M50SPlusVK20 class BTMinerM50SPlusVH30(M5X, M50SPlusVH30): diff --git a/pyasic/miners/whatsminer/btminer/M5X/M50S_Plus_Plus.py b/pyasic/miners/whatsminer/btminer/M5X/M50S_Plus_Plus.py index d4291368..f9b1cc60 100644 --- a/pyasic/miners/whatsminer/btminer/M5X/M50S_Plus_Plus.py +++ b/pyasic/miners/whatsminer/btminer/M5X/M50S_Plus_Plus.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import M5X -from pyasic.miners.types.whatsminer.M5X.M50S_Plus_Plus import ( # noqa - ignore _module import +from pyasic.miners.models.whatsminer.M5X.M50S_Plus_Plus import ( # noqa - ignore _module import M50SPlusPlusVK10, M50SPlusPlusVK20, M50SPlusPlusVK30, diff --git a/pyasic/miners/whatsminer/btminer/M5X/M53.py b/pyasic/miners/whatsminer/btminer/M5X/M53.py index 0401bf3d..0892b3a7 100644 --- a/pyasic/miners/whatsminer/btminer/M5X/M53.py +++ b/pyasic/miners/whatsminer/btminer/M5X/M53.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import M5X -from pyasic.miners.types import M53VH30 +from pyasic.miners.models import M53VH30 class BTMinerM53VH30(M5X, M53VH30): diff --git a/pyasic/miners/whatsminer/btminer/M5X/M53S.py b/pyasic/miners/whatsminer/btminer/M5X/M53S.py index f66a065a..be275849 100644 --- a/pyasic/miners/whatsminer/btminer/M5X/M53S.py +++ b/pyasic/miners/whatsminer/btminer/M5X/M53S.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import M5X -from pyasic.miners.types import M53SVH30 +from pyasic.miners.models import M53SVH30 class BTMinerM53SVH30(M5X, M53SVH30): diff --git a/pyasic/miners/whatsminer/btminer/M5X/M53S_Plus.py b/pyasic/miners/whatsminer/btminer/M5X/M53S_Plus.py index 3922fa1b..ee16f0a0 100644 --- a/pyasic/miners/whatsminer/btminer/M5X/M53S_Plus.py +++ b/pyasic/miners/whatsminer/btminer/M5X/M53S_Plus.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import M5X -from pyasic.miners.types import M53SPlusVJ30 +from pyasic.miners.models import M53SPlusVJ30 class BTMinerM53SPlusVJ30(M5X, M53SPlusVJ30): diff --git a/pyasic/miners/whatsminer/btminer/M5X/M56.py b/pyasic/miners/whatsminer/btminer/M5X/M56.py index ee2442d6..9b518d9c 100644 --- a/pyasic/miners/whatsminer/btminer/M5X/M56.py +++ b/pyasic/miners/whatsminer/btminer/M5X/M56.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import M5X -from pyasic.miners.types import M56VH30 +from pyasic.miners.models import M56VH30 class BTMinerM56VH30(M5X, M56VH30): diff --git a/pyasic/miners/whatsminer/btminer/M5X/M56S.py b/pyasic/miners/whatsminer/btminer/M5X/M56S.py index fd61a651..b8c7ae7c 100644 --- a/pyasic/miners/whatsminer/btminer/M5X/M56S.py +++ b/pyasic/miners/whatsminer/btminer/M5X/M56S.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import M5X -from pyasic.miners.types import M56SVH30 +from pyasic.miners.models import M56SVH30 class BTMinerM56SVH30(M5X, M56SVH30): diff --git a/pyasic/miners/whatsminer/btminer/M5X/M56S_Plus.py b/pyasic/miners/whatsminer/btminer/M5X/M56S_Plus.py index 5569986e..feb0414b 100644 --- a/pyasic/miners/whatsminer/btminer/M5X/M56S_Plus.py +++ b/pyasic/miners/whatsminer/btminer/M5X/M56S_Plus.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import M5X -from pyasic.miners.types import M56SPlusVJ30 +from pyasic.miners.models import M56SPlusVJ30 class BTMinerM56SPlusVJ30(M5X, M56SPlusVJ30): diff --git a/pyasic/miners/whatsminer/btminer/M5X/M59.py b/pyasic/miners/whatsminer/btminer/M5X/M59.py index 373d997f..1375e844 100644 --- a/pyasic/miners/whatsminer/btminer/M5X/M59.py +++ b/pyasic/miners/whatsminer/btminer/M5X/M59.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import M5X -from pyasic.miners.types import M59VH30 +from pyasic.miners.models import M59VH30 class BTMinerM59VH30(M5X, M59VH30): diff --git a/pyasic/miners/whatsminer/btminer/M6X/M60.py b/pyasic/miners/whatsminer/btminer/M6X/M60.py index 8e26a71e..e4587808 100644 --- a/pyasic/miners/whatsminer/btminer/M6X/M60.py +++ b/pyasic/miners/whatsminer/btminer/M6X/M60.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import M6X -from pyasic.miners.types import M60VK10, M60VK20, M60VK30, M60VK40 +from pyasic.miners.models import M60VK10, M60VK20, M60VK30, M60VK40 class BTMinerM60VK10(M6X, M60VK10): diff --git a/pyasic/miners/whatsminer/btminer/M6X/M60S.py b/pyasic/miners/whatsminer/btminer/M6X/M60S.py index 35ba788e..d3801efd 100644 --- a/pyasic/miners/whatsminer/btminer/M6X/M60S.py +++ b/pyasic/miners/whatsminer/btminer/M6X/M60S.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import M6X -from pyasic.miners.types import M60SVK10, M60SVK20, M60SVK30, M60SVK40 +from pyasic.miners.models import M60SVK10, M60SVK20, M60SVK30, M60SVK40 class BTMinerM60SVK10(M6X, M60SVK10): diff --git a/pyasic/miners/whatsminer/btminer/M6X/M63.py b/pyasic/miners/whatsminer/btminer/M6X/M63.py index c2fcff9e..5dfbc902 100644 --- a/pyasic/miners/whatsminer/btminer/M6X/M63.py +++ b/pyasic/miners/whatsminer/btminer/M6X/M63.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import M6X -from pyasic.miners.types import M63VK10, M63VK20, M63VK30 +from pyasic.miners.models import M63VK10, M63VK20, M63VK30 class BTMinerM63VK10(M6X, M63VK10): diff --git a/pyasic/miners/whatsminer/btminer/M6X/M63S.py b/pyasic/miners/whatsminer/btminer/M6X/M63S.py index d99b9292..3d431b59 100644 --- a/pyasic/miners/whatsminer/btminer/M6X/M63S.py +++ b/pyasic/miners/whatsminer/btminer/M6X/M63S.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import M6X -from pyasic.miners.types import M63SVK10, M63SVK20, M63SVK30 +from pyasic.miners.models import M63SVK10, M63SVK20, M63SVK30 class BTMinerM63SVK10(M6X, M63SVK10): diff --git a/pyasic/miners/whatsminer/btminer/M6X/M66.py b/pyasic/miners/whatsminer/btminer/M6X/M66.py index cc066c73..509ad71b 100644 --- a/pyasic/miners/whatsminer/btminer/M6X/M66.py +++ b/pyasic/miners/whatsminer/btminer/M6X/M66.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import M6X -from pyasic.miners.types import M66VK20, M66VK30 +from pyasic.miners.models import M66VK20, M66VK30 class BTMinerM66VK20(M6X, M66VK20): diff --git a/pyasic/miners/whatsminer/btminer/M6X/M66S.py b/pyasic/miners/whatsminer/btminer/M6X/M66S.py index 5f456fcd..c8138af9 100644 --- a/pyasic/miners/whatsminer/btminer/M6X/M66S.py +++ b/pyasic/miners/whatsminer/btminer/M6X/M66S.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from pyasic.miners.backends import M6X -from pyasic.miners.types import M66SVK20, M66SVK30, M66SVK40 +from pyasic.miners.models import M66SVK20, M66SVK30, M66SVK40 class BTMinerM66SVK20(M6X, M66SVK20): diff --git a/pyasic/misc/__init__.py b/pyasic/misc/__init__.py index 8d51ae08..843dc5f2 100644 --- a/pyasic/misc/__init__.py +++ b/pyasic/misc/__init__.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from copy import deepcopy -from pyasic.rpc import APIError +from pyasic.errors import APIError class Singleton(type): diff --git a/pyasic/network/__init__.py b/pyasic/network/__init__.py index 0f401c19..669afab8 100644 --- a/pyasic/network/__init__.py +++ b/pyasic/network/__init__.py @@ -20,7 +20,7 @@ import logging from typing import AsyncIterator, List, Union from pyasic import settings -from pyasic.miners.miner_factory import AnyMiner, miner_factory +from pyasic.miners.factory import AnyMiner, miner_factory class MinerNetwork: diff --git a/pyasic/rpc/__init__.py b/pyasic/rpc/__init__.py index be411a9c..0b8d1767 100644 --- a/pyasic/rpc/__init__.py +++ b/pyasic/rpc/__init__.py @@ -13,322 +13,11 @@ # See the License for the specific language governing permissions and - # limitations under the License. - # ------------------------------------------------------------------------------ - -import asyncio -import ipaddress -import json -import logging -import re -import warnings -from typing import Union - -from pyasic.errors import APIError, APIWarning - - -class BaseMinerRPCAPI: - def __init__(self, ip: str, port: int = 4028, api_ver: str = "0.0.0") -> None: - # api port, should be 4028 - self.port = port - # ip address of the miner - self.ip = ipaddress.ip_address(ip) - # api version if known - self.api_ver = api_ver - - self.pwd = None - - def __new__(cls, *args, **kwargs): - if cls is BaseMinerRPCAPI: - raise TypeError(f"Only children of '{cls.__name__}' may be instantiated") - return object.__new__(cls) - - def __repr__(self): - return f"{self.__class__.__name__}: {str(self.ip)}" - - async def send_command( - self, - command: Union[str, bytes], - parameters: Union[str, int, bool] = None, - ignore_errors: bool = False, - allow_warning: bool = True, - **kwargs, - ) -> dict: - """Send an API command to the miner and return the result. - - Parameters: - command: The command to sent to the miner. - parameters: Any additional parameters to be sent with the command. - ignore_errors: Whether to raise APIError when the command returns an error. - allow_warning: Whether to warn if the command fails. - - Returns: - The return data from the API command parsed from JSON into a dict. - """ - logging.debug( - f"{self} - (Send Privileged Command) - {command} " - + f"with args {parameters}" - if parameters - else "" - ) - # create the command - cmd = {"command": command, **kwargs} - if parameters: - cmd["parameter"] = parameters - - # send the command - data = await self._send_bytes(json.dumps(cmd).encode("utf-8")) - - if data == b"Socket connect failed: Connection refused\n": - if not ignore_errors: - raise APIError(data.decode("utf-8")) - return {} - - data = self._load_api_data(data) - - # check for if the user wants to allow errors to return - validation = self._validate_command_output(data) - if not validation[0]: - if not ignore_errors: - # validate the command succeeded - raise APIError(validation[1]) - if allow_warning: - logging.warning( - f"{self.ip}: API Command Error: {command}: {validation[1]}" - ) - - logging.debug(f"{self} - (Send Command) - Received data.") - return data - - # Privileged command handler, only used by whatsminers, defined here for consistency. - async def send_privileged_command(self, *args, **kwargs) -> dict: - return await self.send_command(*args, **kwargs) - - async def multicommand(self, *commands: str, allow_warning: bool = True) -> dict: - """Creates and sends multiple commands as one command to the miner. - - Parameters: - *commands: The commands to send as a multicommand to the miner. - allow_warning: A boolean to supress APIWarnings. - - """ - # make sure we can actually run each command, otherwise they will fail - commands = self._check_commands(*commands) - # standard multicommand format is "command1+command2" - # doesn't work for S19 which uses the backup _send_split_multicommand - command = "+".join(commands) - try: - data = await self.send_command(command, allow_warning=allow_warning) - except APIError: - data = await self._send_split_multicommand(*commands) - data["multicommand"] = True - return data - - async def _send_split_multicommand( - self, *commands, allow_warning: bool = True - ) -> dict: - tasks = {} - # send all commands individually - for cmd in commands: - tasks[cmd] = asyncio.create_task( - self.send_command(cmd, allow_warning=allow_warning) - ) - - await asyncio.gather(*[tasks[cmd] for cmd in tasks], return_exceptions=True) - - data = {} - for cmd in tasks: - try: - result = tasks[cmd].result() - if result is None or result == {}: - result = {} - data[cmd] = [result] - except APIError: - pass - - return data - - @property - def commands(self) -> list: - return self.get_commands() - - def get_commands(self) -> list: - """Get a list of command accessible to a specific type of API on the miner. - - Returns: - A list of all API commands that the miner supports. - """ - return [ - func - for func in - # each function in self - dir(self) - if not func == "commands" - if callable(getattr(self, func)) and - # no __ or _ methods - not func.startswith("__") and not func.startswith("_") and - # remove all functions that are in this base class - func - not in [ - func - for func in dir(BaseMinerRPCAPI) - if callable(getattr(BaseMinerRPCAPI, func)) - ] - ] - - def _check_commands(self, *commands): - allowed_commands = self.commands - return_commands = [] - - for command in commands: - if command in allowed_commands: - return_commands.append(command) - else: - warnings.warn( - f"""Removing incorrect command: {command} -If you are sure you want to use this command please use API.send_command("{command}", ignore_errors=True) instead.""", - APIWarning, - ) - return return_commands - - async def _send_bytes( - self, - data: bytes, - timeout: int = 100, - ) -> bytes: - logging.debug(f"{self} - ([Hidden] Send Bytes) - Sending") - try: - # get reader and writer streams - reader, writer = await asyncio.open_connection(str(self.ip), self.port) - # handle OSError 121 - except OSError as e: - if e.errno == 121: - logging.warning( - f"{self} - ([Hidden] Send Bytes) - Semaphore timeout expired." - ) - return b"{}" - - # send the command - logging.debug(f"{self} - ([Hidden] Send Bytes) - Writing") - writer.write(data) - logging.debug(f"{self} - ([Hidden] Send Bytes) - Draining") - await writer.drain() - try: - # TO address a situation where a whatsminer has an unknown PW -AND- - # Fix for stupid whatsminer bug, reboot/restart seem to not load properly in the loop - # have to receive, save the data, check if there is more data by reading with a short timeout - # append that data if there is more, and then onto the main loop. - # the password timeout might need to be longer than 1, but it seems to work for now. - ret_data = await asyncio.wait_for(reader.read(1), timeout=1) - except asyncio.TimeoutError: - return b"{}" - try: - ret_data += await asyncio.wait_for(reader.read(4096), timeout=timeout) - except ConnectionAbortedError: - return b"{}" - - # loop to receive all the data - logging.debug(f"{self} - ([Hidden] Send Bytes) - Receiving") - try: - while True: - try: - d = await asyncio.wait_for(reader.read(4096), timeout=timeout) - if not d: - break - ret_data += d - except (asyncio.CancelledError, asyncio.TimeoutError) as e: - raise e - except (asyncio.CancelledError, asyncio.TimeoutError) as e: - raise e - except Exception as e: - logging.warning(f"{self} - ([Hidden] Send Bytes) - API Command Error {e}") - - # close the connection - logging.debug(f"{self} - ([Hidden] Send Bytes) - Closing") - writer.close() - await writer.wait_closed() - - return ret_data - - @staticmethod - def _validate_command_output(data: dict) -> tuple: - # 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 "STATUS" in data[key][0].keys(): - if data[key][0]["STATUS"][0]["STATUS"] not in ["S", "I"]: - # this is an error - return False, f"{key}: " + data[key][0]["STATUS"][0]["Msg"] - elif "id" not in data.keys(): - if isinstance(data["STATUS"], list): - if data["STATUS"][0].get("STATUS", None) in ["S", "I"]: - return True, None - else: - return False, data["STATUS"][0]["Msg"] - - elif isinstance(data["STATUS"], dict): - # new style X19 command - if data["STATUS"]["STATUS"] not in ["S", "I"]: - return False, data["STATUS"]["Msg"] - return True, None - - if data["STATUS"] not in ["S", "I"]: - return False, data["Msg"] - else: - # make sure the command succeeded - if isinstance(data["STATUS"], str): - if data["STATUS"] in ["RESTART"]: - return True, None - elif isinstance(data["STATUS"], dict): - if data["STATUS"].get("STATUS") in ["S", "I"]: - return True, None - elif data["STATUS"][0]["STATUS"] not in ("S", "I"): - # this is an error - if data["STATUS"][0]["STATUS"] not in ("S", "I"): - return False, data["STATUS"][0]["Msg"] - return True, None - - @staticmethod - def _load_api_data(data: bytes) -> dict: - # some json from the API returns with a null byte (\x00) on the end - if data.endswith(b"\x00"): - # handle the null byte - str_data = data.decode("utf-8")[:-1] - else: - # no null byte - str_data = data.decode("utf-8") - # fix an error with a btminer return having an extra comma that breaks json.loads() - str_data = str_data.replace(",}", "}") - # fix an error with a btminer return having a newline that breaks json.loads() - str_data = str_data.replace("\n", "") - # fix an error with a bmminer return not having a specific comma that breaks json.loads() - str_data = str_data.replace("}{", "},{") - # fix an error with a bmminer return having a specific comma that breaks json.loads() - str_data = str_data.replace("[,{", "[{") - # fix an error with a btminer return having a missing comma. (2023-01-06 version) - str_data = str_data.replace('""temp0', '","temp0') - # fix an error with Avalonminers returning inf and nan - str_data = str_data.replace("info", "1nfo") - str_data = str_data.replace("inf", "0") - str_data = str_data.replace("1nfo", "info") - str_data = str_data.replace("nan", "0") - # fix whatever this garbage from avalonminers is `,"id":1}` - if str_data.startswith(","): - str_data = f"{{{str_data[1:]}" - # try to fix an error with overflowing the receive buffer - # this can happen in cases such as bugged btminers returning arbitrary length error info with 100s of errors. - if not str_data.endswith("}"): - str_data = ",".join(str_data.split(",")[:-1]) + "}" - - # fix a really nasty bug with whatsminer API v2.0.4 where they return a list structured like a dict - if re.search(r"\"error_code\":\[\".+\"\]", str_data): - str_data = str_data.replace("[", "{").replace("]", "}") - - # parse the json - try: - parsed_data = json.loads(str_data) - except json.decoder.JSONDecodeError as e: - raise APIError(f"Decode Error {e}: {str_data}") - return parsed_data +from .bfgminer import BFGMinerRPCAPI +from .bmminer import BMMinerRPCAPI +from .bosminer import BOSMinerRPCAPI +from .btminer import BTMinerRPCAPI +from .cgminer import CGMinerRPCAPI +from .gcminer import GCMinerRPCAPI +from .luxminer import LUXMinerRPCAPI +from .unknown import UnknownRPCAPI diff --git a/pyasic/rpc/base.py b/pyasic/rpc/base.py new file mode 100644 index 00000000..e68a32a6 --- /dev/null +++ b/pyasic/rpc/base.py @@ -0,0 +1,334 @@ +# ------------------------------------------------------------------------------ +# Copyright 2022 Upstream Data Inc - +# - +# Licensed under the Apache License, Version 2.0 (the "License"); - +# you may not use this file except in compliance with the License. - +# You may obtain a copy of the License at - +# - +# http://www.apache.org/licenses/LICENSE-2.0 - +# - +# Unless required by applicable law or agreed to in writing, software - +# distributed under the License is distributed on an "AS IS" BASIS, - +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - +# See the License for the specific language governing permissions and - +# limitations under the License. - +# ------------------------------------------------------------------------------ + +import asyncio +import ipaddress +import json +import logging +import re +import warnings +from typing import Union + +from pyasic.errors import APIError, APIWarning + + +class BaseMinerRPCAPI: + def __init__(self, ip: str, port: int = 4028, api_ver: str = "0.0.0") -> None: + # api port, should be 4028 + self.port = port + # ip address of the miner + self.ip = ipaddress.ip_address(ip) + # api version if known + self.api_ver = api_ver + + self.pwd = None + + def __new__(cls, *args, **kwargs): + if cls is BaseMinerRPCAPI: + raise TypeError(f"Only children of '{cls.__name__}' may be instantiated") + return object.__new__(cls) + + def __repr__(self) -> str: + return f"{self.__class__.__name__}: {str(self.ip)}" + + async def send_command( + self, + command: Union[str, bytes], + parameters: Union[str, int, bool] = None, + ignore_errors: bool = False, + allow_warning: bool = True, + **kwargs, + ) -> dict: + """Send an API command to the miner and return the result. + + Parameters: + command: The command to sent to the miner. + parameters: Any additional parameters to be sent with the command. + ignore_errors: Whether to raise APIError when the command returns an error. + allow_warning: Whether to warn if the command fails. + + Returns: + The return data from the API command parsed from JSON into a dict. + """ + logging.debug( + f"{self} - (Send Privileged Command) - {command} " + + f"with args {parameters}" + if parameters + else "" + ) + # create the command + cmd = {"command": command, **kwargs} + if parameters: + cmd["parameter"] = parameters + + # send the command + data = await self._send_bytes(json.dumps(cmd).encode("utf-8")) + + if data == b"Socket connect failed: Connection refused\n": + if not ignore_errors: + raise APIError(data.decode("utf-8")) + return {} + + data = self._load_api_data(data) + + # check for if the user wants to allow errors to return + validation = self._validate_command_output(data) + if not validation[0]: + if not ignore_errors: + # validate the command succeeded + raise APIError(validation[1]) + if allow_warning: + logging.warning( + f"{self.ip}: API Command Error: {command}: {validation[1]}" + ) + + logging.debug(f"{self} - (Send Command) - Received data.") + return data + + # Privileged command handler, only used by whatsminers, defined here for consistency. + async def send_privileged_command(self, *args, **kwargs) -> dict: + return await self.send_command(*args, **kwargs) + + async def multicommand(self, *commands: str, allow_warning: bool = True) -> dict: + """Creates and sends multiple commands as one command to the miner. + + Parameters: + *commands: The commands to send as a multicommand to the miner. + allow_warning: A boolean to supress APIWarnings. + + """ + # make sure we can actually run each command, otherwise they will fail + commands = self._check_commands(*commands) + # standard multicommand format is "command1+command2" + # doesn't work for S19 which uses the backup _send_split_multicommand + command = "+".join(commands) + try: + data = await self.send_command(command, allow_warning=allow_warning) + except APIError: + data = await self._send_split_multicommand(*commands) + data["multicommand"] = True + return data + + async def _send_split_multicommand( + self, *commands, allow_warning: bool = True + ) -> dict: + tasks = {} + # send all commands individually + for cmd in commands: + tasks[cmd] = asyncio.create_task( + self.send_command(cmd, allow_warning=allow_warning) + ) + + await asyncio.gather(*[tasks[cmd] for cmd in tasks], return_exceptions=True) + + data = {} + for cmd in tasks: + try: + result = tasks[cmd].result() + if result is None or result == {}: + result = {} + data[cmd] = [result] + except APIError: + pass + + return data + + @property + def commands(self) -> list: + return self.get_commands() + + def get_commands(self) -> list: + """Get a list of command accessible to a specific type of API on the miner. + + Returns: + A list of all API commands that the miner supports. + """ + return [ + func + for func in + # each function in self + dir(self) + if not func == "commands" + if callable(getattr(self, func)) and + # no __ or _ methods + not func.startswith("__") and not func.startswith("_") and + # remove all functions that are in this base class + func + not in [ + func + for func in dir(BaseMinerRPCAPI) + if callable(getattr(BaseMinerRPCAPI, func)) + ] + ] + + def _check_commands(self, *commands) -> list: + allowed_commands = self.commands + return_commands = [] + + for command in commands: + if command in allowed_commands: + return_commands.append(command) + else: + warnings.warn( + f"""Removing incorrect command: {command} +If you are sure you want to use this command please use API.send_command("{command}", ignore_errors=True) instead.""", + APIWarning, + ) + return return_commands + + async def _send_bytes( + self, + data: bytes, + timeout: int = 100, + ) -> bytes: + logging.debug(f"{self} - ([Hidden] Send Bytes) - Sending") + try: + # get reader and writer streams + reader, writer = await asyncio.open_connection(str(self.ip), self.port) + # handle OSError 121 + except OSError as e: + if e.errno == 121: + logging.warning( + f"{self} - ([Hidden] Send Bytes) - Semaphore timeout expired." + ) + return b"{}" + + # send the command + logging.debug(f"{self} - ([Hidden] Send Bytes) - Writing") + writer.write(data) + logging.debug(f"{self} - ([Hidden] Send Bytes) - Draining") + await writer.drain() + try: + # TO address a situation where a whatsminer has an unknown PW -AND- + # Fix for stupid whatsminer bug, reboot/restart seem to not load properly in the loop + # have to receive, save the data, check if there is more data by reading with a short timeout + # append that data if there is more, and then onto the main loop. + # the password timeout might need to be longer than 1, but it seems to work for now. + ret_data = await asyncio.wait_for(reader.read(1), timeout=1) + except asyncio.TimeoutError: + return b"{}" + try: + ret_data += await asyncio.wait_for(reader.read(4096), timeout=timeout) + except ConnectionAbortedError: + return b"{}" + + # loop to receive all the data + logging.debug(f"{self} - ([Hidden] Send Bytes) - Receiving") + try: + while True: + try: + d = await asyncio.wait_for(reader.read(4096), timeout=timeout) + if not d: + break + ret_data += d + except (asyncio.CancelledError, asyncio.TimeoutError) as e: + raise e + except (asyncio.CancelledError, asyncio.TimeoutError) as e: + raise e + except Exception as e: + logging.warning(f"{self} - ([Hidden] Send Bytes) - API Command Error {e}") + + # close the connection + logging.debug(f"{self} - ([Hidden] Send Bytes) - Closing") + writer.close() + await writer.wait_closed() + + return ret_data + + @staticmethod + def _validate_command_output(data: dict) -> tuple: + # 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 "STATUS" in data[key][0].keys(): + if data[key][0]["STATUS"][0]["STATUS"] not in ["S", "I"]: + # this is an error + return False, f"{key}: " + data[key][0]["STATUS"][0]["Msg"] + elif "id" not in data.keys(): + if isinstance(data["STATUS"], list): + if data["STATUS"][0].get("STATUS", None) in ["S", "I"]: + return True, None + else: + return False, data["STATUS"][0]["Msg"] + + elif isinstance(data["STATUS"], dict): + # new style X19 command + if data["STATUS"]["STATUS"] not in ["S", "I"]: + return False, data["STATUS"]["Msg"] + return True, None + + if data["STATUS"] not in ["S", "I"]: + return False, data["Msg"] + else: + # make sure the command succeeded + if isinstance(data["STATUS"], str): + if data["STATUS"] in ["RESTART"]: + return True, None + elif isinstance(data["STATUS"], dict): + if data["STATUS"].get("STATUS") in ["S", "I"]: + return True, None + elif data["STATUS"][0]["STATUS"] not in ("S", "I"): + # this is an error + if data["STATUS"][0]["STATUS"] not in ("S", "I"): + return False, data["STATUS"][0]["Msg"] + return True, None + + @staticmethod + def _load_api_data(data: bytes) -> dict: + # some json from the API returns with a null byte (\x00) on the end + if data.endswith(b"\x00"): + # handle the null byte + str_data = data.decode("utf-8")[:-1] + else: + # no null byte + str_data = data.decode("utf-8") + # fix an error with a btminer return having an extra comma that breaks json.loads() + str_data = str_data.replace(",}", "}") + # fix an error with a btminer return having a newline that breaks json.loads() + str_data = str_data.replace("\n", "") + # fix an error with a bmminer return not having a specific comma that breaks json.loads() + str_data = str_data.replace("}{", "},{") + # fix an error with a bmminer return having a specific comma that breaks json.loads() + str_data = str_data.replace("[,{", "[{") + # fix an error with a btminer return having a missing comma. (2023-01-06 version) + str_data = str_data.replace('""temp0', '","temp0') + # fix an error with Avalonminers returning inf and nan + str_data = str_data.replace("info", "1nfo") + str_data = str_data.replace("inf", "0") + str_data = str_data.replace("1nfo", "info") + str_data = str_data.replace("nan", "0") + # fix whatever this garbage from avalonminers is `,"id":1}` + if str_data.startswith(","): + str_data = f"{{{str_data[1:]}" + # try to fix an error with overflowing the receive buffer + # this can happen in cases such as bugged btminers returning arbitrary length error info with 100s of errors. + if not str_data.endswith("}"): + str_data = ",".join(str_data.split(",")[:-1]) + "}" + + # fix a really nasty bug with whatsminer API v2.0.4 where they return a list structured like a dict + if re.search(r"\"error_code\":\[\".+\"\]", str_data): + str_data = str_data.replace("[", "{").replace("]", "}") + + # parse the json + try: + parsed_data = json.loads(str_data) + except json.decoder.JSONDecodeError as e: + raise APIError(f"Decode Error {e}: {str_data}") + return parsed_data diff --git a/pyasic/rpc/bosminer.py b/pyasic/rpc/bosminer.py index 7abcf801..88772fb0 100644 --- a/pyasic/rpc/bosminer.py +++ b/pyasic/rpc/bosminer.py @@ -14,7 +14,7 @@ # limitations under the License. - # ------------------------------------------------------------------------------ -from pyasic.rpc import BaseMinerRPCAPI +from pyasic.rpc.base import BaseMinerRPCAPI class BOSMinerRPCAPI(BaseMinerRPCAPI): diff --git a/pyasic/rpc/btminer.py b/pyasic/rpc/btminer.py index 8d8c8270..73f6212e 100644 --- a/pyasic/rpc/btminer.py +++ b/pyasic/rpc/btminer.py @@ -30,7 +30,7 @@ from passlib.handlers.md5_crypt import md5_crypt from pyasic import settings from pyasic.errors import APIError from pyasic.misc import api_min_version -from pyasic.rpc import BaseMinerRPCAPI +from pyasic.rpc.base import BaseMinerRPCAPI ### IMPORTANT ### # you need to change the password of the miners using the Whatsminer @@ -89,7 +89,7 @@ def _add_to_16(string: str) -> bytes: return str.encode(string) # return bytes -def parse_btminer_priviledge_data(token_data: dict, data: dict): +def parse_btminer_priviledge_data(token_data: dict, data: dict) -> dict: """Parses data returned from the BTMiner privileged API. Parses data from the BTMiner privileged API using the token @@ -185,10 +185,10 @@ class BTMinerRPCAPI(BaseMinerRPCAPI): ip: The IP of the miner to reference the API on. """ - def __init__(self, ip: str, port: int = 4028, api_ver: str = "0.0.0"): + def __init__(self, ip: str, port: int = 4028, api_ver: str = "0.0.0") -> None: super().__init__(ip, port, api_ver) self.pwd = settings.get("default_whatsminer_rpc_password", "admin") - self.current_token = None + self.token = None async def multicommand(self, *commands: str, allow_warning: bool = True) -> dict: """Creates and sends multiple commands as one command to the miner. @@ -269,7 +269,7 @@ class BTMinerRPCAPI(BaseMinerRPCAPI): data = self._load_api_data(data) try: - data = parse_btminer_priviledge_data(self.current_token, data) + data = parse_btminer_priviledge_data(self.token, data) except Exception as e: logging.info(f"{str(self.ip)}: {e}") @@ -292,11 +292,11 @@ class BTMinerRPCAPI(BaseMinerRPCAPI): """ logging.debug(f"{self} - (Get Token) - Getting token") - if self.current_token: - if self.current_token[ - "timestamp" - ] > datetime.datetime.now() - datetime.timedelta(minutes=30): - return self.current_token + if self.token: + if self.token["timestamp"] > datetime.datetime.now() - datetime.timedelta( + minutes=30 + ): + return self.token # get the token data = await self.send_command("get_token") @@ -316,15 +316,13 @@ class BTMinerRPCAPI(BaseMinerRPCAPI): host_sign = tmp[3] # set the current token - self.current_token = { + self.token = { "host_sign": host_sign, "host_passwd_md5": host_passwd_md5, "timestamp": datetime.datetime.now(), } - logging.debug( - f"{self} - (Get Token) - Gathered token data: {self.current_token}" - ) - return self.current_token + logging.debug(f"{self} - (Get Token) - Gathered token data: {self.token}") + return self.token #### PRIVILEGED COMMANDS #### # Please read the top of this file to learn diff --git a/pyasic/rpc/cgminer.py b/pyasic/rpc/cgminer.py index a3cfc19f..c745907d 100644 --- a/pyasic/rpc/cgminer.py +++ b/pyasic/rpc/cgminer.py @@ -14,7 +14,7 @@ # limitations under the License. - # ------------------------------------------------------------------------------ -from pyasic.rpc import BaseMinerRPCAPI +from pyasic.rpc.base import BaseMinerRPCAPI class CGMinerRPCAPI(BaseMinerRPCAPI): diff --git a/pyasic/rpc/gcminer.py b/pyasic/rpc/gcminer.py index a4a103a7..72f8cc89 100644 --- a/pyasic/rpc/gcminer.py +++ b/pyasic/rpc/gcminer.py @@ -13,9 +13,8 @@ # See the License for the specific language governing permissions and - # limitations under the License. - # ------------------------------------------------------------------------------ -from typing import Literal -from pyasic.rpc import BaseMinerRPCAPI +from pyasic.rpc.base import BaseMinerRPCAPI class GCMinerRPCAPI(BaseMinerRPCAPI): diff --git a/pyasic/rpc/luxminer.py b/pyasic/rpc/luxminer.py index a57de6fb..63f36a2b 100644 --- a/pyasic/rpc/luxminer.py +++ b/pyasic/rpc/luxminer.py @@ -15,7 +15,7 @@ # ------------------------------------------------------------------------------ from typing import Literal -from pyasic.rpc import BaseMinerRPCAPI +from pyasic.rpc.base import BaseMinerRPCAPI class LUXMinerRPCAPI(BaseMinerRPCAPI): diff --git a/pyasic/ssh/__init__.py b/pyasic/ssh/__init__.py index 09c2696b..0146ba5f 100644 --- a/pyasic/ssh/__init__.py +++ b/pyasic/ssh/__init__.py @@ -1,47 +1,17 @@ -import asyncio -import logging -from typing import Optional - -import asyncssh - - -class MinerSSH: - def __init__(self, ip: str) -> None: - self.ip = ip - self.pwd = None - self.username = "root" - self.port = 22 - - async def _get_connection(self) -> asyncssh.connect: - """Create a new asyncssh connection""" - try: - conn = await asyncssh.connect( - str(self.ip), - port=self.port, - known_hosts=None, - username=self.username, - password=self.pwd, - server_host_key_algs=["ssh-rsa"], - ) - return conn - except asyncssh.misc.PermissionDenied as e: - raise ConnectionRefusedError from e - except Exception as e: - raise ConnectionError from e - - async def send_command(self, cmd: str) -> Optional[str]: - """Send an ssh command to the miner""" - try: - conn = await asyncio.wait_for(self._get_connection(), timeout=10) - except (ConnectionError, asyncio.TimeoutError): - return None - - try: - async with conn: - resp = await conn.run(cmd) - result = str(max(resp.stdout, resp.stderr, key=len)) - - return result - except Exception as e: - logging.error(f"{self} command {cmd} error: {e}") - return None +# ------------------------------------------------------------------------------ +# Copyright 2022 Upstream Data Inc - +# - +# Licensed under the Apache License, Version 2.0 (the "License"); - +# you may not use this file except in compliance with the License. - +# You may obtain a copy of the License at - +# - +# http://www.apache.org/licenses/LICENSE-2.0 - +# - +# Unless required by applicable law or agreed to in writing, software - +# distributed under the License is distributed on an "AS IS" BASIS, - +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - +# See the License for the specific language governing permissions and - +# limitations under the License. - +# ------------------------------------------------------------------------------ +from .antminer import AntminerModernSSH +from .braiins_os import BOSMinerSSH diff --git a/pyasic/ssh/antminer.py b/pyasic/ssh/antminer.py index e6309e7b..c1317936 100644 --- a/pyasic/ssh/antminer.py +++ b/pyasic/ssh/antminer.py @@ -1,8 +1,8 @@ from pyasic import settings -from pyasic.ssh import MinerSSH +from pyasic.ssh.base import BaseSSH -class AntminerModernSSH(MinerSSH): +class AntminerModernSSH(BaseSSH): def __init__(self, ip: str): super().__init__(ip) self.pwd = settings.get("default_antminer_ssh_password", "root") diff --git a/pyasic/ssh/base.py b/pyasic/ssh/base.py new file mode 100644 index 00000000..be75220c --- /dev/null +++ b/pyasic/ssh/base.py @@ -0,0 +1,47 @@ +import asyncio +import logging +from typing import Optional + +import asyncssh + + +class BaseSSH: + def __init__(self, ip: str) -> None: + self.ip = ip + self.pwd = None + self.username = "root" + self.port = 22 + + async def _get_connection(self) -> asyncssh.connect: + """Create a new asyncssh connection""" + try: + conn = await asyncssh.connect( + str(self.ip), + port=self.port, + known_hosts=None, + username=self.username, + password=self.pwd, + server_host_key_algs=["ssh-rsa"], + ) + return conn + except asyncssh.misc.PermissionDenied as e: + raise ConnectionRefusedError from e + except Exception as e: + raise ConnectionError from e + + async def send_command(self, cmd: str) -> Optional[str]: + """Send an ssh command to the miner""" + try: + conn = await asyncio.wait_for(self._get_connection(), timeout=10) + except (ConnectionError, asyncio.TimeoutError): + return None + + try: + async with conn: + resp = await conn.run(cmd) + result = str(max(resp.stdout, resp.stderr, key=len)) + + return result + except Exception as e: + logging.error(f"{self} command {cmd} error: {e}") + return None diff --git a/pyasic/ssh/braiins_os.py b/pyasic/ssh/braiins_os.py index a65e93de..b454daf2 100644 --- a/pyasic/ssh/braiins_os.py +++ b/pyasic/ssh/braiins_os.py @@ -1,8 +1,8 @@ from pyasic import settings -from pyasic.ssh import MinerSSH +from pyasic.ssh.base import BaseSSH -class BOSMinerSSH(MinerSSH): +class BOSMinerSSH(BaseSSH): def __init__(self, ip: str): super().__init__(ip) self.pwd = settings.get("default_bosminer_ssh_password", "root") diff --git a/pyasic/web/__init__.py b/pyasic/web/__init__.py index 6bdd3538..d5cea96c 100644 --- a/pyasic/web/__init__.py +++ b/pyasic/web/__init__.py @@ -13,86 +13,10 @@ # See the License for the specific language governing permissions and - # limitations under the License. - # ------------------------------------------------------------------------------ -from __future__ import annotations - -import warnings -from abc import ABC, abstractmethod -from typing import Any - -from pyasic.errors import APIWarning - - -class BaseWebAPI(ABC): - def __init__(self, ip: str) -> None: - # ip address of the miner - self.ip = ip - self.username = None - self.pwd = None - self.port = 80 - - self.token = None - - def __new__(cls, *args, **kwargs): - if cls is BaseWebAPI: - raise TypeError(f"Only children of '{cls.__name__}' may be instantiated") - return object.__new__(cls) - - def __repr__(self): - return f"{self.__class__.__name__}: {str(self.ip)}" - - @abstractmethod - async def send_command( - self, - command: str | bytes, - ignore_errors: bool = False, - allow_warning: bool = True, - privileged: bool = False, - **parameters: Any, - ) -> dict: - pass - - @abstractmethod - async def multicommand( - self, *commands: str, ignore_errors: bool = False, allow_warning: bool = True - ) -> dict: - pass - - def _check_commands(self, *commands): - allowed_commands = self.get_commands() - return_commands = [] - for command in [*commands]: - if command in allowed_commands: - return_commands.append(command) - else: - warnings.warn( - f"""Removing incorrect command: {command} -If you are sure you want to use this command please use WebAPI.send_command("{command}", ignore_errors=True) instead.""", - APIWarning, - ) - return return_commands - - @property - def commands(self) -> list: - return self.get_commands() - - def get_commands(self) -> list: - """Get a list of command accessible to a specific type of web API on the miner. - - Returns: - A list of all web commands that the miner supports. - """ - return [ - func - for func in - # each function in self - dir(self) - if not func == "commands" - if callable(getattr(self, func)) and - # no __ or _ methods - not func.startswith("__") and not func.startswith("_") and - # remove all functions that are in this base class - func - not in [ - func for func in dir(BaseWebAPI) if callable(getattr(BaseWebAPI, func)) - ] - ] +from .antminer import AntminerModernWebAPI, AntminerOldWebAPI +from .auradine import AuradineWebAPI +from .braiins_os import BOSerWebAPI, BOSMinerWebAPI +from .epic import ePICWebAPI +from .goldshell import GoldshellWebAPI +from .innosilicon import InnosiliconWebAPI +from .vnish import VNishWebAPI diff --git a/pyasic/web/antminer.py b/pyasic/web/antminer.py index b54627d8..fdd856f4 100644 --- a/pyasic/web/antminer.py +++ b/pyasic/web/antminer.py @@ -22,7 +22,7 @@ from typing import Any import httpx from pyasic import settings -from pyasic.web import BaseWebAPI +from pyasic.web.base import BaseWebAPI class AntminerModernWebAPI(BaseWebAPI): diff --git a/pyasic/web/auradine.py b/pyasic/web/auradine.py index 0ee09619..bd81936a 100644 --- a/pyasic/web/auradine.py +++ b/pyasic/web/auradine.py @@ -24,10 +24,10 @@ import httpx from pyasic import settings from pyasic.errors import APIError -from pyasic.web import BaseWebAPI +from pyasic.web.base import BaseWebAPI -class FluxWebAPI(BaseWebAPI): +class AuradineWebAPI(BaseWebAPI): def __init__(self, ip: str) -> None: super().__init__(ip) self.username = "admin" diff --git a/pyasic/web/base.py b/pyasic/web/base.py new file mode 100644 index 00000000..6bdd3538 --- /dev/null +++ b/pyasic/web/base.py @@ -0,0 +1,98 @@ +# ------------------------------------------------------------------------------ +# Copyright 2022 Upstream Data Inc - +# - +# Licensed under the Apache License, Version 2.0 (the "License"); - +# you may not use this file except in compliance with the License. - +# You may obtain a copy of the License at - +# - +# http://www.apache.org/licenses/LICENSE-2.0 - +# - +# Unless required by applicable law or agreed to in writing, software - +# distributed under the License is distributed on an "AS IS" BASIS, - +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - +# See the License for the specific language governing permissions and - +# limitations under the License. - +# ------------------------------------------------------------------------------ +from __future__ import annotations + +import warnings +from abc import ABC, abstractmethod +from typing import Any + +from pyasic.errors import APIWarning + + +class BaseWebAPI(ABC): + def __init__(self, ip: str) -> None: + # ip address of the miner + self.ip = ip + self.username = None + self.pwd = None + self.port = 80 + + self.token = None + + def __new__(cls, *args, **kwargs): + if cls is BaseWebAPI: + raise TypeError(f"Only children of '{cls.__name__}' may be instantiated") + return object.__new__(cls) + + def __repr__(self): + return f"{self.__class__.__name__}: {str(self.ip)}" + + @abstractmethod + async def send_command( + self, + command: str | bytes, + ignore_errors: bool = False, + allow_warning: bool = True, + privileged: bool = False, + **parameters: Any, + ) -> dict: + pass + + @abstractmethod + async def multicommand( + self, *commands: str, ignore_errors: bool = False, allow_warning: bool = True + ) -> dict: + pass + + def _check_commands(self, *commands): + allowed_commands = self.get_commands() + return_commands = [] + for command in [*commands]: + if command in allowed_commands: + return_commands.append(command) + else: + warnings.warn( + f"""Removing incorrect command: {command} +If you are sure you want to use this command please use WebAPI.send_command("{command}", ignore_errors=True) instead.""", + APIWarning, + ) + return return_commands + + @property + def commands(self) -> list: + return self.get_commands() + + def get_commands(self) -> list: + """Get a list of command accessible to a specific type of web API on the miner. + + Returns: + A list of all web commands that the miner supports. + """ + return [ + func + for func in + # each function in self + dir(self) + if not func == "commands" + if callable(getattr(self, func)) and + # no __ or _ methods + not func.startswith("__") and not func.startswith("_") and + # remove all functions that are in this base class + func + not in [ + func for func in dir(BaseWebAPI) if callable(getattr(BaseWebAPI, func)) + ] + ] diff --git a/pyasic/web/braiins_os/boser.py b/pyasic/web/braiins_os/boser.py index 3ff09a0b..e405fd29 100644 --- a/pyasic/web/braiins_os/boser.py +++ b/pyasic/web/braiins_os/boser.py @@ -25,7 +25,7 @@ from grpclib.client import Channel from pyasic import settings from pyasic.errors import APIError -from pyasic.web import BaseWebAPI +from pyasic.web.base import BaseWebAPI from .proto.braiins.bos import * from .proto.braiins.bos.v1 import * diff --git a/pyasic/web/braiins_os/bosminer.py b/pyasic/web/braiins_os/bosminer.py index 59b9e520..5d7c7e40 100644 --- a/pyasic/web/braiins_os/bosminer.py +++ b/pyasic/web/braiins_os/bosminer.py @@ -22,7 +22,7 @@ import httpx from pyasic import settings from pyasic.errors import APIError -from pyasic.web import BaseWebAPI +from pyasic.web.base import BaseWebAPI class BOSMinerWebAPI(BaseWebAPI): diff --git a/pyasic/web/epic.py b/pyasic/web/epic.py index b4bf5071..6ee150e8 100644 --- a/pyasic/web/epic.py +++ b/pyasic/web/epic.py @@ -22,7 +22,7 @@ import httpx from pyasic import settings from pyasic.errors import APIError -from pyasic.web import BaseWebAPI +from pyasic.web.base import BaseWebAPI class ePICWebAPI(BaseWebAPI): diff --git a/pyasic/web/goldshell.py b/pyasic/web/goldshell.py index 637c8f8c..db28e52b 100644 --- a/pyasic/web/goldshell.py +++ b/pyasic/web/goldshell.py @@ -22,7 +22,7 @@ from typing import Any import httpx from pyasic import settings -from pyasic.web import BaseWebAPI +from pyasic.web.base import BaseWebAPI class GoldshellWebAPI(BaseWebAPI): diff --git a/pyasic/web/innosilicon.py b/pyasic/web/innosilicon.py index db3d7fbf..ff4638b7 100644 --- a/pyasic/web/innosilicon.py +++ b/pyasic/web/innosilicon.py @@ -23,7 +23,7 @@ import httpx from pyasic import settings from pyasic.errors import APIError -from pyasic.web import BaseWebAPI +from pyasic.web.base import BaseWebAPI class InnosiliconWebAPI(BaseWebAPI): diff --git a/pyasic/web/vnish.py b/pyasic/web/vnish.py index b5ea2753..17fd9e46 100644 --- a/pyasic/web/vnish.py +++ b/pyasic/web/vnish.py @@ -22,7 +22,7 @@ from typing import Any import httpx from pyasic import settings -from pyasic.web import BaseWebAPI +from pyasic.web.base import BaseWebAPI class VNishWebAPI(BaseWebAPI): diff --git a/tests/api_tests/__init__.py b/tests/api_tests/__init__.py index 4323e396..0e6969d5 100644 --- a/tests/api_tests/__init__.py +++ b/tests/api_tests/__init__.py @@ -64,7 +64,7 @@ class TestAPIBase(unittest.IsolatedAsyncioTestCase): } ).encode("utf-8") - @patch("pyasic.rpc.BaseMinerRPCAPI._send_bytes") + @patch("pyasic.rpc.base.BaseMinerRPCAPI._send_bytes") async def test_command_error_raises_api_error(self, mock_send_bytes): if self.api is None: return @@ -73,7 +73,7 @@ class TestAPIBase(unittest.IsolatedAsyncioTestCase): with self.assertRaises(APIError): await self.api.send_command("summary") - @patch("pyasic.rpc.BaseMinerRPCAPI._send_bytes") + @patch("pyasic.rpc.base.BaseMinerRPCAPI._send_bytes") async def test_command_error_ignored_by_flag(self, mock_send_bytes): if self.api is None: return @@ -88,7 +88,7 @@ class TestAPIBase(unittest.IsolatedAsyncioTestCase): f"Expected ignore_errors flag to ignore error in {self.api_str} API" ) - @patch("pyasic.rpc.BaseMinerRPCAPI._send_bytes") + @patch("pyasic.rpc.base.BaseMinerRPCAPI._send_bytes") async def test_all_read_command_success(self, mock_send_bytes): if self.api is None: return diff --git a/tests/miners_tests/__init__.py b/tests/miners_tests/__init__.py index 3e936e86..47dfa5b4 100644 --- a/tests/miners_tests/__init__.py +++ b/tests/miners_tests/__init__.py @@ -18,7 +18,7 @@ import unittest import warnings from dataclasses import asdict -from pyasic.miners.miner_factory import MINER_CLASSES +from pyasic.miners.factory import MINER_CLASSES class MinersTest(unittest.TestCase):