/ run.sh
run.sh
  1  #!/usr/bin/env bash
  2  
  3  run_embark () {
  4      local EMBARK_DOCKER_MOUNT_SOURCE="${EMBARK_DOCKER_MOUNT_SOURCE:-$PWD}"
  5      local EMBARK_DOCKER_MOUNT_TARGET="${EMBARK_DOCKER_MOUNT_TARGET:-/dapp}"
  6      local EMBARK_DOCKER_IMAGE="${EMBARK_DOCKER_IMAGE:-statusim/embark}"
  7      local EMBARK_DOCKER_RUN="${EMBARK_DOCKER_RUN}"
  8      local EMBARK_DOCKER_RUN_INTERACTIVE=${EMBARK_DOCKER_RUN_INTERACTIVE:-false}
  9      local EMBARK_DOCKER_RUN_OPTS_REPLACE=${EMBARK_DOCKER_RUN_OPTS_REPLACE:-false}
 10      local EMBARK_DOCKER_RUN_RM=${EMBARK_DOCKER_RUN_RM:-true}
 11      local EMBARK_DOCKER_TAG="${EMBARK_DOCKER_TAG:-latest}"
 12  
 13      local -a run_opts=(
 14          "-i"
 15          "-t"
 16          "-p"
 17          "5001:5001"
 18          "-p"
 19          "8000:8000"
 20          "-p"
 21          "8080:8080"
 22          "-p"
 23          "8500:8500"
 24          "-p"
 25          "8545:8545"
 26          "-p"
 27          "8546:8546"
 28          "-p"
 29          "8555:8555"
 30          "-p"
 31          "8556:8556"
 32          "-p"
 33          "30301:30301/udp"
 34          "-p"
 35          "30303:30303"
 36          "-v"
 37          "${EMBARK_DOCKER_MOUNT_SOURCE}:${EMBARK_DOCKER_MOUNT_TARGET}"
 38      )
 39  
 40      local env_var
 41      for env_var in LANG \
 42                     LANGUAGE \
 43                     LC_ALL \
 44                     TERM;
 45      # do not alter indentation, tabs in lines below
 46      do
 47          local include_var=$(cat <<- ENV_VAR
 48  	if [[ -v $env_var ]]; then
 49  	    run_opts=( "\${run_opts[@]}" "-e" "\$env_var" )
 50  	fi
 51  	ENV_VAR
 52          )
 53          eval "$include_var"
 54      done
 55      # do not alter indentation, tabs in lines above
 56  
 57      if [[ $EMBARK_DOCKER_RUN_RM = true ]]; then
 58          run_opts=( "${run_opts[@]}" "--rm" )
 59      fi
 60  
 61      local txtbld=$(tput bold)
 62      local txtrst=$(tput sgr0)
 63  
 64      local bldcyn=${txtbld}$(tput setaf 6)
 65      local bldred=${txtbld}$(tput setaf 1)
 66      local bldylw=${txtbld}$(tput setaf 3)
 67  
 68      local ERROR=${bldred}ERROR${txtrst}
 69      local INFO=${bldcyn}INFO${txtrst}
 70      local WARNING=${bldylw}WARNING${txtrst}
 71  
 72      local oldopts
 73      case $- in
 74          *e*) oldopts="set -e" ;;
 75          *) oldopts="set +e" ;;
 76      esac
 77      set +e
 78  
 79      cleanup () {
 80          local retval=$?
 81          unset check_bash_version
 82          unset check_docker
 83          unset cleanup
 84          eval "$oldopts"
 85          return $retval
 86      }
 87  
 88      check_bash_version () {
 89          if [[ $BASH_VERSINFO -lt 4 ]]; then
 90              echo "$ERROR: this script requires Bash version >= 4.0"
 91              return 1
 92          fi
 93      }
 94      check_bash_version || cleanup || return
 95  
 96      check_docker () {
 97          if ! type docker &> /dev/null; then
 98              echo "$ERROR: the command \`docker\` must be in a path on \$PATH or aliased"
 99              return 127
100          fi
101      }
102      check_docker || cleanup || return
103  
104      local had_run_opts=false
105      local -a _run_opts=()
106      local -a _cmd=()
107      local -a cmd
108  
109      while [[ ! -z "$1" ]]; do
110          if [[ "$1" = "--" ]]; then
111              had_run_opts=true
112          else
113              if [[ $had_run_opts = true ]]; then
114                  _cmd=( "${_cmd[@]}" "$1" )
115              else
116                  _run_opts=( "${_run_opts[@]}" "$1" )
117              fi
118          fi
119          shift
120      done
121  
122      if [[ $had_run_opts = true ]]; then
123          cmd=( "${_cmd[@]}" )
124          if [[ $EMBARK_DOCKER_RUN_OPTS_REPLACE = true ]]; then
125              run_opts=( "${_run_opts[@]}" )
126          else
127              run_opts=( "${run_opts[@]}" "${_run_opts[@]}" )
128          fi
129      else
130          cmd=( "${_run_opts[@]}" )
131      fi
132  
133      if [[ -z "$EMBARK_DOCKER_RUN" ]]; then
134          case "${cmd[0]}" in
135              -V|--version|-h|--help|new|demo|build|run|blockchain|simulator|test|\
136                  reset|graph|upload|version) cmd=( "embark" "${cmd[@]}" ) ;;
137          esac
138      else
139          local i_flag
140          if [[ $EMBARK_DOCKER_RUN_INTERACTIVE = true ]]; then
141              i_flag='i'
142          else
143              i_flag=''
144          fi
145  
146          local run_script=$(< "$EMBARK_DOCKER_RUN")
147          # do not alter indentation, tabs in lines below
148          run_script=$(cat <<- RUN_SCRIPT
149  	exec bash -${i_flag}s \$(tty) ${cmd[@]} << 'RUN'
150  	__tty=\$1
151  	shift
152  	script=/tmp/run_embark_script
153  	cat << 'SCRIPT' > \$script
154  	$run_script
155  	SCRIPT
156  	chmod +x \$script
157  	exec \$script \$@ < \$__tty
158  	RUN
159  	RUN_SCRIPT
160          )
161          # do not alter indentation, tabs in lines above
162          cmd=( "bash" "-${i_flag}c" "$run_script" )
163      fi
164  
165      docker run \
166             "${run_opts[@]}" \
167             "${EMBARK_DOCKER_IMAGE}:${EMBARK_DOCKER_TAG}" \
168             "${cmd[@]}" \
169          || cleanup || return
170  
171      cleanup
172  }
173  export -f run_embark
174  
175  if [[ "$0" = "$BASH_SOURCE" ]]; then
176      run_embark "$@"
177  fi