diff --git a/lib/steps/singbox.sh b/lib/steps/singbox.sh index 07710d1..5b27791 100644 --- a/lib/steps/singbox.sh +++ b/lib/steps/singbox.sh @@ -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 + ;; + 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 fi - if [ -f "$env_file" ]; then - log_warn ".env ya existe — sobreescribiendo" - fi + start_spinner "Extrayendo..." + mkdir -p "$tmp_dir" + tar -xzf "$tmp_tar" -C "$tmp_dir" --strip-components=1 + stop_spinner "Extraído" - 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 - - # 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}" + 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)" } \ No newline at end of file