Carpincho/generarDeb64.sh
2026-09-29 22:58:33 -03:00

284 lines
10 KiB
Bash
Executable File

#!/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/"
# Las plantillas también se usan para web, cuya raíz no contiene package.nw.
sudo sed -i 's|^Icon=.*|Icon=/usr/share/emalibre/package.nw/gui_common/iconos/icono_app.png|; s|^Actions=.*|Actions=RootWindow;Window;|' "$DEB_DIR/usr/share/applications/emalibre.desktop"
sudo sed -i 's|^icon=.*|icon="/usr/share/emalibre/package.nw/gui_common/iconos/icono_app.png"|' "$DEB_DIR/usr/share/menu/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."
sudo ln -sf ../share/emalibre/emalibre "$DEB_DIR/usr/bin/emalibre"
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 "$DEB_DIR" "$DEBS_OUT/emalibre-gui-linux_$VERSION.deb"
sudo mv "$TMP_DIR/init.d" "$DEB_DIR/etc" 2>/dev/null || true
sudo 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"
sudo sed -i 's|/emalibre/package.nw/gui_common/|/emalibre/gui_common/|' "$DEB_DIR/usr/share/applications/emalibre.desktop" "$DEB_DIR/usr/share/menu/emalibre"
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