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
|
||||
# lib/steps/repos.sh — clonar repositorios + generar .env
|
||||
# lib/steps/singbox.sh — instalar/verificar sing-box
|
||||
|
||||
step_repos() {
|
||||
print_section "Repositories"
|
||||
log_step "Cloning repositories & configuring .env" 2 $TOTAL_STEPS
|
||||
step_singbox() {
|
||||
print_section "sing-box"
|
||||
log_step "Checking sing-box binary" 4 $TOTAL_STEPS
|
||||
|
||||
mkdir -p "$HV_BASE"
|
||||
chmod 700 "$HV_BASE"
|
||||
|
||||
_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"
|
||||
local found=""
|
||||
for candidate in /usr/bin/sing-box /usr/local/bin/sing-box /bin/sing-box; do
|
||||
[ -x "$candidate" ] && found="$candidate" && break
|
||||
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() {
|
||||
local env_file="$HV_CORE/.env"
|
||||
local example_file="$HV_CORE/.env.example"
|
||||
_install_singbox() {
|
||||
log_info "sing-box no encontrado — instalando v${SINGBOX_VERSION}..."
|
||||
|
||||
if [ ! -f "$example_file" ]; then
|
||||
log_error ".env.example no encontrado: ${example_file}"
|
||||
local arch
|
||||
arch=$(uname -m)
|
||||
case "$arch" in
|
||||
x86_64) arch="amd64" ;;
|
||||
aarch64) arch="arm64" ;;
|
||||
*)
|
||||
log_error "Arquitectura no soportada: ${arch}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -f "$env_file" ]; then
|
||||
log_warn ".env ya existe — sobreescribiendo"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
printf " ${DIM}Completá las variables. ENTER = dejar vacío.${RESET}\n"
|
||||
print_divider
|
||||
echo ""
|
||||
|
||||
# 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
|
||||
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-$$"
|
||||
|
||||
# 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}
|
||||
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
|
||||
fi
|
||||
|
||||
# ── Generado por el installer ─────────────────────────────────────────────
|
||||
HV_CORE_HOME=${HV_CORE}
|
||||
INSTALL_DIR=${HOME}
|
||||
CORE_DIR=${HV_CORE}
|
||||
EOF
|
||||
start_spinner "Extrayendo..."
|
||||
mkdir -p "$tmp_dir"
|
||||
tar -xzf "$tmp_tar" -C "$tmp_dir" --strip-components=1
|
||||
stop_spinner "Extraído"
|
||||
|
||||
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}"
|
||||
sudo cp "$tmp_dir/sing-box" "$SINGBOX_BIN"
|
||||
sudo chmod 755 "$SINGBOX_BIN"
|
||||
rm -rf "$tmp_tar" "$tmp_dir"
|
||||
log_ok "sing-box instalado: $($SINGBOX_BIN version | head -1)"
|
||||
}
|
||||
Loading…
Reference in a new issue