Skip to content
This repository was archived by the owner on Aug 29, 2023. It is now read-only.

Commit c1568c1

Browse files
Merge pull request #4 from provenance-io/mtps/split-out-commands
Mtps/split out commands
2 parents ea7f261 + a0acac6 commit c1568c1

File tree

13 files changed

+566
-281
lines changed

13 files changed

+566
-281
lines changed

README.md

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ The Provenance Blockchain Manager is an application for automated startup of nod
66
## Usage
77
In order to execute wizard, run:
88
```sh
9-
forge
9+
forge interactive
1010
```
11-
* You will be prompted on what you want PBPM to do. Selecting to bootstrap a node will allow you to select mainnet, testnet, or localnet.
11+
* You will be prompted on what you want Forge to do. Selecting to bootstrap a node will allow you to select mainnet, testnet, or localnet.
1212

1313
* Selecting any of the listed 3 would clone the [Provenance Repository](https://github.com/provenance-io/provenance) if it doesn't already exist, then the version information would be gathered either from the user in the case of localnet, or from mainnet/testnet information on github.
1414

@@ -19,17 +19,18 @@ forge
1919

2020
To get you started with a couple commands:
2121

22-
Initialize and possibly start a mainnet node without wizard:
22+
Initialize and start a localnet node with default values:
2323
```sh
24-
forge -ba WITH_CLEVELDB=no -n mainnet
25-
```
26-
Initialize and possibly start a localnet:
27-
```sh
28-
forge -rv v1.7.5 -ba WITH_CLEVELDB=no -n localnet -m aMoniker -cid theChainId
24+
forge node start
2925
```
3026
For a list of all commands:
3127
```sh
3228
forge --help
3329
```
30+
You can also drill into the individual commands for more help and additional commands:
31+
```sh
32+
forge node --help
33+
```
34+
3435
## Version Info
3536
* Python 3.6

forgepb/__main__.py

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
1-
import os
2-
import sys
3-
4-
# Development mode.
5-
if os.getenv("DEBUG"):
6-
print("DEBUG is set, injecting '.' into sys.path for local module lookup")
7-
sys.path.insert(0, '.')
8-
9-
from forgepb.command_line import start
1+
from command_line import root_cmd
102

113
if __name__ == '__main__':
12-
start()
4+
try:
5+
root_cmd()
6+
exit(0)
7+
except Exception as e:
8+
print(e)
9+
exit(1)

forgepb/builder.py

Lines changed: 72 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,16 @@
1313
def build(environment, network, config, provenance_branch=None, version=None, args=[], moniker=None, chain_id=None, start_node=None):
1414
root_path = config['saveDir'] + "forge"
1515
provenance_path = config['saveDir'] + "forge" + "/provenance"
16+
if not os.path.exists(provenance_path):
17+
print("Cloning Repository for binary construction, this can take a few seconds...")
18+
git.Repo.clone_from(global_.PROVENANCE_REPO, provenance_path)
1619
# Get version and checkout to proper provenance tag
1720
if not version and not provenance_branch:
1821
version = utils.get_version_info(network, environment, provenance_path)
1922
elif not provenance_branch and version:
20-
if version and version not in utils.get_versions(provenance_path):
21-
print("The version entered doesn't exist in provenance. Please run 'forge -lsv' to list all versions")
23+
if version and version not in utils.get_versions():
24+
print(
25+
"The version entered doesn't exist in provenance. Please run 'forge -lsv' to list all versions")
2226
exit()
2327
repo = git.Repo(provenance_path)
2428
repo.git.reset('--hard')
@@ -30,16 +34,15 @@ def build(environment, network, config, provenance_branch=None, version=None, ar
3034
repo.git.checkout("-f", version)
3135
elif provenance_branch:
3236
version = provenance_branch
37+
branches = utils.get_remote_branches()
3338
repo = git.Repo(provenance_path)
34-
repo.git.reset('--hard')
35-
repo.git.checkout('main')
36-
repo.remotes.origin.pull()
39+
print(branches)
3740
try:
38-
branches = [branch.name for branch in repo.remote().refs]
3941
if provenance_branch in branches:
4042
repo.git.checkout(provenance_branch)
4143
else:
42-
print("The entered branch, {}, does not exist.".format(provenance_branch))
44+
print("The entered branch, {}, does not exist.".format(
45+
provenance_branch))
4346
exit()
4447
except git.exc.GitCommandError:
4548
repo.git.checkout("-f", provenance_branch)
@@ -61,7 +64,7 @@ def build(environment, network, config, provenance_branch=None, version=None, ar
6164
copyfile(go_path, "{}/bin/provenanced".format(build_path))
6265
st = os.stat(build_path + "/bin/provenanced")
6366
os.chmod(build_path + "/bin/provenanced", st.st_mode | stat.S_IEXEC)
64-
67+
6568
# Collect moniker and chain id if they aren't given
6669
if not moniker or not chain_id:
6770
version_data = utils.collect_moniker_chain_id(version, config)
@@ -81,14 +84,18 @@ def build(environment, network, config, provenance_branch=None, version=None, ar
8184
utils.save_config(config)
8285

8386
validator_info = populate_genesis(build_path, moniker, chain_id)
84-
utils.persist_localnet_information(build_path, config, version, validator_info)
85-
86-
run_command = "{}/bin/provenanced start --home {}".format(build_path, build_path).split(" ")
87-
log_path = '{}/logs/{}.txt'.format(build_path, str(datetime.datetime.now()).replace(' ', '-'))
87+
utils.persist_localnet_information(
88+
build_path, config, version, validator_info)
89+
90+
run_command = "{}/bin/provenanced start --home {}".format(
91+
build_path, build_path).split(" ")
92+
log_path = '{}/logs/{}.txt'.format(build_path,
93+
str(datetime.datetime.now()).replace(' ', '-'))
8894
if(start_node):
8995
spawnDaemon(run_command, version, network, config, log_path)
9096
else:
91-
utils.take_start_node_input(run_command, version, network, config, log_path)
97+
utils.take_start_node_input(
98+
run_command, version, network, config, log_path)
9299

93100
# Handle mainnet and testnet node construction
94101
else:
@@ -117,55 +124,76 @@ def build(environment, network, config, provenance_branch=None, version=None, ar
117124
while not genesis_complete:
118125
try:
119126
if os.path.exists(build_path + "/config/genesis.json"):
120-
download_genesis = input("The genesis file already exists, would you like to overwrite the existing file?[y]/n:\n")
127+
download_genesis = input(
128+
"The genesis file already exists, would you like to overwrite the existing file?[y]/n:\n")
121129
if not download_genesis or download_genesis.lower() == 'y':
122130
print("Downloading genesis file...")
123-
genesis_json_res = requests.get(global_.GENESIS_JSON_URL.format(network, environment)).text
124-
open(build_path + "/config/genesis.json", 'w').write(genesis_json_res)
131+
genesis_json_res = requests.get(
132+
global_.GENESIS_JSON_URL.format(network, environment)).text
133+
open(build_path + "/config/genesis.json",
134+
'w').write(genesis_json_res)
125135
genesis_complete = True
126136
else:
127-
genesis_json_res = requests.get(global_.GENESIS_JSON_URL.format(network, environment)).text
128-
open(build_path + "/config/genesis.json", 'w').write(genesis_json_res)
137+
genesis_json_res = requests.get(
138+
global_.GENESIS_JSON_URL.format(network, environment)).text
139+
open(build_path + "/config/genesis.json",
140+
'w').write(genesis_json_res)
129141
genesis_complete = True
130142
except ValueError as e:
131143
print(e)
132144
continue
133-
134145

135146
# Take seed information for testnet and mainnet
136147
if network == "testnet":
137148
seed_info = global_.TESTNET_SEEDS
138149
else:
139150
seed_info = global_.MAINNET_SEEDS
140-
151+
141152
if network not in config:
142153
config[network] = {}
143154
config[network]['version'] = version
144155
utils.save_config(config)
145156

146-
run_command = "{}/bin/provenanced start {} --home {}".format(build_path, seed_info, build_path).split(" ")
147-
log_path = '{}/logs/{}.txt'.format(build_path, str(datetime.datetime.now()).replace(' ', '-'))
157+
run_command = "{}/bin/provenanced start {} --home {}".format(
158+
build_path, seed_info, build_path).split(" ")
159+
log_path = '{}/logs/{}.txt'.format(build_path,
160+
str(datetime.datetime.now()).replace(' ', '-'))
148161

149162
if(start_node):
150163
spawnDaemon(run_command, version, network, config, log_path)
151164
else:
152-
utils.take_start_node_input(run_command, version, network, config, log_path)
165+
utils.take_start_node_input(
166+
run_command, version, network, config, log_path)
153167

154168
# Localnet generate genesis and gentx
169+
170+
155171
def populate_genesis(build_path, moniker, chain_id):
156-
command1 = "{}/bin/provenanced --home {} init {} --chain-id {};".format(build_path, build_path, moniker, chain_id)
157-
command2 = "{}/bin/provenanced --home {} keys add validator --keyring-backend test 2>&1;".format(build_path, build_path, build_path)
158-
command3 = "{}/bin/provenanced --home {} add-genesis-root-name validator pio --keyring-backend test 2>&- || echo pio root name already exists, skipping...;".format(build_path, build_path)
159-
command3 += "{}/bin/provenanced --home {} add-genesis-root-name validator pb --restrict=false --keyring-backend test 2>&- || echo pb root name already exists, skipping...;".format(build_path, build_path)
160-
command3 += "{}/bin/provenanced --home {} add-genesis-root-name validator io --restrict --keyring-backend test 2>&- || echo io root name already exists, skipping...;".format(build_path, build_path)
161-
command3 += "{}/bin/provenanced --home {} add-genesis-root-name validator provenance --keyring-backend test 2>&- || echo validator root name already exists, skipping...;".format(build_path, build_path)
162-
command3 += "{}/bin/provenanced --home {} add-genesis-account validator 100000000000000000000nhash --keyring-backend test 2>&-;".format(build_path, build_path)
163-
command3 += "{}/bin/provenanced --home {} gentx validator 1000000000000000nhash --keyring-backend test --chain-id={} 2>&- || echo gentx file already exists, skipping;".format(build_path, build_path, chain_id)
164-
command3 += "{}/bin/provenanced --home {} add-genesis-marker 100000000000000000000nhash --manager validator --access mint,burn,admin,withdraw,deposit --activate --keyring-backend test 2>&- || echo existing address, skipping;".format(build_path, build_path)
165-
command3 += "{}/bin/provenanced --home {} collect-gentxs".format(build_path, build_path)
166-
validator_check_command = "{}/bin/provenanced --home {} keys show validator".format(build_path, build_path)
172+
command1 = "{}/bin/provenanced --home {} init {} --chain-id {};".format(
173+
build_path, build_path, moniker, chain_id)
174+
command2 = "{}/bin/provenanced --home {} keys add validator --keyring-backend test 2>&1;".format(
175+
build_path, build_path, build_path)
176+
command3 = "{}/bin/provenanced --home {} add-genesis-root-name validator pio --keyring-backend test 2>&- || echo pio root name already exists, skipping...;".format(
177+
build_path, build_path)
178+
command3 += "{}/bin/provenanced --home {} add-genesis-root-name validator pb --restrict=false --keyring-backend test 2>&- || echo pb root name already exists, skipping...;".format(
179+
build_path, build_path)
180+
command3 += "{}/bin/provenanced --home {} add-genesis-root-name validator io --restrict --keyring-backend test 2>&- || echo io root name already exists, skipping...;".format(
181+
build_path, build_path)
182+
command3 += "{}/bin/provenanced --home {} add-genesis-root-name validator provenance --keyring-backend test 2>&- || echo validator root name already exists, skipping...;".format(
183+
build_path, build_path)
184+
command3 += "{}/bin/provenanced --home {} add-genesis-account validator 100000000000000000000nhash --keyring-backend test 2>&-;".format(
185+
build_path, build_path)
186+
command3 += "{}/bin/provenanced --home {} gentx validator 1000000000000000nhash --keyring-backend test --chain-id={} 2>&- || echo gentx file already exists, skipping;".format(
187+
build_path, build_path, chain_id)
188+
command3 += "{}/bin/provenanced --home {} add-genesis-marker 100000000000000000000nhash --manager validator --access mint,burn,admin,withdraw,deposit --activate --keyring-backend test 2>&- || echo existing address, skipping;".format(
189+
build_path, build_path)
190+
command3 += "{}/bin/provenanced --home {} collect-gentxs".format(
191+
build_path, build_path)
192+
validator_check_command = "{}/bin/provenanced --home {} keys show validator".format(
193+
build_path, build_path)
167194
os.system(command1)
168-
validator_check_process = subprocess.Popen(validator_check_command, shell=True, stdout=subprocess.PIPE)
195+
validator_check_process = subprocess.Popen(
196+
validator_check_command, shell=True, stdout=subprocess.PIPE)
169197
validator_check_process.wait()
170198
validators_out, err = validator_check_process.communicate()
171199
if validators_out.decode('utf-8').startswith('- name:'):
@@ -177,9 +205,10 @@ def populate_genesis(build_path, moniker, chain_id):
177205
os.system(command3)
178206
return out.decode('utf-8')
179207

208+
180209
def spawnDaemon(node_command, version, network, config, log_path):
181-
try:
182-
pid = os.fork()
210+
try:
211+
pid = os.fork()
183212
if pid > 0:
184213
return
185214
except OSError as e:
@@ -190,19 +219,21 @@ def spawnDaemon(node_command, version, network, config, log_path):
190219
try:
191220
pid = os.fork()
192221
if pid > 0:
193-
exit()
222+
return
194223
except OSError as e:
195224
print("fork #1 failed: {} ({})".format(e.errno, e.strerror))
196225

197226
start_node(node_command, version, network, config, log_path)
198227

199228
os._exit(os.EX_OK)
200229

230+
201231
def start_node(node_command, version, network, config, log_path):
202232
log = open(log_path, 'w+')
203-
print('Running {}'.format(node_command))
233+
print('Running {}'.format(''.join(node_command)))
204234
print('You can view the logs here: {}'.format(log_path))
205-
process = subprocess.Popen(node_command, shell=False, stdout=log, stderr=log)
235+
process = subprocess.Popen(
236+
node_command, shell=False, stdout=log, stderr=log)
206237
if network == 'localnet':
207238
config[network][version]['run-command'] = node_command
208239
config[network][version]['log-path'] = log_path
@@ -216,4 +247,4 @@ def start_node(node_command, version, network, config, log_path):
216247
"network": network
217248
}
218249
utils.save_config(config)
219-
process.wait()
250+
process.wait()

forgepb/cmd/__init__.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import click
2+
3+
from cmd.node import *
4+
from cmd.config import *
5+
from cmd.provenance import *
6+
7+
8+
@click.group("node", help="Interact with nodes")
9+
def node_cmd(): pass
10+
11+
12+
@click.group("config")
13+
def config_cmd(): pass
14+
15+
@click.group("provenance", help="Retrieve information on provenance")
16+
def provenance_cmd(): pass
17+
18+
19+
# Hook up sub commands for node management.
20+
node_cmd.add_command(node_stop_cmd)
21+
node_cmd.add_command(node_start_cmd)
22+
node_cmd.add_command(node_status_cmd)
23+
node_cmd.add_command(node_init_cmd)
24+
node_cmd.add_command(list_mnemonic_cmd)
25+
26+
config_cmd.add_command(list_config_cmd)
27+
config_cmd.add_command(change_save_loc_cmd)
28+
29+
provenance_cmd.add_command(list_tags_cmd)
30+
provenance_cmd.add_command(list_branches_cmd)

forgepb/cmd/config.py

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
import json
2+
import os
3+
import click
4+
5+
from forgepb import utils, builder, forge, config_handler, global_
6+
7+
8+
@click.command(
9+
'list',
10+
help='List config information about localnet nodes that have been initialized'
11+
)
12+
@click.option(
13+
"-t",
14+
"--tag",
15+
"tag",
16+
default=None,
17+
help="Release tag used to specify the localnet config to display")
18+
@click.option(
19+
'-b',
20+
'--provenance-branch',
21+
'provenance_branch',
22+
type=click.STRING,
23+
help='Provenance branch used to specify the localnet config to display')
24+
def list_config_cmd(tag, provenance_branch):
25+
# get config or set location of config to be made
26+
if not os.path.exists(global_.CONFIG_PATH + "/config.json"):
27+
config = config_handler.set_build_location()
28+
else:
29+
config = utils.load_config()
30+
provenance_path = config['saveDir'] + "forge" + "/provenance"
31+
# Retrieve the config information if it exists, else display a message saying that it couldn't be found
32+
try:
33+
if tag:
34+
if tag not in utils.get_versions():
35+
print(
36+
"The version entered doesn't exist in provenance. Please run 'forge -lsv' to list all versions")
37+
else:
38+
print(json.dumps(config['localnet'][tag], indent=4))
39+
elif provenance_branch:
40+
if provenance_branch not in utils.get_remote_branches():
41+
print(
42+
"The version entered doesn't exist in provenance. Please run 'forge -lsv' to list all versions")
43+
else:
44+
print(json.dumps(config['localnet']
45+
[provenance_branch], indent=4))
46+
else:
47+
print(json.dumps(config['localnet'], indent=4))
48+
except KeyError:
49+
print("No nodes found.")
50+
except:
51+
print("No nodes have been initialized.")
52+
53+
54+
@click.command(
55+
'save_location',
56+
help='Change the save location of forge'
57+
)
58+
@click.option(
59+
'-p',
60+
'--path',
61+
'path',
62+
type=click.STRING,
63+
help='Existing path that forge will save initialized nodes into'
64+
)
65+
def change_save_loc_cmd(path):
66+
config_handler.check_save_location(path)
67+
return

0 commit comments

Comments
 (0)