|
| 1 | +#!/usr/bin/env bash |
| 2 | +set -euo pipefail |
| 3 | + |
| 4 | +# node-serviced installer (Linux only) |
| 5 | +# Downloads the latest GitHub release for the detected arch and installs to /usr/local/bin/node-serviced |
| 6 | + |
| 7 | +REPO_OWNER="PasarGuard" |
| 8 | +REPO_NAME="node-serviced" |
| 9 | +INSTALL_PATH="/usr/local/bin/node-serviced" |
| 10 | +API_URL="https://api.github.com/repos/${REPO_OWNER}/${REPO_NAME}/releases/latest" |
| 11 | + |
| 12 | +ARCH="" |
| 13 | +OS="linux" |
| 14 | +TMPDIR="" |
| 15 | + |
| 16 | +log() { |
| 17 | + printf '[%s] %s\n' "$(date '+%Y-%m-%d %H:%M:%S')" "$*" >&2 |
| 18 | +} |
| 19 | + |
| 20 | +cleanup() { |
| 21 | + if [[ -n "${TMPDIR:-}" && -d "$TMPDIR" ]]; then |
| 22 | + rm -rf "$TMPDIR" |
| 23 | + fi |
| 24 | +} |
| 25 | +trap cleanup EXIT |
| 26 | + |
| 27 | +detect_arch() { |
| 28 | + case "$(uname -m)" in |
| 29 | + x86_64|amd64) ARCH="amd64" ;; |
| 30 | + aarch64|arm64) ARCH="arm64" ;; |
| 31 | + armv7l|armv7) ARCH="armv7" ;; |
| 32 | + armv6l|armv6) ARCH="armv6" ;; |
| 33 | + *) log "Unsupported architecture: $(uname -m)"; exit 1 ;; |
| 34 | + esac |
| 35 | +} |
| 36 | + |
| 37 | +require_linux() { |
| 38 | + if [[ "$(uname -s)" != "Linux" ]]; then |
| 39 | + log "This installer supports Linux only." |
| 40 | + exit 1 |
| 41 | + } |
| 42 | +} |
| 43 | + |
| 44 | +require_tools() { |
| 45 | + for bin in curl tar; do |
| 46 | + if ! command -v "$bin" >/dev/null 2>&1; then |
| 47 | + log "Missing required tool: $bin" |
| 48 | + exit 1 |
| 49 | + fi |
| 50 | + done |
| 51 | +} |
| 52 | + |
| 53 | +fetch_latest_url() { |
| 54 | + local asset_name="${REPO_NAME}_*_Linux_${ARCH}.tar.gz" |
| 55 | + local url |
| 56 | + url=$(curl -sSf "$API_URL" | grep -oE "\"browser_download_url\": \"[^\"]*${asset_name}\"" | head -n1 | cut -d\" -f4) |
| 57 | + if [[ -z "$url" ]]; then |
| 58 | + log "Could not find a release asset for arch=${ARCH}" |
| 59 | + exit 1 |
| 60 | + fi |
| 61 | + echo "$url" |
| 62 | +} |
| 63 | + |
| 64 | +download_and_install() { |
| 65 | + TMPDIR=$(mktemp -d) |
| 66 | + local url="$1" |
| 67 | + local archive="$TMPDIR/node-serviced.tar.gz" |
| 68 | + |
| 69 | + log "Downloading: $url" |
| 70 | + curl -fL "$url" -o "$archive" |
| 71 | + |
| 72 | + log "Extracting archive" |
| 73 | + tar -xzf "$archive" -C "$TMPDIR" |
| 74 | + |
| 75 | + if [[ ! -f "$TMPDIR/node-serviced" ]]; then |
| 76 | + log "Binary node-serviced not found in archive" |
| 77 | + exit 1 |
| 78 | + fi |
| 79 | + |
| 80 | + log "Installing to $INSTALL_PATH" |
| 81 | + install -m 0755 "$TMPDIR/node-serviced" "$INSTALL_PATH" |
| 82 | +} |
| 83 | + |
| 84 | +main() { |
| 85 | + require_linux |
| 86 | + require_tools |
| 87 | + detect_arch |
| 88 | + |
| 89 | + log "Detected linux/${ARCH}" |
| 90 | + local url |
| 91 | + url=$(fetch_latest_url) |
| 92 | + |
| 93 | + download_and_install "$url" |
| 94 | + log "Install complete: $INSTALL_PATH" |
| 95 | +} |
| 96 | + |
| 97 | +main "$@" |
| 98 | + |
0 commit comments