#!/bin/bash set -e # Pide la contraseña de sudo al principio (si no tiene permisos) if ! sudo -v; then echo "Este script requiere permisos de sudo para algunas operaciones." exit 1 fi # Refresca el tiempo de sudo mientras el script corre while true; do sudo -n true; sleep 60; kill -0 "$$" || exit; done 2>/dev/null & # ======================= # VARIABLES Y FUNCIONES # ======================= BUILD_DIR="build" DEB_DIR="$BUILD_DIR/Deb64" DEBS_OUT="$BUILD_DIR/debs" TMP_DIR="$BUILD_DIR/tmp" EMALIBRE_DIR="$BUILD_DIR/emalibre" EMALIBRE_NOGUI="$TMP_DIR/emalibre_nogui" CONTROL_DEB="$BUILD_DIR/controlDeb" LOG_FILE="/tmp/ema.log" NODE_HID_LOG="/tmp/ema-node-hid.log" function log_info() { printf "\033[1;10m$1\033[0m"; } function log_ok() { printf "\033[1;32m$1\033[0m\n"; } function log_warn() { printf "\033[1;33m$1\033[0m\n"; } function log_error() { printf "\033[1;31m$1\033[0m\n"; } function log_final() { printf "\033[5;10m$1\033[0m\n"; } function spinner() { local info="$1" local pid=$! local delay=0.25 local spinstr='|/-\' while kill -0 $pid 2> /dev/null; do local temp=${spinstr#?} printf " [%c] $info" "$spinstr" local spinstr=$temp${spinstr%"$temp"} sleep $delay local reset="\b\b\b\b\b" for ((i=1; i<=$(echo $info | wc -c); i++)); do reset+="\b" done printf $reset done printf " \b\b\b\b" } # ======================= # VERSIONES # ======================= VERSION=$(grep Version src/conf/ConfiguracionGlobal.js | sed -e "s/'Version': //g" | sed -e "s/,//g" | sed -e "s/^[ \t]*//") NWJS_VERSION=$(node src/tools/nw.cjs version) # ======================= # INICIO # ======================= echo "" echo "*************************************************" echo "* Comprobando y preparando el entorno ***" echo "*************************************************" echo "" log_info "--->Versión de EmaLibre: $VERSION \n" log_info "----- >Versión de NW.Js: $NWJS_VERSION \n" echo "" # ======================= # LIMPIEZA Y PREPARACIÓN # ======================= log_info "1) Limpiando compilación anterior." mkdir -p "$DEB_DIR/usr/bin" "$DEB_DIR/usr/share/emalibre" "$DEBS_OUT" sudo rm -rf "$EMALIBRE_DIR"/* "$TMP_DIR/emalibre_nogui" "$DEB_DIR/usr/bin/"* "$DEB_DIR/usr/share/emalibre/"* log_ok " --> OK." # ======================= # DEPENDENCIAS DEL SISTEMA # ======================= log_info "2) Instalando/comprobando paquetes con APT necesarios." sudo apt-get -y -qq install build-essential git wget libusb-1.0-0 libusb-1.0-0-dev libudev-dev lld binutils sudo chmod -R 755 "$DEB_DIR" log_ok " --> OK." # ======================= # DEPENDENCIAS NODE/NPM # ======================= log_info "3) Verificando node y dependencias:\n" if ! command -v node >/dev/null 2>&1; then log_error " --> Node.js no está instalado. Instálelo manualmente." exit 1 else log_ok " 3.1) Node.js OK." fi if ! command -v npm >/dev/null 2>&1; then log_error " --> npm no está instalado. Instálelo manualmente." exit 1 else log_ok " 3.2) npm OK." fi if ! npm list --depth=0 | grep -q nw-builder@; then log_warn " 3.4) nw-builder no encontrado localmente. Instalando..." npm install --no-audit --silent 2>>"$LOG_FILE" 1>/dev/null log_ok " --> nw-builder instalado." else log_ok " 3.3) nw-builder OK." fi # ======================= # EMPAQUETADO # ======================= log_info "4) Empaquetando el proyecto emalibre." if node empaquetarLinux.js | grep -q "Correcto!"; then log_ok " --> OK. " else log_error " --> ERROR. Problema empaquetando con nw-builder." exit 1 fi # ======================= # PERMISOS Y NODE_MODULES # ======================= log_info "5) Aplicando Permisos al proyecto." sudo chmod -R 755 "$EMALIBRE_DIR/package.nw" log_ok " --> OK." log_info "6) Eliminando node_modules del proyecto." rm -rf "$EMALIBRE_DIR/package.nw/node_modules" log_ok " --> OK." log_info "7) Generando node_modules con NPM del proyecto." cd "$EMALIBRE_DIR/package.nw" npm ci --only=production --no-audit --silent 2>>"$LOG_FILE" 1>/dev/null log_ok " --> OK." # ======================= # LIMPIEZA DE LOGS Y CONFIG # ======================= log_info "8) Se purgan los tanques y logs." : > logs/debug.log echo "[]" > logs/TanquePendientes.log echo "[]" > logs/registro_diario.log log_ok " --> OK." log_info "9) Se blanquea el archivo de Configuracion General." cp ../../conf/ConfiguracionGeneral.js conf/ConfiguracionGeneral.js log_ok " --> OK." cd ../../.. log_info "9.1) Se copia emalibre antes de implementar el módulo node-hid con NWJS." cp -R "$EMALIBRE_DIR" "$TMP_DIR/emalibre_nogui" chmod -R 755 "$TMP_DIR/emalibre_nogui" cd "$EMALIBRE_DIR/package.nw" log_ok " --> OK." log_info "10) Corriendo el post-script para el rebuild del módulo node-hid en i64." npm run postLINUX --no-audit --silent >"$NODE_HID_LOG" 2>&1 & REBUILD_PID=$! spinner "Procesando..." if wait "$REBUILD_PID"; then log_ok " --> OK. " else REBUILD_STATUS=$? log_error " --> ERROR. Falló el rebuild de node-hid (código $REBUILD_STATUS). Detalle:" tail -n 80 "$NODE_HID_LOG" exit "$REBUILD_STATUS" fi cd ../../.. # ======================= # BUILD GUI DESKTOP # ======================= echo "" echo "*************************************************" echo "* Build EMA Libre Cliente Gráfico - GNU/Linux *" echo "*************************************************" echo "" log_info "1) Limpiando archivos temporales." sudo rm -f "$DEB_DIR/DEBIAN/control" sudo rm -rf "$DEB_DIR/usr/bin/"* "$DEB_DIR/usr/share/emalibre/"* log_ok " --> OK." log_info "2) Copiando los fuentes de EMA Libre para 64 bits." sudo cp -R "$EMALIBRE_DIR/"* "$DEB_DIR/usr/share/emalibre/" log_ok " --> OK." log_info "3) Reemplazando el archivo de control DEB." sudo cp -f "$CONTROL_DEB/control_linux_gui" "$DEB_DIR/DEBIAN/control" log_ok " --> OK." log_info "4) Aplicando permisos necesarios." sudo chmod +x "$DEB_DIR/usr/share/emalibre/emalibre" sudo chmod 0755 "$DEB_DIR/DEBIAN" "$DEB_DIR/DEBIAN/postrm" "$DEB_DIR/DEBIAN/postinst" "$DEB_DIR/DEBIAN/preinst" sudo chown -R root:root "$DEB_DIR" log_ok " --> OK." log_info "5) Generando enlaces simbólicos del binario." cd "$DEB_DIR/usr/bin/" sudo ln -sf ../share/emalibre/emalibre emalibre cd ../../.. log_ok " --> OK." log_info "6) Eliminando node/web/express/forever/servicio para modo GUI y la interfaz para el modo web." sudo mv "$DEB_DIR/etc/init.d" "$TMP_DIR" 2>/dev/null || true sudo mv "$DEB_DIR/etc/emalibre_modo" "$TMP_DIR" 2>/dev/null || true sudo rm -rf "$DEB_DIR/usr/share/emalibre/node_modules/node" \ "$DEB_DIR/usr/share/emalibre/node_modules/express" \ "$DEB_DIR/usr/share/emalibre/node_modules/forever" \ "$DEB_DIR/usr/share/emalibre/node_modules/forever-agent" \ "$DEB_DIR/usr/share/emalibre/node_modules/forever-monitor" \ "$DEB_DIR/usr/share/emalibre/gui_web" log_ok " --> OK." log_info "7) Generando Paquete DEB para GUI 64 bits Linux." #sudo dpkg -b Deb64 debs/"emalibre-gui-linux_$VERSION.deb" sudo dpkg-deb -Zxz -b Deb64 debs/"emalibre-gui-linux_$VERSION.deb" cd .. mv "$TMP_DIR/init.d" "$DEB_DIR/etc" 2>/dev/null || true mv "$TMP_DIR/emalibre_modo" "$DEB_DIR/etc/emalibre_modo" 2>/dev/null || true log_final " Finalizó con éxito, build/debs/emalibre-gui-linux_$VERSION.deb." log_ok " --> OK." log_info "8) Limpiando archivos temporales." sudo rm -f "$DEB_DIR/DEBIAN/control" sudo rm -rf "$DEB_DIR/usr/bin/"* "$DEB_DIR/usr/share/emalibre/"* log_ok " --> OK." # ======================= # BUILD CONSOLA/WEB # ======================= echo "" echo "*************************************************" echo "* Build EMA Libre Cliente Web - GNU/Linux *" echo "*************************************************" echo "" log_info "1) Limpiando archivos temporales." rm -f "$DEB_DIR/DEBIAN/control" rm -rf "$DEB_DIR/usr/bin/"* "$DEB_DIR/usr/share/emalibre/"* log_ok " --> OK." log_info "2) Copiando los fuentes de EMA Libre para 64bit." sudo cp -R "$TMP_DIR/emalibre_nogui/package.nw/core" "$DEB_DIR/usr/share/emalibre/" sudo cp -R "$TMP_DIR/emalibre_nogui/package.nw/logs" "$DEB_DIR/usr/share/emalibre/" sudo cp -R "$TMP_DIR/emalibre_nogui/package.nw/conf" "$DEB_DIR/usr/share/emalibre/" sudo cp -R "$TMP_DIR/emalibre_nogui/package.nw/gui_web" "$DEB_DIR/usr/share/emalibre/" sudo cp -R "$TMP_DIR/emalibre_nogui/package.nw/gui_common" "$DEB_DIR/usr/share/emalibre/" sudo cp -R "$TMP_DIR/emalibre_nogui/package.nw/node_modules" "$DEB_DIR/usr/share/emalibre/" sudo cp -R "$TMP_DIR/emalibre_nogui/package.nw/CHANGELOG" "$DEB_DIR/usr/share/emalibre/" sudo cp -R "$TMP_DIR/emalibre_nogui/package.nw/COPYING" "$DEB_DIR/usr/share/emalibre/" sudo cp -R "$TMP_DIR/emalibre_nogui/package.nw/AUTHORS" "$DEB_DIR/usr/share/emalibre/" sudo cp -R "$TMP_DIR/emalibre_nogui/package.nw/package.json" "$DEB_DIR/usr/share/emalibre/" log_ok " --> OK." log_info "3) Remplazando el archivo de control DEB." sudo cp -f "$CONTROL_DEB/control_linux_web" "$DEB_DIR/DEBIAN/control" log_ok " --> OK." log_info "4) Aplicando permisos necesarios." sudo chmod 0755 "$DEB_DIR/DEBIAN" "$DEB_DIR/DEBIAN/postrm" "$DEB_DIR/DEBIAN/postinst" "$DEB_DIR/DEBIAN/preinst" sudo chown -R root:root "$DEB_DIR" log_ok " --> OK." cd "$BUILD_DIR" log_info "7) Generando Paquete DEB para Web 64bit Linux." #sudo dpkg -b Deb64 debs/"emalibre-web-linux_$VERSION.deb" sudo dpkg-deb -Zxz -b Deb64 debs/"emalibre-web-linux_$VERSION.deb" cd .. log_final " Finalizó con éxito, build/debs/emalibre-web-linux_$VERSION.deb." log_ok " --> OK." log_info "8) Limpiando archivos temporales." sudo rm -f "$DEB_DIR/DEBIAN/control" sudo rm -rf "$DEB_DIR/usr/bin/"* "$DEB_DIR/usr/share/emalibre/"* sudo rm -rf "$EMALIBRE_DIR" log_ok " --> OK." echo "" exit 0