Actualizar lib/steps/singbox.sh
This commit is contained in:
parent
eaa28aada1
commit
50bf6503d9
1 changed files with 62 additions and 84 deletions
|
|
@ -1,96 +1,74 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# lib/steps/repos.sh — clonar repositorios + generar .env
|
# lib/steps/singbox.sh — instalar/verificar sing-box
|
||||||
|
|
||||||
step_repos() {
|
step_singbox() {
|
||||||
print_section "Repositories"
|
print_section "sing-box"
|
||||||
log_step "Cloning repositories & configuring .env" 2 $TOTAL_STEPS
|
log_step "Checking sing-box binary" 4 $TOTAL_STEPS
|
||||||
|
|
||||||
mkdir -p "$HV_BASE"
|
local found=""
|
||||||
chmod 700 "$HV_BASE"
|
for candidate in /usr/bin/sing-box /usr/local/bin/sing-box /bin/sing-box; do
|
||||||
|
[ -x "$candidate" ] && found="$candidate" && break
|
||||||
_clone_repos
|
|
||||||
_setup_env
|
|
||||||
}
|
|
||||||
|
|
||||||
_clone_repos() {
|
|
||||||
for name in essentials cli gui; do
|
|
||||||
local url="${REPO_URLS[$name]}"
|
|
||||||
local branch="${REPO_BRANCHES[$name]}"
|
|
||||||
local dest="${REPO_DIRS[$name]}"
|
|
||||||
|
|
||||||
if [ -d "$dest/.git" ]; then
|
|
||||||
log_warn "Repo ya existe: ${dest}"
|
|
||||||
if ask_confirm "Eliminar y re-clonar ${name}?"; then
|
|
||||||
rm -rf "$dest"
|
|
||||||
else
|
|
||||||
log_skip "Re-clone omitido — usando ${dest}"
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
start_spinner "Clonando ${name} (branch: ${branch})..."
|
|
||||||
if git clone --branch "$branch" "$url" "$dest" &>/dev/null; then
|
|
||||||
stop_spinner "${name} clonado → ${dest}"
|
|
||||||
else
|
|
||||||
stop_spinner
|
|
||||||
log_error "git clone falló: ${url}"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
chmod 700 "$dest"
|
|
||||||
done
|
done
|
||||||
|
[ -z "$found" ] && found=$(command -v sing-box 2>/dev/null || true)
|
||||||
|
|
||||||
|
if [ -n "$found" ]; then
|
||||||
|
local ver
|
||||||
|
ver=$("$found" version 2>/dev/null | head -1 || echo "unknown")
|
||||||
|
log_ok "Encontrado: ${found} (${ver})"
|
||||||
|
if [ "$found" != "$SINGBOX_BIN" ]; then
|
||||||
|
sudo ln -sf "$found" "$SINGBOX_BIN"
|
||||||
|
log_ok "Symlink → ${SINGBOX_BIN}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
_install_singbox
|
||||||
|
fi
|
||||||
|
|
||||||
|
# setcap — sing-box crea TUN sin necesitar root completo
|
||||||
|
if command -v setcap &>/dev/null; then
|
||||||
|
sudo setcap cap_net_admin,cap_net_raw+ep "$SINGBOX_BIN"
|
||||||
|
log_ok "setcap cap_net_admin,cap_net_raw+ep → ${SINGBOX_BIN}"
|
||||||
|
else
|
||||||
|
log_warn "setcap no disponible — sing-box necesitará sudo para TUN"
|
||||||
|
fi
|
||||||
|
|
||||||
|
log_ok "sing-box listo → ${SINGBOX_BIN}"
|
||||||
}
|
}
|
||||||
|
|
||||||
_setup_env() {
|
_install_singbox() {
|
||||||
local env_file="$HV_CORE/.env"
|
log_info "sing-box no encontrado — instalando v${SINGBOX_VERSION}..."
|
||||||
local example_file="$HV_CORE/.env.example"
|
|
||||||
|
|
||||||
if [ ! -f "$example_file" ]; then
|
local arch
|
||||||
log_error ".env.example no encontrado: ${example_file}"
|
arch=$(uname -m)
|
||||||
|
case "$arch" in
|
||||||
|
x86_64) arch="amd64" ;;
|
||||||
|
aarch64) arch="arm64" ;;
|
||||||
|
*)
|
||||||
|
log_error "Arquitectura no soportada: ${arch}"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
local url="https://github.com/SagerNet/sing-box/releases/download/v${SINGBOX_VERSION}/sing-box-${SINGBOX_VERSION}-linux-${arch}.tar.gz"
|
||||||
|
local tmp_tar="/tmp/sing-box-$$.tar.gz"
|
||||||
|
local tmp_dir="/tmp/sing-box-$$"
|
||||||
|
|
||||||
|
start_spinner "Descargando sing-box v${SINGBOX_VERSION}..."
|
||||||
|
if wget -q --timeout=60 "$url" -O "$tmp_tar"; then
|
||||||
|
stop_spinner "Descarga completa"
|
||||||
|
else
|
||||||
|
stop_spinner
|
||||||
|
rm -f "$tmp_tar"
|
||||||
|
log_error "Descarga falló: ${url}"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -f "$env_file" ]; then
|
start_spinner "Extrayendo..."
|
||||||
log_warn ".env ya existe — sobreescribiendo"
|
mkdir -p "$tmp_dir"
|
||||||
fi
|
tar -xzf "$tmp_tar" -C "$tmp_dir" --strip-components=1
|
||||||
|
stop_spinner "Extraído"
|
||||||
|
|
||||||
echo ""
|
sudo cp "$tmp_dir/sing-box" "$SINGBOX_BIN"
|
||||||
printf " ${DIM}Completá las variables. ENTER = dejar vacío.${RESET}\n"
|
sudo chmod 755 "$SINGBOX_BIN"
|
||||||
print_divider
|
rm -rf "$tmp_tar" "$tmp_dir"
|
||||||
echo ""
|
log_ok "sing-box instalado: $($SINGBOX_BIN version | head -1)"
|
||||||
|
|
||||||
# APP_ENV
|
|
||||||
select_option \
|
|
||||||
"APP_ENV — entorno de la aplicación" \
|
|
||||||
"local desarrollo / testing" \
|
|
||||||
"production producción / dominio real"
|
|
||||||
|
|
||||||
case "$SELECT_RESULT" in
|
|
||||||
0) _app_env="local" ;;
|
|
||||||
1) _app_env="production" ;;
|
|
||||||
*) _app_env="production" ;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# SP_API_BASE_URL_PRODUCTION
|
|
||||||
echo ""
|
|
||||||
printf " ${BCYAN}┌─${RESET} ${BWHITE}SP_API_BASE_URL_PRODUCTION${RESET} ${DIM}e.g. https://fake.simplifiedprivacy.org/api/v1${RESET}\n"
|
|
||||||
printf " ${BCYAN}›${RESET} "
|
|
||||||
read -r _api_url < /dev/tty
|
|
||||||
|
|
||||||
# Escribir .env
|
|
||||||
cat > "$env_file" << EOF
|
|
||||||
APP_ENV=${_app_env}
|
|
||||||
SP_API_BASE_URL_LOCAL=http://simplifiedprivacy.test/api/v1
|
|
||||||
SP_API_BASE_URL_PRODUCTION=${_api_url}
|
|
||||||
|
|
||||||
# ── Generado por el installer ─────────────────────────────────────────────
|
|
||||||
HV_CORE_HOME=${HV_CORE}
|
|
||||||
INSTALL_DIR=${HOME}
|
|
||||||
CORE_DIR=${HV_CORE}
|
|
||||||
EOF
|
|
||||||
|
|
||||||
chmod 600 "$env_file"
|
|
||||||
log_ok "APP_ENV=${_app_env}"
|
|
||||||
[ -n "$_api_url" ] && log_ok "SP_API_BASE_URL_PRODUCTION=${_api_url}" || label_skip "SP_API_BASE_URL_PRODUCTION — vacío"
|
|
||||||
log_ok "INSTALL_DIR=${HOME}"
|
|
||||||
log_ok ".env escrito → ${env_file}"
|
|
||||||
}
|
}
|
||||||
Loading…
Reference in a new issue