-
Notifications
You must be signed in to change notification settings - Fork 0
/
poktrolld.py
175 lines (134 loc) · 5.24 KB
/
poktrolld.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
import os
import platform
import subprocess
import sys
import tarfile
import gdown
import requests
import streamlit as st
from requests.exceptions import RequestException
# Chain configs
CHAIN_ID = "poktroll"
# Ecosystem Configs
EXPLORER_URL = "https://shannon.testnet.pokt.network/poktroll"
# Environment configs
POCKET_ENV = os.getenv("POCKET_ENV", "testnet")
def is_localnet() -> bool:
return POCKET_ENV == "localnet"
# TestNet
POCKET_RPC_NODE_TESTNET = "https://testnet-validated-validator-rpc.poktroll.com"
POCKET_GRPC_NODE_TESTNET = "https://testnet-validated-validator-grpc.poktroll.com"
# LocalNet
POCKET_RPC_NODE_LOCALNET = "tcp://127.0.0.1:26657"
POCKET_GRPC_NODE_LOCALNET = "tcp://127.0.0.1:9090"
# General
POCKET_RPC_NODE = POCKET_RPC_NODE_LOCALNET if is_localnet() else POCKET_RPC_NODE_TESTNET
POCKET_GRPC_NODE = POCKET_GRPC_NODE_LOCALNET if is_localnet() else POCKET_GRPC_NODE_TESTNET
# Account source configs
POKTROLLD_HOME = os.getenv("POKTROLLD_HOME", "./")
if len(POKTROLLD_HOME) == 0 or not os.path.exists(POKTROLLD_HOME):
raise Exception("POKTROLLD_HOME is not set or does not exist!")
# Binary command configs
POKTROLLD_BIN_PATH = "./poktrolld"
CMD_SHARE_JSON_OUTPUT = ["--output", "json"]
CMD_SHARED_ARGS_NODE = [
"--node",
POCKET_RPC_NODE,
"--chain-id",
CHAIN_ID,
]
CMD_SHARED_ARGS_KEYRING = ["--home", POKTROLLD_HOME, "--keyring-backend", "test"]
def get_architecture():
"""Determine the platform and architecture."""
system = platform.system().lower() # 'linux', 'darwin', etc.
machine = platform.machine().lower() # 'x86_64', 'arm64', etc.
if system not in ["linux", "darwin"]:
print(f"Unsupported OS: {system}")
sys.exit(1)
if machine in ["x86_64", "amd64"]:
arch = "amd64"
elif machine in ["arm64", "aarch64"]:
arch = "arm64"
else:
print(f"Unsupported architecture: {machine}")
sys.exit(1)
return f"{system}_{arch}"
def get_latest_release_url(arch):
"""Fetch the latest release from GitHub and find the matching asset URL."""
url = "https://github.com/repos/pokt-network/poktroll/releases/latest"
response = requests.get(url)
if response.status_code != 200:
print(f"Failed to fetch latest release: {response.status_code}")
sys.exit(1)
assets = response.json().get("assets", [])
for asset in assets:
if f"poktroll_{arch}.tar.gz" in asset["browser_download_url"]:
return asset["browser_download_url"]
print(f"No matching release found for {arch}")
sys.exit(1)
def download_file(url, filename):
"""Download the file from the given URL."""
response = requests.get(url, stream=True)
if response.status_code == 200:
with open(filename, "wb") as f:
for chunk in response.iter_content(chunk_size=8192):
f.write(chunk)
else:
print(f"Failed to download file: {response.status_code}")
sys.exit(1)
def extract_tarball(filename):
"""Extract the tar.gz file."""
if tarfile.is_tarfile(filename):
with tarfile.open(filename) as tar:
tar.extractall()
print(f"Extracted {filename} successfully.")
else:
print(f"{filename} is not a valid tar file.")
sys.exit(1)
# Cache poktrolld binary into memory so it's available across different Streamlit sessions
@st.cache_resource
def download_poktrolld() -> bytes:
# Check if the binary already exists
if is_poktrolld_available():
print("Loading cached poktrolld")
return load_poktrolld()
try:
arch = get_architecture()
print(f"Detected architecture: {arch}")
url = get_latest_release_url(arch)
print(f"Downloading from: {url}")
tarball_filename = url.split("/")[-1]
download_file(url, tarball_filename)
extract_tarball(tarball_filename)
os.remove(tarball_filename) # Remove the tarball after extraction
if not is_poktrolld_available():
raise Exception("poktrolld binary not found after extraction")
os.chmod(POKTROLLD_BIN_PATH, 0o755) # Expecting
print("poktrolld binary downloaded and ready to use!")
except RequestException as e:
st.error(f"An error occurred while downloading poktrolld: {e}")
st.stop()
except Exception as e:
st.error(f"An unexpected error occurred: {e}")
st.stop()
return load_poktrolld()
# Load a binary executable into memory as bytes
def load_poktrolld() -> bytes:
with open(POKTROLLD_BIN_PATH, "rb") as f:
binary_data = f.read() # Load the file into memory as bytes
return binary_data
# Function to write binary data to disk
def write_poktrolld_to_disk(binary_data: str) -> bool:
with open(POKTROLLD_BIN_PATH, "wb") as f:
f.write(binary_data) # Write the binary data to a new file
try:
# Run the chmod +x command to make the file executable
subprocess.run(["chmod", "+x", POKTROLLD_BIN_PATH], check=True)
print(f"{POKTROLLD_BIN_PATH} is now executable.")
return True
except subprocess.CalledProcessError as e:
print(f"Error: {e}")
return False
# Check if the poktrolld binary is available on disk
def is_poktrolld_available() -> bool:
return os.path.exists(POKTROLLD_BIN_PATH)