#!/bin/sh REPO_NAME="taubyte/tau" BINARY_NAME="tau" DEFAULT_ROOT_DIR="/tb" DOWNLOAD_DIR="" ROOT_DIR="" do_install=1 download_and_install() { OS="$(uname -s | tr '[:upper:]' '[:lower:]')" ARCH="$(uname -m)" case "${OS}" in darwin) adjust_os_arch ;; linux) adjust_os_arch ;; *) echo "Unsupported OS: ${OS}" && exit 1 ;; esac fetch_latest_release if [ -z "${DOWNLOAD_DIR}" ]; then DOWNLOAD_DIR=$(mktemp -d) fi curl -L -# -o "${DOWNLOAD_DIR}/${BINARY_NAME}" "${DOWNLOAD_URL}" extract_file if [ ${do_install} -eq 0 ]; then echo "File downloaded in ${DOWNLOAD_DIR}" exit 0 fi if [ -z "${ROOT_DIR}" ]; then echo "Install destination unknown!" return fi install_binary echo "Installation complete" } adjust_os_arch() { case "${ARCH}" in x86_64) ARCH="amd64" ;; arm64 | aarch64) ARCH="arm64" ;; *) echo "Unsupported architecture: ${ARCH}" && exit 1 ;; esac } fetch_latest_release() { RELEASE_DATA=$(mktemp) curl -s https://api.github.com/repos/${REPO_NAME}/releases/latest -o "${RELEASE_DATA}" case "${PARSER}" in jq) parse_with_jq ;; python*) parse_with_python ;; node) parse_with_node ;; *) echo "Error: No JSON parser available" && exit 1 ;; esac echo "Downloading release: ${RELEASE_NAME}" echo "From: ${DOWNLOAD_URL}" } determine_parser() { if command -v jq >/dev/null 2>&1; then PARSER="jq" elif command -v python3 >/dev/null 2>&1; then PARSER="python3" elif command -v python2 >/dev/null 2>&1; then PARSER="python2" elif command -v node >/dev/null 2>&1; then PARSER="node" fi } parse_with_jq() { DOWNLOAD_URL=$(jq -r --arg os "${OS}" --arg arch "${ARCH}" '.assets[] | select(.name | test($os) and test($arch)) | .browser_download_url' <"${RELEASE_DATA}") RELEASE_NAME=$(jq -r '.name' <"${RELEASE_DATA}") } parse_with_node() { DOWNLOAD_URL=$(node -e "let data = JSON.parse(require('fs').readFileSync(0, 'utf-8')); console.log(data.assets.find(asset => asset.name.includes('${OS}') && asset.name.includes('${ARCH}')).browser_download_url);" <"${RELEASE_DATA}") RELEASE_NAME=$(node -e "let data = JSON.parse(require('fs').readFileSync(0, 'utf-8')); console.log(data.name);" <"${RELEASE_DATA}") } parse_with_python() { DOWNLOAD_URL=$(${PARSER} -c "import sys, json; data=json.load(sys.stdin); print([x['browser_download_url'] for x in data['assets'] if '${OS}' in x['name'] and '${ARCH}' in x['name']][0])" <"${RELEASE_DATA}") RELEASE_NAME=$(${PARSER} -c "import sys, json; data=json.load(sys.stdin); print(data['name'])" <"${RELEASE_DATA}") } extract_file() { case "${DOWNLOAD_URL}" in *.tar.bz2) tar xjf "${DOWNLOAD_DIR}/${BINARY_NAME}" -C "${DOWNLOAD_DIR}" "${BINARY_NAME}" ;; *.tar.gz) tar xzf "${DOWNLOAD_DIR}/${BINARY_NAME}" -C "${DOWNLOAD_DIR}" "${BINARY_NAME}" ;; *.tar.xz) tar xJf "${DOWNLOAD_DIR}/${BINARY_NAME}" -C "${DOWNLOAD_DIR}" "${BINARY_NAME}" ;; *.zip) unzip "${DOWNLOAD_DIR}/${BINARY_NAME}" "${BINARY_NAME}" -d "${DOWNLOAD_DIR}" ;; esac } install_binary() { for dir in bin cache storage config config/keys plugins; do sudo mkdir -p "/tb/${dir}" || true done sudo cp "${DOWNLOAD_DIR}/${BINARY_NAME}" "${ROOT_DIR}/bin/" sudo chmod +x "${ROOT_DIR}/bin/${BINARY_NAME}" sudo ln -sf /tb/bin/tau /usr/sbin/ } parse_args() { while [ "$#" -gt 0 ]; do case "$1" in --download-to | -O) DOWNLOAD_DIR="$2" shift 2 do_install=0 ;; --root | -r) ROOT_DIR="$2" shift 2 do_install=1 ;; *) echo "Unknown option: $1" exit 1 ;; esac done [ -z "${ROOT_DIR}" ] && ROOT_DIR="${DEFAULT_ROOT_DIR}" } main() { parse_args "$@" determine_parser download_and_install } main "$@"