#!/bin/sh # Tailscale update helper script ARCH=$(uname -m) case "$ARCH" in x86_64|amd64) TS_ARCH="amd64" ;; aarch64|arm64) TS_ARCH="arm64" ;; armv7l) TS_ARCH="arm" ;; *) echo '{"error":"unsupported architecture: '$ARCH'"}'; exit 1 ;; esac get_current_version() { if [ -x /usr/sbin/tailscale ]; then /usr/sbin/tailscale version 2>/dev/null | head -1 | tr -d '\n' else echo "not installed" fi } check_update() { CURRENT=$( get_current_version ) LATEST=$( wget -qO- "https://api.github.com/repos/tailscale/tailscale/releases/latest" 2>/dev/null | \ grep '"tag_name"' | sed 's/.*"v\([^"]*\)".*/\1/' ) if [ -z "$LATEST" ]; then echo "{\"current\":\"$CURRENT\",\"latest\":\"unknown\",\"error\":\"failed to fetch latest version\"}" else echo "{\"current\":\"$CURRENT\",\"latest\":\"$LATEST\"}" fi } do_update() { LATEST=$( wget -qO- "https://api.github.com/repos/tailscale/tailscale/releases/latest" 2>/dev/null | \ grep '"tag_name"' | sed 's/.*"v\([^"]*\)".*/\1/' ) if [ -z "$LATEST" ]; then echo '{"error":"failed to fetch latest version"}' exit 1 fi URL="https://pkgs.tailscale.com/stable/tailscale_${LATEST}_${TS_ARCH}.tgz" TMP_DIR="/tmp/tailscale_update" rm -rf "$TMP_DIR" mkdir -p "$TMP_DIR" wget -qO "$TMP_DIR/tailscale.tgz" "$URL" 2>/dev/null if [ ! -s "$TMP_DIR/tailscale.tgz" ]; then echo "{\"error\":\"download failed: $URL\"}" rm -rf "$TMP_DIR" exit 1 fi tar -xzf "$TMP_DIR/tailscale.tgz" -C "$TMP_DIR" 2>/dev/null EXTRACT_DIR="$TMP_DIR/tailscale_${LATEST}_${TS_ARCH}" if [ ! -f "$EXTRACT_DIR/tailscale" ] || [ ! -f "$EXTRACT_DIR/tailscaled" ]; then echo '{"error":"extracted files not found"}' rm -rf "$TMP_DIR" exit 1 fi /etc/init.d/tailscale stop 2>/dev/null sleep 1 cp "$EXTRACT_DIR/tailscale" /usr/sbin/tailscale cp "$EXTRACT_DIR/tailscaled" /usr/sbin/tailscaled chmod +x /usr/sbin/tailscale /usr/sbin/tailscaled /etc/init.d/tailscale start 2>/dev/null rm -rf "$TMP_DIR" NEW_VER=$( get_current_version ) echo "{\"success\":true,\"version\":\"$NEW_VER\"}" } case "$1" in check_update) check_update ;; do_update) do_update ;; *) echo '{"error":"usage: tailscale_helper check_update|do_update"}' ;; esac