Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: Update interactive installer for any node changes and test [DEV-1901] #454

Merged
merged 49 commits into from
Dec 1, 2022
Merged
Changes from 39 commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
e387b5f
replace moniker = 'validator-1' value
benyam7 Nov 25, 2022
7e50462
replace external address
benyam7 Nov 25, 2022
5229694
replace seeds
benyam7 Nov 25, 2022
32d4dd6
replace laddr in p2p section
benyam7 Nov 25, 2022
c2fdd73
replace laddr in rpc section
benyam7 Nov 25, 2022
8ef4446
fix typo
benyam7 Nov 25, 2022
34f72d1
replace min gas price in app.toml
benyam7 Nov 25, 2022
921bebf
use constants
benyam7 Nov 25, 2022
e740fec
fix typo
benyam7 Nov 25, 2022
1af88f3
add cheqd-noded init back
benyam7 Nov 25, 2022
93fd2a4
search and replace using python
Nov 28, 2022
57372d6
use format
Nov 28, 2022
df3491d
add trailing spaces
Nov 28, 2022
7ba5e5a
replace p2p and rpc laddrs
Nov 28, 2022
8f3e823
fix rpc search text
Nov 28, 2022
93d3709
fix rpc laddr
Nov 28, 2022
01acae1
fix min gas price
Nov 28, 2022
857c2d1
Make RPC port listen to world by default
ankurdotb Nov 28, 2022
efbbd7f
Update line breaks
ankurdotb Nov 28, 2022
bd7bfa6
review changes
Nov 29, 2022
d51583a
fix setting default external address value
benyam7 Nov 29, 2022
a058728
Merge branch 'fix-installer' of https://github.com/cheqd/cheqd-node i…
benyam7 Nov 29, 2022
598b9a5
manually set external_address and dont use decorator
benyam7 Nov 29, 2022
7c6b2de
fix setting external address
benyam7 Nov 29, 2022
cdbcfc8
add debug logs
benyam7 Nov 29, 2022
7cfb675
execute getting external address inside post_install
benyam7 Nov 29, 2022
445cefb
add debug logs
benyam7 Nov 29, 2022
ca7c3d0
cast stdout value to str
benyam7 Nov 29, 2022
844b78b
strip special characters
benyam7 Nov 29, 2022
3e2a81d
remove logs
benyam7 Nov 29, 2022
60cee13
remake RPC listen to anyone
benyam7 Nov 29, 2022
4817cb3
fix typo
benyam7 Nov 29, 2022
251c033
remove v prefix form version text
benyam7 Nov 30, 2022
e79c5b6
ask for persistent peers
benyam7 Nov 30, 2022
65f75d6
ask for log level
benyam7 Nov 30, 2022
8f2ba23
ask for log format
benyam7 Nov 30, 2022
fac85d5
set create_empty_blocks to false by default
benyam7 Nov 30, 2022
185314e
fix default value for persistent peers
benyam7 Nov 30, 2022
07d5e31
tell possible options for log level and log format
benyam7 Nov 30, 2022
f275047
Clarified help/interviewer text
ankurdotb Dec 1, 2022
bf779fe
Fix linter
ankurdotb Dec 1, 2022
f97da8b
make search and replace to handle replaces by substr matches
benyam7 Dec 1, 2022
352e122
search by substr for log_level and log_format
benyam7 Dec 1, 2022
0174af0
Merge branch 'fix-installer' of https://github.com/cheqd/cheqd-node i…
benyam7 Dec 1, 2022
237d433
search by substring for min gas
benyam7 Dec 1, 2022
feee472
fix at external_address
benyam7 Dec 1, 2022
8490f55
fix at log format
benyam7 Dec 1, 2022
4eaa6c1
replace special characters
benyam7 Dec 1, 2022
e22c139
Update option instructions for logging
ankurdotb Dec 1, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
125 changes: 112 additions & 13 deletions installer/installer.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,14 +74,21 @@
DEFAULT_RPC_PORT = "26657"
DEFAULT_P2P_PORT = "26656"
DEFAULT_GAS_PRICE = "25ncheq"

DEFAULT_LOG_LEVEL = "error"
DEFAULT_LOG_FORMAT = "json"

def sigint_handler(signal, frame):
print ('Exiting from cheqd-node installer')
sys.exit(0)

signal.signal(signal.SIGINT, sigint_handler)

def search_and_replace(search_text, replace_text, file_path):
with open(file_path, 'r') as file:
data = file.read()
data = data.replace(search_text, replace_text)
with open(file_path, 'w') as file:
file.write(data)

