#!/usr/bin/env bash # Скачивает sing-box (sidecar) + geoip-ru.srs для macOS/Linux и кладёт в # src-tauri/binaries/ с именами под Tauri (target-triple). Бинарники в git не # хранятся (см. .gitignore) — запусти после клонирования: # bash scripts/fetch-singbox.sh # # amneziawg/wintun — только Windows (см. fetch-singbox.ps1). set -euo pipefail SINGBOX_VERSION="1.14.0" ROOT="$(cd "$(dirname "$0")/.." && pwd)" BIN_DIR="$ROOT/src-tauri/binaries" mkdir -p "$BIN_DIR" os="$(uname -s)" arch="$(uname -m)" case "$os" in Darwin) sb_os="darwin" ;; Linux) sb_os="linux" ;; *) echo "Неподдерживаемая ОС: $os (для Windows используйте fetch-singbox.ps1)"; exit 1 ;; esac case "$arch" in arm64|aarch64) sb_arch="arm64"; cpu="aarch64" ;; x86_64|amd64) sb_arch="amd64"; cpu="x86_64" ;; *) echo "Неподдерживаемая архитектура: $arch"; exit 1 ;; esac if [ "$sb_os" = "darwin" ]; then triple="${cpu}-apple-darwin" else triple="${cpu}-unknown-linux-gnu" fi dest="$BIN_DIR/sing-box-${triple}" need_download=1 if [ -f "$dest" ]; then existing="$("$dest" version 2>/dev/null | head -1 || true)" echo "sing-box уже на месте: $existing" case "$existing" in *"$SINGBOX_VERSION"*) need_download=0 ;; *) echo "Версия отличается от $SINGBOX_VERSION — перекачиваю." ;; esac fi if [ "$need_download" = 1 ]; then asset="sing-box-${SINGBOX_VERSION}-${sb_os}-${sb_arch}.tar.gz" url="https://github.com/SagerNet/sing-box/releases/download/v${SINGBOX_VERSION}/${asset}" tmp="$(mktemp -d)" echo "Скачиваю $url" curl -sL "$url" -o "$tmp/sb.tar.gz" tar -xzf "$tmp/sb.tar.gz" -C "$tmp" exe="$(find "$tmp" -name sing-box -type f | head -1)" # Снимаем старый бинарник, а не пишем поверх: перезапись работающего # sing-box вернёт ETXTBSY («Text file busy»), а unlink разрешён всегда. rm -f "$dest" cp "$exe" "$dest" chmod +x "$dest" rm -rf "$tmp" echo "Готово: $dest" "$dest" version | head -1 fi # geoip-ru.srs (RU-обход в split-tunneling) geoip="$BIN_DIR/geoip-ru.srs" geoip_tmp="$geoip.tmp" echo "Обновляю geoip-ru.srs" curl -fsSL "https://raw.githubusercontent.com/SagerNet/sing-geoip/rule-set/geoip-ru.srs" -o "$geoip_tmp" if [ "$(wc -c < "$geoip_tmp")" -lt 10000 ] || [ "$(head -c 4 "$geoip_tmp" | od -An -tx1 | tr -d ' \n')" != "53525301" ]; then rm -f "$geoip_tmp" echo "Загруженный geoip-ru.srs не прошёл проверку" >&2 exit 1 fi mv -f "$geoip_tmp" "$geoip" echo "Готово: $geoip"