github.com/braveheart12/insolar-09-08-19@v0.8.7/scripts/insolard/launchnet.sh (about)

     1  #!/usr/bin/env bash
     2  set -e
     3  
     4  BIN_DIR=bin
     5  TEST_DATA=testdata
     6  INSOLARD=$BIN_DIR/insolard
     7  INSGORUND=$BIN_DIR/insgorund
     8  PULSARD=$BIN_DIR/pulsard
     9  PULSEWATCHER=$BIN_DIR/pulsewatcher
    10  CONTRACT_STORAGE=contractstorage
    11  LEDGER_DIR=data
    12  CONFIGS_DIR=configs
    13  BASE_DIR=scripts/insolard
    14  KEYS_FILE=$BASE_DIR/$CONFIGS_DIR/bootstrap_keys.json
    15  ROOT_MEMBER_KEYS_FILE=$BASE_DIR/$CONFIGS_DIR/root_member_keys.json
    16  DISCOVERY_NODES_DATA=$BASE_DIR/discoverynodes/
    17  NODES_DATA=$BASE_DIR/nodes/
    18  INSGORUND_DATA=$BASE_DIR/insgorund/
    19  GENESIS_CONFIG=$BASE_DIR/genesis.yaml
    20  GENERATED_CONFIGS_DIR=$BASE_DIR/$CONFIGS_DIR/generated_configs
    21  GENERATED_DISCOVERY_CONFIGS_DIR=$GENERATED_CONFIGS_DIR/discoverynodes
    22  INSGORUND_PORT_FILE=$BASE_DIR/$CONFIGS_DIR/insgorund_ports.txt
    23  PULSEWATCHER_CONFIG=$GENERATED_CONFIGS_DIR/utils/pulsewatcher.yaml
    24  
    25  insolar_log_level=${INSOLAR_LOG_LEVEL:-"Debug"}
    26  gorund_log_level=$insolar_log_level
    27  
    28  NUM_DISCOVERY_NODES=$(sed '/^nodes:/ q' $GENESIS_CONFIG | grep "host:" | grep -v "#" | wc -l)
    29  
    30  for i in `seq 1 $NUM_DISCOVERY_NODES`
    31  do
    32      DISCOVERY_NODES+=($DISCOVERY_NODES_DATA/$i)
    33  done
    34  
    35  DISCOVERY_NODES_KEYS_DIR=$TEST_DATA/scripts/discovery_nodes
    36  
    37  NUM_NODES=$(sed -n '/^nodes:/,$p' $GENESIS_CONFIG | grep "host:" | grep -v "#" | wc -l)
    38  
    39  if [[ "$NUM_NODES" -ne "0" ]]
    40  then
    41      for i in `seq 1 $NUM_NODES`
    42      do
    43          NODES+=($NODES_DATA/$i)
    44      done
    45  fi
    46  
    47  kill_port()
    48  {
    49      port=$1
    50      pids=$(lsof -i :$port | grep "LISTEN\|UDP" | awk '{print $2}')
    51      for pid in $pids
    52      do
    53          echo "killing pid $pid"
    54          kill -9 $pid
    55      done
    56  }
    57  
    58  stop_listening()
    59  {
    60      echo "stop_listening() starts ..."
    61      stop_insgorund=$1
    62      ports="$ports 58090" # Pulsar
    63      ports="$ports 53837" # Genesis
    64      if [[ "$stop_insgorund" == "true" ]]
    65      then
    66          gorund_ports=
    67          while read -r line; do
    68  
    69              listen_port=$( echo "$line" | awk '{print $1}' )
    70              rpc_port=$( echo "$line" | awk '{print $2}' )
    71  
    72              gorund_ports="$gorund_ports $listen_port $rpc_port"
    73  
    74          done < "$INSGORUND_PORT_FILE"
    75  
    76          gorund_ports="$gorund_ports $(echo $(pgrep insgorund ))"
    77  
    78          ports="$ports $gorund_ports"
    79  
    80      fi
    81  
    82      transport_ports=$( grep "host:" $GENESIS_CONFIG | grep -o ":\d\+" | grep -o "\d\+" | tr '\n' ' ' )
    83      ports="$ports $transport_ports"
    84  
    85      echo "Stop listening..."
    86  
    87      for port in $ports
    88      do
    89          echo "port: $port"
    90          kill_port $port
    91      done
    92      echo "stop_listening() end."
    93  }
    94  
    95  clear_dirs()
    96  {
    97      echo "clear_dirs() starts ..."
    98      rm -rfv $CONTRACT_STORAGE/*
    99      rm -rfv $LEDGER_DIR/*
   100      rm -rfv $DISCOVERY_NODES_DATA/*
   101      rm -rfv $GENERATED_CONFIGS_DIR/*
   102      rm -rfv $INSGORUND_DATA/*
   103      rm -rfv $NODES_DATA/*
   104      echo "clear_dirs() end."
   105  }
   106  
   107  create_required_dirs()
   108  {
   109      echo "create_required_dirs() starts ..."
   110      mkdir -vp $CONTRACT_STORAGE
   111      mkdir -vp $LEDGER_DIR
   112      mkdir -vp $DISCOVERY_NODES_DATA/certs
   113      mkdir -vp $GENERATED_CONFIGS_DIR
   114      mkdir -vp $INSGORUND_DATA
   115      touch $INSGORUND_PORT_FILE
   116  
   117      for node in "${DISCOVERY_NODES[@]}"
   118      do
   119          mkdir -vp $node/data
   120      done
   121  
   122      mkdir -p scripts/insolard/$CONFIGS_DIR
   123  
   124      echo "create_required_dirs() end."
   125  }
   126  
   127  generate_insolard_configs()
   128  {
   129      go run scripts/generate_insolar_configs.go -o $GENERATED_CONFIGS_DIR -p $INSGORUND_PORT_FILE -g $GENESIS_CONFIG -t $BASE_DIR/pulsar_template.yaml
   130  }
   131  
   132  prepare()
   133  {
   134      echo "prepare() starts ..."
   135      stop_listening $run_insgorund
   136      clear_dirs
   137      create_required_dirs
   138      echo "prepare() end."
   139  }
   140  
   141  build_binaries()
   142  {
   143      make build
   144  }
   145  
   146  rebuild_binaries()
   147  {
   148      make clean
   149      build_binaries
   150  }
   151  
   152  generate_bootstrap_keys()
   153  {
   154      echo "generate_bootstrap_keys() starts ..."
   155  	bin/insolar -c gen_keys > $KEYS_FILE
   156  	echo "generate_bootstrap_keys() end."
   157  }
   158  
   159  generate_root_member_keys()
   160  {
   161      echo "generate_root_member_keys() starts ..."
   162  	bin/insolar -c gen_keys > $ROOT_MEMBER_KEYS_FILE
   163  	echo "generate_root_member_keys() end."
   164  }
   165  
   166  check_working_dir()
   167  {
   168      echo "check_working_dir() starts ..."
   169      if ! pwd | grep -q "src/github.com/insolar/insolar$"
   170      then
   171          echo "Run me from insolar root"
   172          exit 1
   173      fi
   174      echo "check_working_dir() end."
   175  }
   176  
   177  usage()
   178  {
   179      echo "usage: $0 [options]"
   180      echo "possible options: "
   181      echo -e "\t-h - show help"
   182      echo -e "\t-n - don't run insgorund"
   183      echo -e "\t-g - preventively generate initial ledger"
   184      echo -e "\t-l - clear all and exit"
   185      echo -e "\t-C - generate configs only"
   186  }
   187  
   188  process_input_params()
   189  {
   190      OPTIND=1
   191      while getopts "h?nglwC" opt; do
   192          case "$opt" in
   193          h|\?)
   194              usage
   195              exit 0
   196              ;;
   197          n)
   198              run_insgorund=false
   199              ;;
   200          g)
   201              genesis
   202              ;;
   203          l)
   204              prepare
   205              exit 0
   206              ;;
   207          w)
   208              watch_pulse=false
   209              ;;
   210          C)
   211              generate_insolard_configs
   212              exit $?
   213          esac
   214      done
   215  }
   216  
   217  launch_insgorund()
   218  {
   219      host=127.0.0.1
   220      metrics_port=28223
   221      while read -r line; do
   222  
   223          metrics_port=$((metrics_port + 20))
   224          listen_port=$( echo "$line" | awk '{print $1}' )
   225          rpc_port=$( echo "$line" | awk '{print $2}' )
   226  
   227          $INSGORUND -l $host:$listen_port --rpc $host:$rpc_port --log-level=$gorund_log_level --metrics :$metrics_port &> $INSGORUND_DATA/$rpc_port.log &
   228  
   229      done < "$INSGORUND_PORT_FILE"
   230  }
   231  
   232  copy_data()
   233  {
   234      echo "copy_data() starts ..."
   235      for node in "${DISCOVERY_NODES[@]}"
   236      do
   237          cp -v $LEDGER_DIR/* $node/data
   238      done
   239      echo "copy_data() end."
   240  }
   241  
   242  copy_discovery_certs()
   243  {
   244      echo "copy_certs() starts ..."
   245      i=0
   246      for node in "${DISCOVERY_NODES[@]}"
   247      do
   248          i=$((i + 1))
   249          cp -v $DISCOVERY_NODES_DATA/certs/discovery_cert_$i.json $node/cert.json
   250      done
   251      echo "copy_certs() end."
   252  }
   253  
   254  wait_for_complete_network_state()
   255  {
   256      while true
   257      do
   258          num=`scripts/insolard/check_status.sh 2>/dev/null | grep "NodeReady" | wc -l`
   259          echo "$num/$NUM_DISCOVERY_NODES discovery nodes ready"
   260          if [[ "$num" -eq "$NUM_DISCOVERY_NODES" ]]
   261          then
   262              break
   263          fi
   264          sleep 5s
   265      done
   266  }
   267  
   268  genesis()
   269  {
   270      prepare
   271      build_binaries
   272      generate_bootstrap_keys
   273      generate_root_member_keys
   274      generate_insolard_configs
   275  
   276      printf "start genesis ... \n"
   277      $INSOLARD --config $BASE_DIR/insolar.yaml --genesis $GENESIS_CONFIG --keyout $DISCOVERY_NODES_DATA/certs &> $DISCOVERY_NODES_DATA/genesis_output.log
   278      printf "genesis is done\n"
   279  
   280      copy_data
   281      copy_discovery_certs
   282  
   283      if which jq ; then
   284          NL=$BASE_DIR/loglinks
   285          mkdir  $NL || \
   286          rm -f $NL/*.log
   287          for node in "${DISCOVERY_NODES[@]}" ; do
   288              ref=`jq -r '.reference' $node/cert.json`
   289              [[ $ref =~ .+\. ]]
   290              ln -s `pwd`/$node/output.log $NL/${BASH_REMATCH[0]}log
   291          done
   292      else
   293          echo "no jq =("
   294      fi
   295  }
   296  
   297  run_insgorund=true
   298  watch_pulse=true
   299  check_working_dir
   300  process_input_params $@
   301  
   302  trap 'stop_listening true' INT TERM EXIT
   303  
   304  printf "start pulsar ... \n"
   305  ARTIFACTS_DIR=${ARTIFACTS_DIR:-".artifacts"}
   306  PULSAR_DATA_DIR=$ARTIFACTS_DIR/pulsar_data
   307  mkdir -p $PULSAR_DATA_DIR
   308  $PULSARD -c $GENERATED_CONFIGS_DIR/pulsar.yaml --trace &> $DISCOVERY_NODES_DATA/pulsar_output.log &
   309  
   310  if [[ "$run_insgorund" == "true" ]]
   311  then
   312      printf "start insgorund ... \n"
   313      launch_insgorund
   314  else
   315      echo "INSGORUND IS NOT LAUNCHED"
   316  fi
   317  
   318  printf "start discovery nodes ... \n"
   319  
   320  i=0
   321  for node in "${DISCOVERY_NODES[@]}"
   322  do
   323      i=$((i + 1))
   324      INSOLAR_LOG_LEVEL=$insolar_log_level $INSOLARD --config $GENERATED_DISCOVERY_CONFIGS_DIR/insolar_$i.yaml --trace &> $node/output.log &
   325      echo "DISCOVERY NODE $i STARTED in background"
   326  done
   327  
   328  printf "discovery nodes started ... \n"
   329  
   330  if [[ "$NUM_NODES" -ne "0" ]]
   331  then
   332      wait_for_complete_network_state
   333      scripts/insolard/start_nodes.sh
   334  fi
   335  
   336  if [[ "$watch_pulse" == "true" ]]
   337  then
   338      echo "Starting pulse watcher..."
   339      $PULSEWATCHER -c $PULSEWATCHER_CONFIG
   340  else
   341      echo "Waiting..."
   342      wait
   343  fi
   344  
   345  echo "FINISHING ..."