class Release:
def __init__(self, release_map):
Expand All @@ -96,7 +103,8 @@ def get_release_url(self):
os_name = platform.system()
for _url_item in self.assets:
_url = _url_item["browser_download_url"]
if os.path.basename(_url) == f"cheqd-noded-{self.version}-{os_name}-{os_arch}.tar.gz" or \
version_without_v_prefix = self.version.replace('v','',1)
if os.path.basename(_url) == f"cheqd-noded-{version_without_v_prefix}-{os_name}-{os_arch}.tar.gz" or \
os.path.basename(_url) == "cheqd-noded":
return _url
else:
Expand Down Expand Up @@ -419,29 +427,77 @@ def post_install(self):
# Init the node with provided moniker
if not os.path.exists(os.path.join(self.cheqd_config_dir, 'genesis.json')):
self.exec(f"""sudo su -c 'cheqd-noded init "{self.interviewer.moniker}"' {DEFAULT_CHEQD_USER}""")

# Downloading genesis file
self.exec(f"curl {GENESIS_FILE.format(self.interviewer.chain)} > {os.path.join(self.cheqd_config_dir, 'genesis.json')}")
shutil.chown(os.path.join(self.cheqd_config_dir, 'genesis.json'),
DEFAULT_CHEQD_USER,
DEFAULT_CHEQD_USER)

# Replace the default RCP port to listen to anyone
rpc_default_value= 'laddr = "tcp://127.0.0.1:{}"'.format(DEFAULT_RPC_PORT)
new_rpc_default_value = 'laddr = "tcp://0.0.0.0:{}"'.format(DEFAULT_RPC_PORT)
search_and_replace(rpc_default_value,new_rpc_default_value, os.path.join(self.cheqd_config_dir, "config.toml"))

# Set create empty blocks to false by default
create_empty_blocks_search_text = 'create_empty_blocks = true'
create_empty_blocks_replace_text = 'create_empty_blocks = false'
search_and_replace(create_empty_blocks_search_text,create_empty_blocks_replace_text, os.path.join(self.cheqd_config_dir, "config.toml"))

# Setting up the external_address
if self.interviewer.external_address:
self.exec(f"sudo su -c 'cheqd-noded configure p2p external-address {self.interviewer.external_address}:{self.interviewer.p2p_port}' {DEFAULT_CHEQD_USER}")
external_address_search_text='external_address = ""'
external_address_replace_text='external_address = "{}:{}"'.format(self.interviewer.external_address, self.interviewer.p2p_port)
search_and_replace(external_address_search_text, external_address_replace_text, os.path.join(self.cheqd_config_dir, "config.toml"))

# Setting up the seeds
seeds = self.exec(f"curl {SEEDS_FILE.format(self.interviewer.chain)}").stdout.decode("utf-8").strip()
self.exec(f"sudo su -c 'cheqd-noded configure p2p seeds {seeds}' {DEFAULT_CHEQD_USER}")

seeds_search_text = 'seeds = ""'
seeds_replace_text= 'seeds = "{}"'.format(seeds)
search_and_replace(seeds_search_text, seeds_replace_text, os.path.join(self.cheqd_config_dir, "config.toml"))

# Setting up the RPC port
self.exec(f"sudo su -c 'cheqd-noded configure rpc-laddr \"tcp://0.0.0.0:{self.interviewer.rpc_port}\"' {DEFAULT_CHEQD_USER}")

if self.interviewer.rpc_port:
rpc_laddr_search_text= 'laddr = "tcp://0.0.0.0:{}"'.format(DEFAULT_RPC_PORT)
rpc_laddr_replace_text= 'laddr = "tcp://0.0.0.0:{}"'.format(self.interviewer.rpc_port)
search_and_replace(rpc_laddr_search_text,rpc_laddr_replace_text, os.path.join(self.cheqd_config_dir, "config.toml"))
# Setting up the P2P port
self.exec(f"sudo su -c 'cheqd-noded configure p2p laddr \"tcp://0.0.0.0:{self.interviewer.p2p_port}\"' {DEFAULT_CHEQD_USER}")

if self.interviewer.p2p_port:
p2p_laddr_search_text='laddr = "tcp://0.0.0.0:{}"'.format(DEFAULT_P2P_PORT)
p2p_laddr_replace_text='laddr = "tcp://0.0.0.0:{}"'.format(self.interviewer.p2p_port)
search_and_replace(p2p_laddr_search_text,p2p_laddr_replace_text, os.path.join(self.cheqd_config_dir, "config.toml"))

# Setting up min gas-price
self.exec(f"sudo su -c 'cheqd-noded configure min-gas-prices {self.interviewer.gas_price}' {DEFAULT_CHEQD_USER}")
if self.interviewer.gas_price:
min_gas_price_search_text='minimum-gas-prices = "{}"'.format(DEFAULT_GAS_PRICE)
min_gas_price_replace_text = 'minimum-gas-prices = "{}"'.format(self.interviewer.gas_price)
search_and_replace(min_gas_price_search_text, min_gas_price_replace_text, os.path.join(self.cheqd_config_dir, "app.toml"))

