#!/usr/bin/env bash set -euo pipefail # ========================= # SOLAR NET HUB - Installer # ========================= # --- Rutas --- SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &> /dev/null && pwd)" INSTALLER_DIR="$SCRIPT_DIR" CSS_SOURCE="$INSTALLER_DIR/gtk.css" # (lo añadimos luego) ICON_OASIS="$INSTALLER_DIR/oasis-logo.webp" ICON_ECOIN="$INSTALLER_DIR/ecoin.png" APPS_DIR="$HOME/.local/share/applications" DESKTOP_DIR="$(xdg-user-dir DESKTOP 2>/dev/null || echo "$HOME/Desktop")" # --- Theming local (no toca el sistema) --- NAME="SolarHubInstaller" # --name/--class (CSS scope) THEME_NAME="SolarHub" # ~/.themes/SolarHub/gtk-3.0/gtk.css YAD_THEME="${THEME_NAME}:dark" ORANGE="#FF4E00" GREEN="#27D980" GREY="#b9b9b9" # --- Helpers básicos --- have(){ command -v "$1" >/dev/null 2>&1; } pkg_install(){ local pkgs=("$@") if have apt-get; then pkexec bash -lc "apt-get update && apt-get install -y ${pkgs[*]}" elif have pacman; then pkexec bash -lc "pacman -Sy --noconfirm ${pkgs[*]}" elif have dnf; then pkexec bash -lc "dnf install -y ${pkgs[*]}" elif have zypper; then pkexec bash -lc "zypper --non-interactive install ${pkgs[*]}" else echo "❌ Gestor de paquetes no soportado. Instala manualmente: yad, policykit-1, hicolor-icon-theme, xdg-user-dirs" >&2 exit 1 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 # CSS mínimo por si aún no creaste gtk.css 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" yad --name="$NAME" --class="$NAME" "$@"; } progress_user(){ # $1=title $2=cmd (como string) bash -lc "$2" 2>&1 | yad_cmd --progress --title="$1" --pulsate --auto-close --no-buttons \ --width=940 --height=260 --center } progress_root(){ # $1=title $2=cmd (string) -> pkexec pkexec bash -lc "$2" 2>&1 | yad_cmd --progress --title="$1" --pulsate --auto-close --no-buttons \ --width=940 --height=260 --center } ensure_launcher(){ mkdir -p "$APPS_DIR" "$DESKTOP_DIR" cat > "$APPS_DIR/INSTALLER.desktop" </dev/null || true chmod +x "$DESKTOP_DIR/INSTALLER.desktop" 2>/dev/null || true } # ========= Detección de 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" ]; } # ========= Comandos OASIS ========= node_setup_cmd(){ # $1=major (22/18) cat < "$CONF" </dev/null 2>&1; then KEY="$(shuf -i 1-2000000000 -n 1)" else KEY=$(( (RANDOM<<15) | RANDOM )); KEY=$((KEY%2000000000+1)) fi # --- MITAD IZQUIERDA: OASIS --- local O_TEXT O_BTN if oasis_installed; then O_TEXT="OASIS\nInstalado" O_BTN="bash -lc '$0 --oasis-start'!$ICON_OASIS!Abrir OASIS" else O_TEXT="OASIS\nNo instalado" O_BTN="bash -lc '$0 --oasis-install'!$ICON_OASIS!Instalar OASIS" fi yad_cmd --plug="$KEY" --form --borders=28 --columns=1 \ ${ICON_OASIS:+--image="$ICON_OASIS"} --image-on-top \ --text="$O_TEXT" \ --field=":BTN" "$O_BTN" \ --no-buttons --buttons-layout=center & PID_L=$! # --- MITAD DERECHA: ECOIN --- local E_TEXT E_BTN1 E_BTN2 if ! ecoin_installed; then E_TEXT="ECOIN\nNo instalado" E_BTN1="bash -lc '$0 --ecoin-install'!$ICON_ECOIN!Instalar ECOIN" E_BTN2="" else if ecoin_wallet_exists; then E_TEXT="ECOIN\nCartera detectada" E_BTN1="bash -lc '$0 --wallet-connect'!$ICON_ECOIN!Conectar cartera" E_BTN2="bash -lc '$0 --ecoin-gui'!$ICON_ECOIN!Abrir ECOIN GUI" else E_TEXT="ECOIN\nSin cartera" E_BTN1="bash -lc '$0 --wallet-create'!$ICON_ECOIN!Crear cartera" E_BTN2="" fi fi if [ -n "$E_BTN2" ]; then yad_cmd --plug="$KEY" --form --borders=28 --columns=1 \ ${ICON_ECOIN:+--image="$ICON_ECOIN"} --image-on-top \ --text="$E_TEXT" \ --field=":BTN" "$E_BTN1" \ --field=":BTN" "$E_BTN2" \ --no-buttons --buttons-layout=center & else yad_cmd --plug="$KEY" --form --borders=28 --columns=1 \ ${ICON_ECOIN:+--image="$ICON_ECOIN"} --image-on-top \ --text="$E_TEXT" \ --field=":BTN" "$E_BTN1" \ --no-buttons --buttons-layout=center & fi PID_R=$! sleep 0.35 yad_cmd --paned --key="$KEY" \ --title="SOLAR NET HUB" --width=1180 --height=740 --center \ --button="Cerrar:0" kill "$PID_L" "$PID_R" 2>/dev/null || true } # ========= Entrypoint ========= ensure_basics 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 ;; esac ensure_basics(){ local miss=() command -v yad >/dev/null 2>&1 || miss+=("yad") command -v pkexec >/dev/null 2>&1 || miss+=("policykit-1") command -v xdg-user-dirs-update >/dev/null 2>&1 || 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 ((${#miss[@]})) && pkg_install "${miss[@]}" }