install.sh: стриминг бинарников сразу в dest без staging в /tmp

/tmp на OpenWRT — tmpfs (RAM): 14МБ sing-box.gz на низкобюджетных
роутерах вымывали userspace (включая dropbear). Теперь gzip-поток
идёт прямо в /usr/bin, как в nikovpn.py
This commit is contained in:
Niko Marmeladkov 2026-08-26 12:30:59 +03:00
parent e2d5e21ab0
commit 6520dee876
Signed by: Niko
GPG key ID: E3B955F9442D44E3

View file

@ -70,6 +70,33 @@ dl() { # $1=url $2=out ; резерв на http:// для f.n1ko.dev
[ -n "$ok" ]
}
pipe_dl() { # $1=url -> поток в stdout (для больших файлов: без staging в tmpfs,
# /tmp на OpenWRT — это RAM, крупный бинарник туда класть нельзя)
if [ "$DL" = curl ]; then
curl -fsSL --max-time 600 "$1"
else
wget -q -T 600 -O - "$1"
fi
}
fetch_gz() { # $1=имя-файла $2=dest ; источники: локальный bin/ -> релиз -> f.n1ko.dev
local f="$1" out="$2" ok=0
if [ -f "$REPO_DIR/bin/$f" ]; then
gzip -dc "$REPO_DIR/bin/$f" > "$out" 2>/dev/null && [ -s "$out" ] && ok=1
fi
if [ $ok != 1 ]; then
log "Качаю $f из релизов git.n1ko.dev ..."
pipe_dl "$REL_URL/$f" | gzip -dc > "$out" 2>/dev/null
[ -s "$out" ] && ok=1
fi
if [ $ok != 1 ]; then
log "Качаю $f с f.n1ko.dev ..."
pipe_dl "$BASE_URL/bin/$f" | gzip -dc > "$out" 2>/dev/null
[ -s "$out" ] && ok=1
fi
[ $ok = 1 ]
}
# --- API (HTTP Basic auth) ---
API_AUTH=""; API_AUTH_V=""
api_init_auth() {
@ -462,28 +489,16 @@ install_bins() {
if [ "$skip_sb" != 1 ]; then
log "Получаю sing-box ($SB_ARCH) ..."
dl "$REL_URL/sing-box-$SB_ARCH.gz" "$TMP/sing-box.gz" || \
dl "$BASE_URL/bin/sing-box-$SB_ARCH.gz" "$TMP/sing-box.gz" || \
cp "$REPO_DIR/bin/sing-box-$SB_ARCH.gz" "$TMP/sing-box.gz" 2>/dev/null
[ -s "$TMP/sing-box.gz" ] || die "не удалось скачать sing-box"
gzip -dc "$TMP/sing-box.gz" > "$TMP/sing-box" 2>/dev/null || die "повреждённый архив sing-box"
chmod +x "$TMP/sing-box"
"$TMP/sing-box" version >/dev/null 2>&1 || die "sing-box не запускается на этой системе (архитектура?)"
mv "$TMP/sing-box" "$SB_PATH"
rm -f "$TMP/sing-box.gz"
fetch_gz "sing-box-$SB_ARCH.gz" "$SB_PATH" || die "не удалось скачать sing-box"
chmod +x "$SB_PATH"
"$SB_PATH" version >/dev/null 2>&1 || die "sing-box не запускается на этой системе (архитектура?)"
fi
if [ "$TUNNEL" = "ipt2socks" ] && [ "$skip_ipt" != 1 ]; then
log "Получаю ipt2socks ($IPT_ARCH) ..."
dl "$REL_URL/ipt2socks-$IPT_ARCH.gz" "$TMP/ipt2socks.gz" || \
dl "$BASE_URL/bin/ipt2socks-$IPT_ARCH.gz" "$TMP/ipt2socks.gz" || \
cp "$REPO_DIR/bin/ipt2socks-$IPT_ARCH.gz" "$TMP/ipt2socks.gz" 2>/dev/null
[ -s "$TMP/ipt2socks.gz" ] || die "не удалось скачать ipt2socks"
gzip -dc "$TMP/ipt2socks.gz" > "$TMP/ipt2socks" 2>/dev/null || die "повреждённый архив ipt2socks"
chmod +x "$TMP/ipt2socks"
"$TMP/ipt2socks" -V >/dev/null 2>&1 || die "ipt2socks не запускается на этой системе (архитектура?)"
mv "$TMP/ipt2socks" "$IPT_PATH"
rm -f "$TMP/ipt2socks.gz"
fetch_gz "ipt2socks-$IPT_ARCH.gz" "$IPT_PATH" || die "не удалось скачать ipt2socks"
chmod +x "$IPT_PATH"
"$IPT_PATH" -V >/dev/null 2>&1 || die "ipt2socks не запускается на этой системе (архитектура?)"
fi
}