# Setting up persistent peers
if self.interviewer.persistent_peers:
persistent_peers_search_text='persistent_peers = ""'
persistent_peers_replace_text='persistent_peers = "{}"'.format(self.interviewer.persistent_peers)
search_and_replace(persistent_peers_search_text,persistent_peers_replace_text, os.path.join(self.cheqd_config_dir, "config.toml"))

# Setting up log level
if self.interviewer.log_level:
log_level_search_text = 'log_level = "info"'
log_level_replace_text = 'log_level = "{}"'.format(self.interviewer.log_level)
search_and_replace(log_level_search_text, log_level_replace_text, os.path.join(self.cheqd_config_dir, "config.toml"))
else:
log_level_search_text = 'log_level = "info"'
log_level_replace_text = 'log_level = "{}"'.format(DEFAULT_LOG_LEVEL)
search_and_replace(log_level_search_text, log_level_replace_text, os.path.join(self.cheqd_config_dir, "config.toml"))

# Setting up log format
if self.interviewer.log_format:
log_format_search_text = 'log_format = "plain"'
log_format_replace_text = 'log_format = "{}"'.format(self.interviewer.log_format)
search_and_replace(log_format_search_text, log_format_replace_text, os.path.join(self.cheqd_config_dir, "config.toml"))
else:
log_format_search_text = 'log_format = "plain"'
log_format_replace_text = 'log_format = "{}"'.format(DEFAULT_LOG_FORMAT)
search_and_replace(log_format_search_text, log_format_replace_text, os.path.join(self.cheqd_config_dir, "config.toml"))

def prepare_cheqd_user(self):
try:
Expand Down Expand Up @@ -614,6 +670,9 @@ def __init__(self,
self._rpc_port = DEFAULT_RPC_PORT
self._p2p_port = DEFAULT_P2P_PORT
self._gas_price = DEFAULT_GAS_PRICE
self._persistent_peers = ""
self._log_level = DEFAULT_LOG_LEVEL
self._log_format = DEFAULT_LOG_FORMAT
self._is_from_scratch = False
self._rewrite_systemd = False
self._rewrite_rsyslog = False
Expand Down Expand Up @@ -699,6 +758,18 @@ def p2p_port(self) -> str:
@property
def gas_price(self) -> str:
return self._gas_price

@property
def persistent_peers(self) -> str:
return self._persistent_peers

@property
def log_level(self) -> str:
return self._log_level

@property
def log_format(self) -> str:
return self._log_format

@release.setter
def release(self, release):
Expand Down Expand Up @@ -767,6 +838,18 @@ def p2p_port(self, p2p_port):
@gas_price.setter
def gas_price(self, gas_price):
self._gas_price = gas_price

@persistent_peers.setter
def persistent_peers(self, persistent_peers):
self._persistent_peers = persistent_peers

@log_level.setter
def log_level(self, log_level):
self._log_level = log_level

@log_format.setter
def log_format(self, log_format):
self._log_format = log_format

def log(self, msg):
if self.verbose:
Expand Down Expand Up @@ -947,11 +1030,12 @@ def ask_for_moniker(self):
def ask_for_external_address(self):
answer = self.ask(
f"What is the externally-reachable IP address or DNS name for your cheqd-node? [default: Fetch automatically via DNS resolver lookup]: {os.linesep}")
if answer is not None:
if answer:
self.external_address = answer

else:
try:
self.external_address = self.exec("dig +short txt ch whoami.cloudflare @1.1.1.1").stdout.replace('"', '').strip()
self.external_address = str(self.exec("dig +short txt ch whoami.cloudflare @1.1.1.1").stdout).strip("""b'""\\n""")
except:
failure_exit(f"Unable to fetch external IP address for your node.")

Expand All @@ -967,6 +1051,18 @@ def ask_for_gas_price(self):
self.gas_price = self.ask(
f"Specify minimum gas price for transactions", default=DEFAULT_GAS_PRICE)

def ask_for_persistent_peers(self):
self.persistent_peers = self.ask(
f"Specify persistent peers [default: blank, file has blank/no value]")

def ask_for_log_level(self):
self.log_level = self.ask(
f"Specify log level (error/info)", default=DEFAULT_LOG_LEVEL)

def ask_for_log_format(self):
self.log_format = self.ask(
f"Specify log format (json/plain)", default=DEFAULT_LOG_FORMAT)

def prepare_url_for_latest(self) -> str:
template = TESTNET_SNAPSHOT if self.chain == "testnet" else MAINNET_SNAPSHOT
_date = datetime.date.today()
Expand Down Expand Up @@ -1005,6 +1101,9 @@ def install_steps():
interviewer.ask_for_rpc_port()
interviewer.ask_for_p2p_port()
interviewer.ask_for_gas_price()
interviewer.ask_for_persistent_peers()
interviewer.ask_for_log_level()
interviewer.ask_for_log_format()

# Steps to execute if upgrading existing node
def upgrade_steps():
Expand Down