2018-06-14 17:11:55 -07:00
|
|
|
#!/bin/bash
|
2018-06-23 11:52:12 -07:00
|
|
|
here=$(dirname "$0")
|
2018-06-24 10:10:55 -07:00
|
|
|
# shellcheck source=multinode-demo/common.sh
|
|
|
|
source "$here"/common.sh
|
2018-06-23 11:52:12 -07:00
|
|
|
|
2018-06-24 10:10:55 -07:00
|
|
|
usage() {
|
2018-08-03 14:56:35 -07:00
|
|
|
if [[ -n $1 ]]; then
|
2018-06-26 16:46:17 -07:00
|
|
|
echo "$*"
|
|
|
|
echo
|
|
|
|
fi
|
2018-08-03 14:56:35 -07:00
|
|
|
echo "usage: $0 [-x] [rsync network path to solana repo on leader machine] [network ip address of leader]"
|
|
|
|
echo ""
|
|
|
|
echo " -x: runs a new, dynamically-configured validator"
|
2018-05-27 18:19:07 -07:00
|
|
|
exit 1
|
2018-06-22 18:18:09 -07:00
|
|
|
}
|
2018-05-27 18:19:07 -07:00
|
|
|
|
2018-08-03 17:02:27 -07:00
|
|
|
if [[ $1 = -h ]]; then
|
2018-06-24 10:10:55 -07:00
|
|
|
usage
|
|
|
|
fi
|
|
|
|
|
2018-08-03 14:56:35 -07:00
|
|
|
if [[ $1 == -x ]]; then
|
2018-08-03 13:55:27 -07:00
|
|
|
self_setup=1
|
|
|
|
shift
|
|
|
|
else
|
|
|
|
self_setup=0
|
|
|
|
fi
|
|
|
|
|
2018-08-03 17:02:27 -07:00
|
|
|
if [[ -n $3 ]]; then
|
|
|
|
usage
|
|
|
|
fi
|
|
|
|
|
2018-08-03 14:56:35 -07:00
|
|
|
if [[ -d $SNAP ]]; then
|
2018-06-24 10:10:55 -07:00
|
|
|
# Exit if mode is not yet configured
|
|
|
|
# (typically the case after the Snap is first installed)
|
2018-08-03 14:56:35 -07:00
|
|
|
[[ -n $(snapctl get mode) ]] || exit 0
|
2018-06-24 10:10:55 -07:00
|
|
|
|
|
|
|
# Select leader from the Snap configuration
|
2018-08-03 17:02:27 -07:00
|
|
|
leader_address=$(snapctl get leader-address)
|
2018-08-03 14:56:35 -07:00
|
|
|
if [[ -z $leader_address ]]; then
|
2018-06-26 16:46:17 -07:00
|
|
|
# Assume public testnet by default
|
|
|
|
leader_address=35.230.65.68 # testnet.solana.com
|
2018-06-24 10:10:55 -07:00
|
|
|
fi
|
2018-08-03 14:56:35 -07:00
|
|
|
leader=$leader_address
|
2018-06-24 10:10:55 -07:00
|
|
|
else
|
2018-08-03 14:56:35 -07:00
|
|
|
if [[ -z $1 ]]; then
|
2018-06-26 16:46:17 -07:00
|
|
|
leader=${1:-${here}/..} # Default to local solana repo
|
|
|
|
leader_address=${2:-127.0.0.1} # Default to local leader
|
2018-08-03 17:02:27 -07:00
|
|
|
elif [[ -z $2 ]]; then
|
2018-08-03 14:56:35 -07:00
|
|
|
leader=$1
|
2018-08-03 17:02:27 -07:00
|
|
|
leader_address=$(dig +short "${leader%:*}" | head -n1)
|
2018-08-03 14:56:35 -07:00
|
|
|
if [[ -z $leader_address ]]; then
|
2018-06-26 16:46:17 -07:00
|
|
|
usage "Error: unable to resolve IP address for $leader"
|
|
|
|
fi
|
|
|
|
else
|
2018-08-03 14:56:35 -07:00
|
|
|
leader=$1
|
|
|
|
leader_address=$2
|
2018-06-26 16:46:17 -07:00
|
|
|
fi
|
2018-06-24 10:10:55 -07:00
|
|
|
fi
|
|
|
|
leader_port=8001
|
|
|
|
|
2018-08-03 14:56:35 -07:00
|
|
|
if [[ -n $SOLANA_CUDA ]]; then
|
|
|
|
program=$solana_fullnode_cuda
|
2018-06-24 10:10:55 -07:00
|
|
|
else
|
2018-08-03 14:56:35 -07:00
|
|
|
program=$solana_fullnode
|
2018-06-24 10:10:55 -07:00
|
|
|
fi
|
|
|
|
|
2018-08-03 14:56:35 -07:00
|
|
|
if ((!self_setup)); then
|
|
|
|
[[ -f $SOLANA_CONFIG_VALIDATOR_DIR/validator.json ]] || {
|
2018-08-03 13:55:27 -07:00
|
|
|
echo "$SOLANA_CONFIG_VALIDATOR_DIR/validator.json not found, create it by running:"
|
|
|
|
echo
|
|
|
|
echo " ${here}/setup.sh"
|
|
|
|
exit 1
|
|
|
|
}
|
2018-08-03 14:56:35 -07:00
|
|
|
validator_json_path=$SOLANA_CONFIG_VALIDATOR_DIR/validator.json
|
|
|
|
SOLANA_LEADER_CONFIG_DIR=$SOLANA_CONFIG_VALIDATOR_DIR/leader-config
|
2018-08-03 13:55:27 -07:00
|
|
|
else
|
2018-08-04 00:49:39 -07:00
|
|
|
mkdir -p "$SOLANA_CONFIG_PRIVATE_DIR"
|
2018-08-03 14:56:35 -07:00
|
|
|
validator_id_path=$SOLANA_CONFIG_PRIVATE_DIR/validator-id-x$$.json
|
2018-08-03 13:55:27 -07:00
|
|
|
$solana_keygen -o "$validator_id_path"
|
2018-06-24 10:10:55 -07:00
|
|
|
|
2018-08-04 00:49:39 -07:00
|
|
|
mkdir -p "$SOLANA_CONFIG_VALIDATOR_DIR"
|
2018-08-03 14:56:35 -07:00
|
|
|
validator_json_path=$SOLANA_CONFIG_VALIDATOR_DIR/validator-x$$.json
|
2018-08-06 12:41:25 -07:00
|
|
|
|
|
|
|
port=9000
|
|
|
|
(((port += ($$ % 1000)) && (port == 9000) && port++))
|
|
|
|
|
|
|
|
$solana_fullnode_config --keypair="$validator_id_path" -l -b "$port" > "$validator_json_path"
|
2018-08-03 13:55:27 -07:00
|
|
|
|
2018-08-03 14:56:35 -07:00
|
|
|
SOLANA_LEADER_CONFIG_DIR=$SOLANA_CONFIG_VALIDATOR_DIR/leader-config-x$$
|
2018-08-03 13:55:27 -07:00
|
|
|
fi
|
2018-05-27 18:19:07 -07:00
|
|
|
|
2018-06-26 16:46:17 -07:00
|
|
|
rsync_leader_url=$(rsync_url "$leader")
|
|
|
|
|
2018-07-15 12:25:32 -07:00
|
|
|
tune_networking
|
|
|
|
|
2018-06-24 10:10:55 -07:00
|
|
|
rm -rf "$SOLANA_LEADER_CONFIG_DIR"
|
2018-07-15 12:25:32 -07:00
|
|
|
set -ex
|
2018-08-03 23:15:52 -07:00
|
|
|
$rsync -vPrz "$rsync_leader_url"/config/ "$SOLANA_LEADER_CONFIG_DIR"
|
2018-08-03 11:06:06 -07:00
|
|
|
[[ -d $SOLANA_LEADER_CONFIG_DIR/ledger ]] || {
|
|
|
|
echo "Unable to retrieve ledger from $rsync_leader_url"
|
2018-07-27 23:44:52 -07:00
|
|
|
exit 1
|
|
|
|
}
|
2018-07-02 17:35:28 -07:00
|
|
|
|
2018-07-30 14:29:34 -07:00
|
|
|
trap 'kill "$pid" && wait "$pid"' INT TERM
|
2018-07-17 13:31:24 -07:00
|
|
|
$program \
|
2018-08-03 13:55:27 -07:00
|
|
|
--identity "$validator_json_path" \
|
2018-07-12 15:45:41 -07:00
|
|
|
--testnet "$leader_address:$leader_port" \
|
2018-08-03 11:06:06 -07:00
|
|
|
--ledger "$SOLANA_LEADER_CONFIG_DIR"/ledger \
|
2018-07-30 14:29:34 -07:00
|
|
|
> >($validator_logger) 2>&1 &
|
|
|
|
pid=$!
|
|
|
|
wait "$pid"
|