github.com/ethersphere/bee/v2@v2.2.0/install.sh (about)

     1  #!/usr/bin/env bash
     2  
     3  APP_NAME="bee"
     4  REPO_URL="https://github.com/ethersphere/bee"
     5  
     6  : "${USE_SUDO:="true"}"
     7  : "${BEE_INSTALL_DIR:="/usr/local/bin"}"
     8  
     9  detect_arch() {
    10    ARCH=$(uname -m)
    11    case $ARCH in
    12      armv5*) ARCH="armv5";;
    13      armv6*) ARCH="armv6";;
    14      armv7*) ARCH="arm";;
    15      aarch64) ARCH="arm64";;
    16      x86) ARCH="386";;
    17      x86_64) ARCH="amd64";;
    18      i686) ARCH="386";;
    19      i386) ARCH="386";;
    20    esac
    21  }
    22  
    23  detect_os() {
    24    OS=$(uname|tr '[:upper:]' '[:lower:]')
    25  
    26    case "$OS" in
    27      # Minimalist GNU for Windows
    28      mingw*) OS='windows';;
    29    esac
    30  }
    31  
    32  run_as_root() {
    33    local CMD="$*"
    34  
    35    if [ $EUID -ne 0 ] && [ $USE_SUDO = "true" ]; then
    36      CMD="sudo $CMD"
    37    fi
    38  
    39    $CMD
    40  }
    41  
    42  supported() {
    43    local supported="darwin-arm64\ndarwin-amd64\nlinux-386\nlinux-amd64\nlinux-arm64\nlinux-armv6"
    44    if ! echo "${supported}" | grep -q "${OS}-${ARCH}"; then
    45      if [ $OS == "windows" ]; then
    46        echo "Auto install not supported for Windows."
    47        echo "Install binary from here $REPO_URL/releases"
    48        exit 1
    49      else
    50        echo "No prebuilt binary for ${OS}-${ARCH}."
    51        echo "To build from source, go to $REPO_URL"
    52        exit 1
    53      fi
    54    fi
    55  
    56    if ! command -v curl &> /dev/null && ! command -v wget &> /dev/null; then
    57      echo "Either curl or wget is required"
    58      exit 1
    59    fi
    60  }
    61  
    62  # check_installed_version checks which version of bee is installed and
    63  # if it needs to be changed.
    64  check_installed_version() {
    65    if [[ -f "${BEE_INSTALL_DIR}/${APP_NAME}" ]]; then
    66      local version=$(bee version 2>&1)
    67      if [[ "${version%-*}" == "${TAG#v}" ]]; then
    68        echo "bee ${version} is already ${DESIRED_VERSION:-latest}"
    69        return 0
    70      else
    71        echo "bee ${TAG} is available. Changing from version ${version}."
    72        return 1
    73      fi
    74    else
    75      return 1
    76    fi
    77  }
    78  
    79  # check_tag_provided checks whether TAG has provided as an environment variable so we can skip check_latest_version.
    80  check_tag_provided() {
    81    [[ ! -z "$TAG" ]]
    82  }
    83  
    84  # check_latest_version grabs the latest version string from the releases
    85  check_latest_version() {
    86    local latest_release_url="$REPO_URL/releases/latest"
    87    if command -v curl &> /dev/null; then
    88      TAG=$(curl -Ls -o /dev/null -w %{url_effective} $latest_release_url | grep -oE "[^/]+$" )
    89    elif command -v wget &> /dev/null; then
    90      TAG=$(wget $latest_release_url --server-response -O /dev/null 2>&1 | awk '/^  Location: /{DEST=$2} END{ print DEST}' | grep -oE "[^/]+$")
    91    fi
    92  }
    93  
    94  # download_file downloads the latest binary package and also the checksum
    95  # for that binary.
    96  download_file() {
    97    BEE_DIST="bee-$OS-$ARCH"
    98    if [ "$OS" == "windows" ]; then
    99      BEE_DIST="bee-$OS-$ARCH.exe"
   100    fi
   101    DOWNLOAD_URL="$REPO_URL/releases/download/$TAG/$BEE_DIST"
   102    BEE_TMP_ROOT="$(mktemp -dt bee-binary-XXXXXX)"
   103    BEE_TMP_FILE="$BEE_TMP_ROOT/$BEE_DIST"
   104    if command -v curl &> /dev/null; then
   105      curl -SsL "$DOWNLOAD_URL" -o "$BEE_TMP_FILE"
   106    elif command -v wget &> /dev/null; then
   107      wget -q -O "$BEE_TMP_FILE" "$DOWNLOAD_URL"
   108    fi
   109  }
   110  
   111  # install_file verifies the SHA256 for the file, then unpacks and
   112  # installs it.
   113  install_file() {
   114    echo "Preparing to install $APP_NAME into ${BEE_INSTALL_DIR}"
   115    run_as_root chmod +x "$BEE_TMP_FILE"
   116    run_as_root cp "$BEE_TMP_FILE" "$BEE_INSTALL_DIR/$APP_NAME"
   117    echo "$APP_NAME installed into $BEE_INSTALL_DIR/$APP_NAME"
   118  }
   119  
   120  # fail_trap is executed if an error occurs.
   121  fail_trap() {
   122    result=$?
   123    if [ "$result" != "0" ]; then
   124      if [[ -n "$INPUT_ARGUMENTS" ]]; then
   125        echo "Failed to install $APP_NAME with the arguments provided: $INPUT_ARGUMENTS"
   126        help
   127      else
   128        echo "Failed to install $APP_NAME"
   129      fi
   130      echo -e "\tFor support, go to $REPO_URL."
   131    fi
   132    cleanup
   133    exit $result
   134  }
   135  
   136  # test_binary tests the installed client to make sure it is working.
   137  test_binary() {
   138    if ! command -v $APP_NAME &> /dev/null; then
   139      echo "$APP_NAME not found. Is $BEE_INSTALL_DIR on your "'$PATH?'
   140      exit 1
   141    fi
   142    echo "Run '$APP_NAME --help' to see what you can do with it."
   143  }
   144  
   145  # help provides possible cli installation arguments
   146  help () {
   147    echo "Accepted cli arguments are:"
   148    echo -e "\t[--help|-h] ->> prints this help"
   149    echo -e "\t[--no-sudo]  ->> install without sudo"
   150  }
   151  
   152  # cleanup temporary files
   153  cleanup() {
   154    if [[ -d "${BEE_TMP_ROOT:-}" ]]; then
   155      rm -rf "$BEE_TMP_ROOT"
   156    fi
   157  }
   158  
   159  # Execution
   160  
   161  #Stop execution on any error
   162  trap "fail_trap" EXIT
   163  set -e
   164  
   165  # Parsing input arguments (if any)
   166  export INPUT_ARGUMENTS="${@}"
   167  set -u
   168  while [[ $# -gt 0 ]]; do
   169    case $1 in
   170      '--no-sudo')
   171         USE_SUDO="false"
   172         ;;
   173      '--help'|-h)
   174         help
   175         exit 0
   176         ;;
   177      *) exit 1
   178         ;;
   179    esac
   180    shift
   181  done
   182  set +u
   183  
   184  detect_arch
   185  detect_os
   186  supported
   187  check_tag_provided || check_latest_version
   188  if ! check_installed_version; then
   189    download_file
   190    install_file
   191  fi
   192  
   193  test_binary
   194  cleanup