319 lines
12 KiB
Bash
Executable File
319 lines
12 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"
|
|
}
|
|
|
|
# El entorno de compilación requiere Node 20; el DEB incluye su propio runtime.
|
|
if ! node -e 'process.exit(Number(process.versions.node.split(".")[0]) >= 20 ? 0 : 1)'; then
|
|
log_error "Se requiere Node.js >= 20 para construir el paquete web."
|
|
exit 1
|
|
fi
|
|
|
|
# =======================
|
|
# 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" "$TMP_DIR"
|
|
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"
|
|
# El lockfile no está versionado: sincronizarlo con package.json antes de npm ci.
|
|
npm install --package-lock-only --ignore-scripts --no-audit --silent 2>>"$LOG_FILE" 1>/dev/null
|
|
npm ci --omit=dev --no-audit --silent 2>>"$LOG_FILE" 1>/dev/null
|
|
# npm instala el binario de Node para la arquitectura de compilación dentro del paquete.
|
|
BUNDLED_NODE="$PWD/node_modules/node/bin/node"
|
|
if [ ! -x "$BUNDLED_NODE" ] || ! "$BUNDLED_NODE" -e '
|
|
const expected = require("./package.json").dependencies.node;
|
|
process.exit(process.versions.node === expected && process.platform === "linux" && process.arch === "x64" ? 0 : 1);
|
|
'; then
|
|
log_error "Falta el runtime Node incluido o no corresponde a la versión/arquitectura del DEB."
|
|
exit 1
|
|
fi
|
|
# Compilar/cargar las dependencias nativas con el mismo Node que usará el servicio.
|
|
PATH="$(dirname "$BUNDLED_NODE"):$PATH" npm rebuild node-hid --no-audit >>"$NODE_HID_LOG" 2>&1
|
|
"$BUNDLED_NODE" -e 'require("node-hid")'
|
|
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" "$DEB_DIR/DEBIAN/prerm"
|
|
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."
|
|
# Restaurar las plantillas incluso si falla la construcción del paquete GUI.
|
|
SERVICE_BACKUP=$(mktemp -d "$(pwd)/$TMP_DIR/service.XXXXXX")
|
|
SERVICE_ETC="$(pwd)/$DEB_DIR/etc"
|
|
restore_service() {
|
|
if [ -f "$SERVICE_BACKUP/emalibre" ]; then
|
|
sudo mv "$SERVICE_BACKUP/emalibre" "$SERVICE_ETC/init.d/emalibre" || return
|
|
fi
|
|
if [ -f "$SERVICE_BACKUP/emalibre_modo" ]; then
|
|
sudo mv "$SERVICE_BACKUP/emalibre_modo" "$SERVICE_ETC/emalibre_modo" || return
|
|
fi
|
|
rmdir "$SERVICE_BACKUP"
|
|
}
|
|
trap restore_service EXIT
|
|
sudo mv "$SERVICE_ETC/init.d/emalibre" "$SERVICE_BACKUP/emalibre"
|
|
sudo mv "$SERVICE_ETC/emalibre_modo" "$SERVICE_BACKUP/emalibre_modo"
|
|
sudo rm -rf "$DEB_DIR/usr/share/emalibre/package.nw/node_modules/.bin/node" \
|
|
"$DEB_DIR/usr/share/emalibre/package.nw/node_modules/node-bin-setup" \
|
|
"$DEB_DIR/usr/share/emalibre/package.nw/node_modules/node" \
|
|
"$DEB_DIR/usr/share/emalibre/package.nw/node_modules/express" \
|
|
"$DEB_DIR/usr/share/emalibre/package.nw/node_modules/forever" \
|
|
"$DEB_DIR/usr/share/emalibre/package.nw/node_modules/forever-agent" \
|
|
"$DEB_DIR/usr/share/emalibre/package.nw/node_modules/forever-monitor" \
|
|
"$DEB_DIR/usr/share/emalibre/package.nw/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"
|
|
restore_service
|
|
trap - EXIT
|
|
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" "$DEB_DIR/DEBIAN/prerm"
|
|
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 |