#!/bin/bash #=============================================================================== # Tekapo Terminal Platform – installationsprogram. # # sudo bash -c "$(curl -fsSL https://setup.tekapo.se)" # # Formen ovan är medveten: hela skriptet laddas ned innan något körs, och stdin # förblir terminalen så att menyns frågor fungerar. En pipe (curl | bash) klarar # ingetdera. # # Flaggor (efter ett argument som blir $0): # sudo bash -c "$(curl -fsSL https://setup.tekapo.se)" tekapo-setup --no-menu # ... tekapo-setup --profile nyckelskap --yes # # Miljövariabler: # TEKAPO_VERSION hämta en bestämd version i stället för den senaste # TEKAPO_BASE_URL annan distributionsadress (test eller intern spegel) # TEKAPO_INSTALL_DIR annan installationskatalog (standard /opt/...) #=============================================================================== # Allt ligger i main() som anropas allra sist. En avbruten nedladdning ger då # ett ofullständigt skript som inte kan köra någon halv rad. main() { set -euo pipefail local base_url="${TEKAPO_BASE_URL:-https://setup.tekapo.se}" local install_dir="${TEKAPO_INSTALL_DIR:-/opt/tekapo-terminal-platform}" local symlink="${TEKAPO_SYMLINK:-/usr/local/bin/tekapo-setup}" local start_menu=1 local menu_args=() while [ $# -gt 0 ]; do case "$1" in --no-menu) start_menu=0; shift ;; -h|--help) # Skriptet körs ofta via bash -c, då $0 inte är en fil att läsa cat <<'HELP' Tekapo Terminal Platform – installationsprogram sudo bash -c "$(curl -fsSL https://setup.tekapo.se)" sudo bash -c "$(curl -fsSL https://setup.tekapo.se)" tekapo-setup --no-menu sudo bash -c "$(curl -fsSL https://setup.tekapo.se)" tekapo-setup --profile nyckelskap --yes Flaggor: --no-menu installera utan att starta menyn övriga flaggor skickas vidare till setup.sh Miljövariabler: TEKAPO_VERSION hämta en bestämd version i stället för den senaste TEKAPO_BASE_URL annan distributionsadress (test eller intern spegel) TEKAPO_INSTALL_DIR annan installationskatalog (standard /opt/tekapo-terminal-platform) HELP return 0 ;; *) menu_args+=("$1"); shift ;; esac done local red green yellow blue nc red='\033[0;31m'; green='\033[0;32m'; yellow='\033[1;33m'; blue='\033[0;34m'; nc='\033[0m' say() { echo -e "${green}✓${nc} $1"; } warn() { echo -e "${yellow}⚠${nc} $1"; } fail() { echo -e "${red}✗${nc} $1" >&2; exit 1; } echo -e "${blue}" echo "============================================" echo " Tekapo Terminal Platform" echo "============================================" echo -e "${nc}" #--------------------------------------------------------------------------- # Kontrollera miljön innan något laddas ned #--------------------------------------------------------------------------- [ "$(id -u)" -eq 0 ] || fail "Kör som root: sudo bash -c \"\$(curl -fsSL $base_url)\"" if [ "$(uname -s)" != "Linux" ]; then fail "Plattformen installeras bara på Raspberry Pi OS (Linux). Hittade: $(uname -s)" fi if ! grep -qi "raspberry pi" /proc/device-tree/model 2>/dev/null; then warn "Detta verkar inte vara en Raspberry Pi – fortsätter ändå." fi for tool in curl tar; do command -v "$tool" >/dev/null 2>&1 || fail "Kommandot '$tool' saknas. Installera det med: apt install $tool" done #--------------------------------------------------------------------------- # Version #--------------------------------------------------------------------------- local version="${TEKAPO_VERSION:-}" if [ -z "$version" ]; then version=$(curl -fsSL "$base_url/VERSION" 2>/dev/null | tr -d '[:space:]') \ || fail "Kunde inte hämta versionsinformation från $base_url" fi [ -n "$version" ] || fail "Tom versionsinformation från $base_url/VERSION" say "Version att installera: $version" #--------------------------------------------------------------------------- # Hämta och verifiera paketet #--------------------------------------------------------------------------- local package="tekapo-terminal-platform-$version.tar.gz" # Global, inte local, så att trap:en kan städa även efter att main returnerat TEKAPO_TMP_DIR=$(mktemp -d) local tmp_dir="$TEKAPO_TMP_DIR" trap 'rm -rf "${TEKAPO_TMP_DIR:-}"' EXIT echo "Hämtar $package ..." curl -fSL -o "$tmp_dir/$package" "$base_url/releases/$package" \ || fail "Kunde inte hämta $base_url/releases/$package" curl -fsSL -o "$tmp_dir/$package.sha256" "$base_url/releases/$package.sha256" \ || fail "Kunde inte hämta checksumman för $package" local expected actual expected=$(awk '{print $1}' "$tmp_dir/$package.sha256") if command -v sha256sum >/dev/null 2>&1; then actual=$(sha256sum "$tmp_dir/$package" | awk '{print $1}') else actual=$(shasum -a 256 "$tmp_dir/$package" | awk '{print $1}') fi if [ "$expected" != "$actual" ]; then fail "Checksumman stämmer inte – paketet packas inte upp. förväntat: $expected faktiskt: $actual" fi say "Checksumman verifierad" #--------------------------------------------------------------------------- # Packa upp #--------------------------------------------------------------------------- tar -xzf "$tmp_dir/$package" -C "$tmp_dir" || fail "Kunde inte packa upp $package" local unpacked="$tmp_dir/tekapo-terminal-platform-$version" [ -d "$unpacked" ] || fail "Oväntat innehåll i paketet: katalogen $unpacked saknas" [ -f "$unpacked/setup.sh" ] || fail "Paketet saknar setup.sh" if [ -d "$install_dir" ]; then local backup="$install_dir.bak-$(date +%Y%m%d-%H%M%S)" mv "$install_dir" "$backup" say "Tidigare installation flyttad till $backup" fi mkdir -p "$(dirname "$install_dir")" mv "$unpacked" "$install_dir" chown -R root:root "$install_dir" find "$install_dir" -name '*.sh' -exec chmod +x {} + find "$install_dir/nfc-keyboard/scripts" -name '*.py' -exec chmod +x {} + 2>/dev/null || true say "Installerad i $install_dir" ln -sfn "$install_dir/setup.sh" "$symlink" say "Kommandot 'tekapo-setup' är tillgängligt" #--------------------------------------------------------------------------- # Starta menyn #--------------------------------------------------------------------------- if [ "$start_menu" -eq 1 ]; then echo "" # exec ersätter processen, så trap:en hinner inte städa rm -rf "$TEKAPO_TMP_DIR" exec "$install_dir/setup.sh" ${menu_args+"${menu_args[@]}"} fi echo "" echo "Kör menyn när du vill med:" echo " sudo tekapo-setup" } main "$@"