OASIS-USABILITY/INSTALLER/installer_oasis.sh
2025-11-06 23:15:19 +01:00

265 lines
7.4 KiB
Bash
Executable file

#!/usr/bin/env bash
set -euo pipefail
# =========================
# OASIS Installer (simple)
# =========================
SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &>/dev/null && pwd)"
: "${SELF:=$SCRIPT_DIR/installer_oasis.sh}"
INSTALLER_DIR="$SCRIPT_DIR"
CSS_SOURCE="$INSTALLER_DIR/gtk_oasis.css"
# Imagen/icono
HERO_FILE="$INSTALLER_DIR/oasis-logito.png"; [ -f "$HERO_FILE" ] || HERO_FILE="$INSTALLER_DIR/oasis-logo.png"
WINDOW_ICON="$INSTALLER_DIR/oasis-logo.png"
# Tema / ventana
NAME="OasisInstaller"
THEME_NAME="SolarOasis"
YAD_THEME="${THEME_NAME}:dark"
# Repo (se mantiene por compatibilidad con funciones existentes)
OASIS_REPO_DEFAULT="https://code.03c8.net/KrakensLab/oasis.git"
# Estado persistente
STATE_DIR="${XDG_CONFIG_HOME:-$HOME/.config}/oasis-installer"
STATE_FILE="$STATE_DIR/state"
mkdir -p "$STATE_DIR"
have(){ command -v "$1" >/dev/null 2>&1; }
# ===== NUEVO: chequeo de npm (único cambio funcional pedido) =====
npm_ok(){
# Permite forzar el estado "no instalado" para pruebas:
# OASIS_FORCE_INSTALL=1 ./INSTALLER/installer_oasis.sh
if [ "${OASIS_FORCE_INSTALL:-0}" = "1" ]; then
return 1
fi
have npm && npm -v >/dev/null 2>&1
}
# ---------- Preflight ----------
preflight(){
# DISPLAY “de cortesía”
if [ -z "${DISPLAY:-}" ]; then export DISPLAY=":0"; fi
# YAD disponible?
if ! have yad; then
echo "✘ Falta 'yad'. Instálalo y vuelve a ejecutar." >&2
exit 1
fi
}
ensure_basics(){
local miss=()
have yad || miss+=("yad")
command -v pkexec >/dev/null 2>&1 || miss+=("policykit-1")
have xdg-user-dirs-update || miss+=("xdg-user-dirs")
if command -v dpkg >/dev/null 2>&1; then
dpkg -s hicolor-icon-theme >/dev/null 2>&1 || miss+=("hicolor-icon-theme")
fi
if ((${#miss[@]})); then
if have apt-get; then
if have pkexec; then pkexec bash -lc "apt-get update && apt-get install -y ${miss[*]}";
else sudo apt-get update && sudo apt-get install -y "${miss[@]}"; fi
fi
fi
}
ensure_theme(){
local tdir="$HOME/.themes/${THEME_NAME}/gtk-3.0"
mkdir -p "$tdir"
if [ -f "$CSS_SOURCE" ]; then
sed 's/\r$//' "$CSS_SOURCE" > "$tdir/gtk.css"
else
cat > "$tdir/gtk.css" <<'CSS'
*{background:#000;color:#E6E6E6;font-family:"Dune Rise","Cantarell","Ubuntu","DejaVu Sans",sans-serif;font-size:13pt}
grid{padding:18px}
button{
border:2px solid #FF4E00; border-radius:14px; background:#000; color:#FF4E00;
min-width:380px; min-height:46px; margin:10px 0; letter-spacing:.5px;
}
button:hover{ background:#27D980; color:#000; }
button:active{ background:#FF4E00; color:#000; }
image{ margin:8px auto 6px auto; }
CSS
fi
}
# YAD wrapper
yad_cmd(){ GTK_THEME="$YAD_THEME" NO_AT_BRIDGE=1 yad --name="$NAME" --class="$NAME" "$@"; }
# -------- Detección / estado de OASIS --------
oasis_is_installed_dir(){
local d="$1"
[[ -f "$d/oasis.sh" ]] || [[ -f "$d/src/server/server.js" ]] || [[ -d "$d/src/server/node_modules" ]]
}
save_oasis_dir(){
local d="$1"
mkdir -p "$STATE_DIR"
{
echo "OASIS_DIR=$d"
date +"SAVED=%Y-%m-%dT%H:%M:%S"
} > "$STATE_FILE"
}
read_saved_dir(){
[ -f "$STATE_FILE" ] && sed -n 's/^OASIS_DIR=//p' "$STATE_FILE" | head -n1 || true
}
guess_oasis_dir(){
local cands=()
# 1) Padre del installer (estructura estándar)
cands+=("$SCRIPT_DIR/..")
# 2) Guardado previo
local saved; saved="$(read_saved_dir || true)"
[ -n "${saved:-}" ] && cands+=("$saved")
# 3) Candidatas típicas
cands+=("$HOME/COFRE/CODERS/oasis" "$HOME/oasis" "$HOME/Projects/oasis" "$HOME/Documentos/oasis")
local d
for d in "${cands[@]}"; do
d="$(cd "$d" 2>/dev/null && pwd || true)"
[ -n "$d" ] || continue
if oasis_is_installed_dir "$d"; then
echo "$d"; return 0
fi
done
echo "$HOME/oasis"
}
# -------- Comandos auxiliares existentes (sin cambios) --------
node_setup_cmd(){ cat <<'EOF'
set -e
apt-get update
apt-get install -y git curl ca-certificates tar gnupg
curl -fsSL https://deb.nodesource.com/setup_22.x | bash -
apt-get install -y nodejs
node -v && npm -v
EOF
}
oasis_install_cmd(){ cat <<EOF
set -e
if [ ! -d "$2/.git" ]; then git clone --depth 1 "$1" "$2"; else cd "$2" && git pull --rebase || true; fi
cd "$2/src/server"
npm install .
npm audit fix || true
EOF
}
oasis_start_cmd(){ cat <<'EOF'
set -e
DIR="$1"
PORT="${2:-3000}"
# ¿Ya está levantado?
if ss -lnt sport = :$PORT | grep -q "$PORT"; then
echo "Oasis ya está escuchando en $PORT"
else
nohup bash -lc "cd \"$DIR\" && exec bash oasis.sh" > /tmp/oasis_gui.log 2>&1 &
for i in $(seq 1 30); do
if ss -lnt sport = :$PORT | grep -q "$PORT"; then
echo "Oasis levantado en $PORT"
break
fi
sleep 1
done
fi
# Abrir navegador siempre
xdg-open "http://localhost:$PORT" >/dev/null 2>&1 || true
EOF
}
progress_user(){ bash -lc "$2" 2>&1 | yad_cmd --progress --title="$1" --pulsate --auto-close --no-buttons --width=700 --height=180 --center; }
progress_root(){ pkexec bash -lc "$2" 2>&1 | yad_cmd --progress --title="$1" --pulsate --auto-close --no-buttons --width=700 --height=180 --center; }
oasis_quick_install(){
local dir="$1"
progress_root "OASIS: Node.js 22" "$(node_setup_cmd)"
progress_user "OASIS: Clonar + npm" "$(oasis_install_cmd "$OASIS_REPO_DEFAULT" "$dir")"
save_oasis_dir "$dir"
}
oasis_quick_start(){
local dir="$1"
progress_user "OASIS: Abrir" "$(oasis_start_cmd "$dir" 3000)"
}
# -------- UI --------
home_oasis_dialog(){
local OASIS_DIR; OASIS_DIR="$(guess_oasis_dir)"
save_oasis_dir "$OASIS_DIR"
local O_VER="—"
if [ -f "$OASIS_DIR/src/server/package.json" ]; then
O_VER="$(sed -n 's/.*"version"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p' "$OASIS_DIR/src/server/package.json" | head -n1)"
[ -z "$O_VER" ] && O_VER="—"
fi
# Subcomandos (OPEN se mantiene EXACTO como antes)
local BTN_OPEN_SITE="/bin/bash -lc '$SELF --open-site'"
local BTN_INSTALL="/bin/bash -lc '$SELF --do-install'"
local BTN_OPEN="/bin/bash -lc '$SELF --open-now'"
# ===== ÚNICO CAMBIO: decidir etiqueta/acción de INSTALL según npm =====
local INSTALL_LABEL="INSTALL:BTN"
if npm_ok; then
INSTALL_LABEL="ALREADY INSTALLED:BTN"
BTN_INSTALL="/bin/true"
fi
# (No tocamos BTN_OPEN)
yad_cmd \
--title="SOLAR NET HUB" --window-icon="$WINDOW_ICON" \
--center --width=720 --height=600 \
--image="$HERO_FILE" --image-on-top \
--form --borders=16 --columns=1 --align=center \
\
--field="OASIS PROJECT:BTN" "$BTN_OPEN_SITE" \
--field="$INSTALL_LABEL" "$BTN_INSTALL" \
--field="OPEN:BTN" "$BTN_OPEN" \
--field="VERSION ( $O_VER ):BTN" "/bin/true" \
\
--buttons-layout=center \
--button="CERRAR:0"
}
# -------- Subcomandos --------
case "${1:-}" in
--open-site)
xdg-open "https://oasis-project.pub" >/dev/null 2>&1 || true
exit 0
;;
--do-install)
preflight; ensure_basics; ensure_theme
# Ejecutar el install.sh del raíz del repo (padre de INSTALLER)
if [ -f "$SCRIPT_DIR/../install.sh" ]; then
/bin/bash -lc "cd \"$SCRIPT_DIR/..\" && bash install.sh"
else
yad_cmd --error --title="OASIS Installer" --text="No se encontró install.sh en $SCRIPT_DIR/.."
exit 1
fi
# Guardar ruta para OPEN
dir="$(cd "$SCRIPT_DIR/.." && pwd)"
save_oasis_dir "$dir"
exit 0
;;
--open-now)
preflight; ensure_basics; ensure_theme
dir="$(read_saved_dir)"; [ -n "${dir:-}" ] || dir="$(guess_oasis_dir)"
save_oasis_dir "$dir"
oasis_quick_start "$dir"
exit 0
;;
*)
preflight; ensure_basics; ensure_theme
home_oasis_dialog
;;
esac