Ctrl K
ComunidadGuías…

install.sh

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
#!/bin/sh
# Install Sideporch from its GitHub releases.
#
#   curl -fsSL https://raw.githubusercontent.com/niklas-heer/sideporch/main/install.sh | sh
#
# Environment:
#   SIDEPORCH_VERSION      version to install, such as 0.1.0 (default: latest)
#   SIDEPORCH_INSTALL_DIR  where to put the binary (default: /usr/local/bin
#                          when writable, otherwise ~/.local/bin)
#   SIDEPORCH_DOWNLOAD_URL base URL of the release files (default: GitHub)
#
# Linux binaries are static: they need no libc or other system libraries.
set -eu

repo="niklas-heer/sideporch"
# Signs every release's SHA256SUMS (from 0.5.0 on); also at https://sideporch.app/sideporch.pub.
public_key="RWRtn2cj2SpGnZDtKTNsgnc8mv68NfwlwFgA+hcmOD+cWH8dSQxGkuoo"

fail() {
  echo "sideporch install: $*" >&2
  exit 1
}

need() {
  command -v "$1" >/dev/null 2>&1 || fail "this script needs $1"
}

need curl
need tar
need uname

case "$(uname -s)" in
  Linux) os="unknown-linux-musl" ;;
  Darwin) os="apple-darwin" ;;
  *) fail "no prebuilt binary for $(uname -s); build from source with cargo" ;;
esac
case "$(uname -m)" in
  x86_64 | amd64) arch="x86_64" ;;
  arm64 | aarch64) arch="aarch64" ;;
  *) fail "no prebuilt binary for $(uname -m); build from source with cargo" ;;
esac
target="$arch-$os"

version="${SIDEPORCH_VERSION:-latest}"
version="${version#v}"
if [ "$version" = "latest" ]; then
  # GitHub redirects /releases/latest to /releases/tag/vX.Y.Z.
  latest=$(curl -fsSLI -o /dev/null -w '%{url_effective}' "https://github.com/$repo/releases/latest") ||
    fail "could not find the latest release"
  version="${latest##*/v}"
fi
case "$version" in
  *[!0-9.]* | "") fail "unexpected version: $version" ;;
esac

base="${SIDEPORCH_DOWNLOAD_URL:-https://github.com/$repo/releases/download/v$version}"
archive="sideporch-$version-$target.tar.gz"

temporary=$(mktemp -d)
trap 'rm -rf "$temporary"' EXIT HUP INT TERM

echo "Downloading Sideporch $version for $target"
curl -fsSL "$base/$archive" -o "$temporary/$archive" || fail "download failed: $base/$archive"
curl -fsSL "$base/SHA256SUMS" -o "$temporary/SHA256SUMS" || fail "download failed: $base/SHA256SUMS"
# With minisign installed, also check the checksums come from a release.
if command -v minisign >/dev/null 2>&1; then
  if curl -fsSL "$base/SHA256SUMS.minisig" -o "$temporary/SHA256SUMS.minisig" 2>/dev/null; then
    minisign -Vq -P "$public_key" -m "$temporary/SHA256SUMS" || fail "SHA256SUMS isn't signed with Sideporch's release key"
    echo "Verified the release signature"
  else
    echo "This release has no signature; releases before 0.5.0 weren't signed"
  fi
fi

expected=$(awk -v name="$archive" '$2 == name || $2 == "./" name { print $1 }' "$temporary/SHA256SUMS")
[ -n "$expected" ] || fail "SHA256SUMS has no entry for $archive"
if command -v sha256sum >/dev/null 2>&1; then
  actual=$(sha256sum "$temporary/$archive" | awk '{ print $1 }')
elif command -v shasum >/dev/null 2>&1; then
  actual=$(shasum -a 256 "$temporary/$archive" | awk '{ print $1 }')
else
  fail "this script needs sha256sum or shasum to verify the download"
fi
[ "$expected" = "$actual" ] || fail "checksum mismatch for $archive"

tar -xzf "$temporary/$archive" -C "$temporary" sideporch

directory="${SIDEPORCH_INSTALL_DIR:-}"
if [ -z "$directory" ]; then
  if [ -w /usr/local/bin ]; then
    directory=/usr/local/bin
  else
    directory="$HOME/.local/bin"
  fi
fi
mkdir -p "$directory"
install -m 755 "$temporary/sideporch" "$directory/sideporch" 2>/dev/null ||
  { cp "$temporary/sideporch" "$directory/sideporch" && chmod 755 "$directory/sideporch"; }

echo "Installed $("$directory/sideporch" --version) to $directory/sideporch"
case ":$PATH:" in
  *":$directory:"*) ;;
  *) echo "Add $directory to your PATH to run it as 'sideporch'." ;;
esac
echo "Start it with: sideporch --data ./sideporch-data"