mirror of
https://github.com/planetmint/planetmint.git
synced 2025-03-30 15:08:31 +00:00
99 lines
3.7 KiB
Django/Jinja
99 lines
3.7 KiB
Django/Jinja
#!/bin/bash
|
|
set -euo pipefail
|
|
|
|
{%- set peers = [] -%}
|
|
{%- set validator_power = [] -%}
|
|
{% for host in hostvars %}
|
|
{{- peers.append(host) -}}
|
|
{{- validator_power.append(10) -}}
|
|
{% endfor %}
|
|
|
|
tm_persistent_peers="{{ peers| reverse | join(',') }}"
|
|
tm_validators="{{ peers | reverse | join(',') }}"
|
|
tm_validator_power="{{ validator_power | join(',') }}"
|
|
tm_pub_key_access_port="9986"
|
|
tm_p2p_port="{{ tendermint_p2p_port|string }}"
|
|
tm_proxy_app="{{ ansible_hostname|string }}"
|
|
tm_abci_port="{{ tendermint_abci_port|string }}"
|
|
tm_instance_name="{{ ansible_hostname }}"
|
|
|
|
{% raw %}
|
|
# Container vars
|
|
RETRIES=0
|
|
CANNOT_INITIATLIZE_INSTANCE='Cannot start instance, if initial validator(s) are unreachable.'
|
|
|
|
TM_GENESIS_FILE=/tendermint/config/genesis.json
|
|
TM_PUB_KEY_DIR=/usr/share/nginx
|
|
|
|
if [ ! -f /tendermint/config/priv_validator.json ]; then
|
|
/usr/local/bin/tendermint gen_validator > /tendermint/config/priv_validator.json
|
|
# pub_key.json will be served by the nginx container
|
|
cat /tendermint/config/priv_validator.json
|
|
cat /tendermint/config/priv_validator.json | jq ".pub_key" > "$TM_PUB_KEY_DIR"/pub_key.json
|
|
fi
|
|
|
|
if [ ! -f /tendermint/config/node_key.json ]; then
|
|
/usr/local/bin/tendermint --home "/tendermint" gen_node_key > "$TM_PUB_KEY_DIR"/address
|
|
fi
|
|
|
|
# fill genesis file with validators
|
|
IFS=',' read -ra VALS_ARR <<< "$tm_validators"
|
|
IFS=',' read -ra VAL_POWERS_ARR <<< "$tm_validator_power"
|
|
if [ ${#VALS_ARR[@]} -ne ${#VAL_POWERS_ARR[@]} ]; then
|
|
echo "Invalid configuration of Validator(s) and Validator Power(s)"
|
|
exit 1
|
|
fi
|
|
for i in "${!VALS_ARR[@]}"; do
|
|
# wait until validator generates priv/pub key pair
|
|
set +e
|
|
echo Validator: "${VALS_ARR[$i]}"
|
|
echo Validator Power: "${VAL_POWERS_ARR[$i]}"
|
|
echo "http://${VALS_ARR[$i]}:$tm_pub_key_access_port/pub_key.json"
|
|
curl -s --fail "http://${VALS_ARR[$i]}:$tm_pub_key_access_port/pub_key.json" > /dev/null
|
|
ERR=$?
|
|
while [ "$ERR" != 0 ]; do
|
|
RETRIES=$((RETRIES+1))
|
|
if [ $RETRIES -eq 10 ]; then
|
|
echo "${CANNOT_INITIATLIZE_INSTANCE}"
|
|
exit 1
|
|
fi
|
|
# 300(30 * 10(retries)) second timeout before container dies if it cannot find initial peers
|
|
sleep 30
|
|
curl -s --fail "http://${VALS_ARR[$i]}:$tm_pub_key_access_port/pub_key.json" > /dev/null
|
|
ERR=$?
|
|
echo "Cannot connect to Tendermint instance: ${VALS_ARR[$i]}"
|
|
done
|
|
set -e
|
|
# add validator to genesis file along with its pub_key
|
|
curl -s "http://${VALS_ARR[$i]}:$tm_pub_key_access_port/pub_key.json" | jq ". as \$k | {pub_key: \$k, power: \"${VAL_POWERS_ARR[$i]}\", name: \"${VALS_ARR[$i]}\"}" > pub_validator.json
|
|
cat /tendermint/config/genesis.json | jq ".validators |= .+ [$(cat pub_validator.json)]" > tmpgenesis && mv tmpgenesis /tendermint/config/genesis.json
|
|
rm pub_validator.json
|
|
done
|
|
# construct persistent peers
|
|
IFS=',' read -ra PEERS_ARR <<< "$tm_persistent_peers"
|
|
peers=()
|
|
for s in "${PEERS_ARR[@]}"; do
|
|
echo "http://$s:$tm_pub_key_access_port/address"
|
|
curl -s --fail "http://$s:$tm_pub_key_access_port/address" > /dev/null
|
|
ERR=$?
|
|
while [ "$ERR" != 0 ]; do
|
|
RETRIES=$((RETRIES+1))
|
|
if [ $RETRIES -eq 10 ]; then
|
|
echo "${CANNOT_INITIATLIZE_INSTANCE}"
|
|
exit 1
|
|
fi
|
|
# 300(30 * 10(retries)) second timeout before container dies if it cannot find initial peers
|
|
sleep 30
|
|
curl -s --fail "http://$s:$tm_pub_key_access_port/address" > /dev/null
|
|
ERR=$?
|
|
echo "Cannot get address for Tendermint instance: ${s}"
|
|
done
|
|
peer_addr=$(curl -s "http://$s:$tm_pub_key_access_port/address")
|
|
peers+=("$peer_addr@$s:$tm_p2p_port")
|
|
done
|
|
peers=$(IFS=','; echo "${peers[*]}")
|
|
|
|
echo "INFO: starting tendermint..."
|
|
/usr/local/bin/tendermint node --home "/tendermint" --p2p.persistent_peers="$peers" --proxy_app="tcp://0.0.0.0:26658" --consensus.create_empty_blocks=false --p2p.pex=false
|
|
{% endraw %}
|