#!/usr/bin/env bash set -euo pipefail # ========================= # SOLAR NET HUB - Installer # ========================= # --- Rutas --- SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &>/dev/null && pwd)" : "${SELF:=$SCRIPT_DIR/installer.sh}" # ruta absoluta a este script INSTALLER_DIR="$SCRIPT_DIR" CSS_SOURCE="$INSTALLER_DIR/gtk.css" HERO_IMAGE="$INSTALLER_DIR/oasis-ecoin.png" # imagen con los dos logos (head) # ICONOS INDIVIDUALES (se usan en ensure_local_icons y en el .desktop) ICON_OASIS="$INSTALLER_DIR/oasis-logo.png" ICON_ECOIN="$INSTALLER_DIR/ecoin.png" APPS_DIR="$HOME/.local/share/applications" DESKTOP_DIR="$(xdg-user-dir DESKTOP 2>/dev/null || echo "$HOME/Desktop")" # --- Tema local (no toca sistema) --- NAME="SolarHubInstaller" THEME_NAME="SolarHub" YAD_THEME="${THEME_NAME}:dark" ORANGE="#FF4E00" GREEN="#27D980" # ========== Helpers ========== have(){ command -v "$1" >/dev/null 2>&1; } # Iconos locales (sin instalar nada en el sistema/usuario) ensure_local_icons(){ local base="$INSTALLER_DIR/icons/hicolor/256x256/apps" local idx="$INSTALLER_DIR/icons/hicolor/index.theme" mkdir -p "$base" install -m 0644 "$ICON_OASIS" "$base/oasis-logo.png" install -m 0644 "$ICON_ECOIN" "$base/ecoin.png" cat > "$idx" <<'EOF' [Icon Theme] Name=Hicolor Comment=Local fallback for Solar Net Hub Directories=256x256/apps [256x256/apps] Size=256 Context=Applications Type=Fixed EOF # Hacer visible este tema SOLO para este proceso y descendientes export GTK_ICON_THEME_PATH="$INSTALLER_DIR/icons${GTK_ICON_THEME_PATH:+:$GTK_ICON_THEME_PATH}" } pkg_install(){ local pkgs=("$@") if have apt-get; then if have pkexec; then pkexec bash -lc "apt-get update && apt-get install -y ${pkgs[*]}" || sudo apt-get update && sudo apt-get install -y "${pkgs[@]}"; else sudo apt-get update && sudo apt-get install -y "${pkgs[@]}"; fi elif have pacman; then if have pkexec; then pkexec bash -lc "pacman -Sy --noconfirm ${pkgs[*]}" || sudo pacman -Sy --noconfirm "${pkgs[@]}"; else sudo pacman -Sy --noconfirm "${pkgs[@]}"; fi elif have dnf; then if have pkexec; then pkexec bash -lc "dnf install -y ${pkgs[*]}" || sudo dnf install -y "${pkgs[@]}"; else sudo dnf install -y "${pkgs[@]}"; fi elif have zypper; then if have pkexec; then pkexec bash -lc "zypper --non-interactive install ${pkgs[*]}" || sudo zypper --non-interactive install "${pkgs[@]}"; else sudo zypper --non-interactive install "${pkgs[@]}"; fi else echo "❌ Gestor de paquetes no soportado." >&2; exit 1 fi } ensure_basics(){ local miss=() have yad || miss+=("yad") if ! command -v pkexec >/dev/null 2>&1; then if have apt-get; then miss+=("policykit-1"); else miss+=("polkit"); fi fi 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") elif command -v rpm >/dev/null 2>&1; then rpm -q hicolor-icon-theme >/dev/null 2>&1 || miss+=("hicolor-icon-theme") fi if ((${#miss[@]})); then pkg_install "${miss[@]}" 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:"Cantarell","Ubuntu","DejaVu Sans",sans-serif;font-size:12pt} button{background:#FF4E00;color:#000;border:none;border-radius:16px;padding:12px 18px;font-weight:800} button:hover{background:#ff6a26} button:active{background:#e24a00} CSS fi } yad_cmd(){ GTK_THEME="$YAD_THEME" NO_AT_BRIDGE=1 yad --name="$NAME" --class="$NAME" "$@"; } progress_user(){ # $1 título, $2 comando (string) bash -lc "$2" 2>&1 | yad_cmd --progress --title="$1" --pulsate --auto-close --no-buttons \ --width=800 --height=260 --center } progress_root(){ # $1 título, $2 comando (string, root) pkexec bash -lc "$2" 2>&1 | yad_cmd --progress --title="$1" --pulsate --auto-close --no-buttons \ --width=800 --height=260 --center } ensure_launcher(){ mkdir -p "$APPS_DIR" "$DESKTOP_DIR" local ABS_INSTALLER="$SCRIPT_DIR/installer.sh" local ABS_ICON="$ICON_OASIS"; [ -f "$ABS_ICON" ] || ABS_ICON="$HERO_IMAGE" cat > "$APPS_DIR/INSTALLER.desktop" </dev/null || true chmod 644 "$APPS_DIR/INSTALLER.desktop" 2>/dev/null || true chmod +x "$DESKTOP_DIR/INSTALLER.desktop" 2>/dev/null || true command -v update-desktop-database >/dev/null 2>&1 && \ update-desktop-database "$HOME/.local/share/applications" >/dev/null 2>&1 || true } ensure_user_fonts(){ local FONTS_SRC_DIR="$INSTALLER_DIR" local FONTS_DST_DIR="$HOME/.local/share/fonts" local copied=0 mkdir -p "$FONTS_DST_DIR" # Copia Dune Rise (OTF/TTF) si existe en INSTALLER for f in "$FONTS_SRC_DIR"/Dune_Rise.otf "$FONTS_SRC_DIR"/Dune_Rise.ttf; do if [ -f "$f" ]; then cp -f "$f" "$FONTS_DST_DIR/" && copied=1 fi done # Refresca caché si hemos copiado algo if [ "$copied" = 1 ]; then fc-cache -f >/dev/null 2>&1 || true fi } # ========== Estado ========== OASIS_DIR_DEFAULT="${HOME}/oasis" OASIS_REPO_DEFAULT="https://code.03c8.net/KrakensLab/oasis.git" OASIS_MODEL_FILE="oasis-42-1-chat.Q4_K_M.gguf" OASIS_MODEL_TAR="${OASIS_MODEL_FILE}.tar.gz" OASIS_MODEL_URL="https://solarnethub.com/code/models/${OASIS_MODEL_TAR}" oasis_installed(){ local d="${1:-$OASIS_DIR_DEFAULT}"; [[ -d "$d/src/server/node_modules" && -f "$d/AI/$OASIS_MODEL_FILE" ]]; } ECOIN_DIR_DEFAULT="${HOME}/ecoin" ECOIN_REPO_DEFAULT="https://github.com/epsylon/ecoin" ecoin_installed(){ local d="${1:-$ECOIN_DIR_DEFAULT}"; [[ -x "$d/ecoin/ecoin-qt" || -x "$d/ecoin/src/ecoind" ]]; } ecoin_wallet_exists(){ [ -f "$HOME/.ecoin/wallet.dat" ]; } # ========== OASIS ========== node_setup_cmd(){ cat < "$CONF" </dev/null || true ensure_local_icons ensure_theme ensure_launcher case "${1:-}" in --oasis-install) oasis_quick_install 22 "$OASIS_REPO_DEFAULT" "$OASIS_DIR_DEFAULT" ;; --oasis-start) oasis_quick_start "$OASIS_DIR_DEFAULT" ;; --ecoin-install) ecoin_quick_install "$ECOIN_REPO_DEFAULT" "$ECOIN_DIR_DEFAULT" ;; --wallet-create) progress_user "ECOIN: Crear cartera" "$(ecoin_create_wallet_cmd)" ;; --wallet-connect)progress_user "ECOIN: Conectar cartera" "$(ecoin_connect_wallet_cmd)" ;; --ecoin-gui) progress_user "ECOIN: Wallet (Qt)" "$(ecoin_qt_cmd "$ECOIN_DIR_DEFAULT")" ;; *) home_single_dialog ;; esac