scripts/fetch-singbox.sh
Rama main · réplica de lectura del repositorio original.
#!/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"