-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path1_install_ch9_local.sh
More file actions
executable file
·493 lines (389 loc) · 18.8 KB
/
1_install_ch9_local.sh
File metadata and controls
executable file
·493 lines (389 loc) · 18.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
#!/bin/bash
# ==============================================================================
# SCRIPT: install_ch9_local.sh
# Versión: 2.5 - Instalación CORE de Channel-9 (Lighttpd/BIND9 condicional)
# Descripción: Construye e instala paquetes DEB. Instala Lighttpd y BIND9/Correo
# solo si no se detecta ISPConfig.
# ==============================================================================
# ==============================================================================
# FUNCIÓN DE DETECCIÓN E INSTALACIÓN: GESTOR GRÁFICO DE USUARIOS
# ==============================================================================
install_user_manager_if_rpi() {
echo "--- Comprobando si el sistema es ARM (Raspberry Pi OS) para gestor de usuarios ---"
# Obtener la arquitectura de la máquina
local ARCHITECTURE=$(dpkg --print-architecture)
# Comprobar si es alguna variante ARM (Raspberry Pi OS usa armhf o arm64)
if [[ "$ARCHITECTURE" == "armhf" || "$ARCHITECTURE" == "arm64" ]]; then
echo "INFO: Arquitectura detectada: $ARCHITECTURE. Asumiendo entorno Raspberry Pi/ARM."
# El gestor de usuarios gráfico más robusto es parte de gnome-system-tools
if ! dpkg -l | grep -q "gnome-system-tools"; then
echo "🚀 Instalando gnome-system-tools (Gestor de Usuarios Gráfico)..."
# Asumimos que 'apt update' ya se ha ejecutado en los pasos iniciales.
sudo apt install gnome-system-tools -y
if [ $? -eq 0 ]; then
echo "✅ gnome-system-tools instalado correctamente."
else
echo "🚨 Advertencia: Error al instalar gnome-system-tools. Puede ser necesario instalarlo manualmente."
fi
else
echo "INFO: gnome-system-tools ya está instalado. Omitiendo."
fi
else
echo "INFO: Arquitectura detectada: $ARCHITECTURE. No es un entorno ARM típico de Raspberry Pi OS. Omitiendo."
fi
}
# ==============================================================================
# --- 9.1. controlamos si las interfaces de red usan nombres tradicionales (canonical) o no y los forzamos ---
echo "--- 9.1 comprobamos los nombres de las interfaces de red ---"
if [ -f "force_canonical_netnames.sh" ]; then
./force_canonical_netnames.sh || { echo "🚨 Error al comprobar los nombres de las interfaces."; }
else
echo "🚨 Error: force_canonical_netnames.sh no encontrado."
fi
# --- Variables de Configuración ---
REPO_ROOT="${HOME}/public_html/ch9/debian"
ARCH=$(dpkg --print-architecture)
DEB_POOL="${REPO_ROOT}/pool/${ARCH}"
DEB_POOL_ALL="${REPO_ROOT}/pool/all"
# Lista de paquetes base a verificar y sus respectivos scripts de construcción
# Formato: "nombre_paquete:script_builder_base:script_builder_adicionales"
PACKAGES_TO_CHECK=(
"libretranslate-base:build_libretranslate_deb.sh:build_libretranslate_models_deb.sh build_libretranslate_service_deb.sh"
"whisper-cpp-cli:build_whisper_deb.sh:"
"piper-tts:build_piper_deb.sh:build_piper_models_deb.sh"
)
# Lista de paquetes que se instalarán al final (solo los paquetes base y el servicio LT)
CORE_PACKAGES="libretranslate-base libretranslate-service whisper-cpp-cli piper-tts"
# --- Funciones de Utilidad ---
# Función para verificar si un paquete base está instalado
is_installed() {
dpkg -s "$1" &>/dev/null
}
# Función para verificar si un paquete .deb existe en el repositorio local (pool)
deb_exists() {
if find "$DEB_POOL" -maxdepth 1 -name "$1_*.deb" -print -quit 2>/dev/null | grep -q .; then
return 0
fi
if find "$DEB_POOL_ALL" -maxdepth 1 -name "$1_*.deb" -print -quit 2>/dev/null | grep -q .; then
return 0
fi
return 1
}
# --- 1. Control de Dependencias Generales y Preparación ---
echo "--- 1. Instalando dependencias básicas y FPM ---"
# eliminamos el repositorio local porqué va a ser regenerado y añadido después:
sudo rm /etc/apt/sources.list.d/channel9.list
# Instalación de todas las dependencias. AÑADIDO 'lighttpd' de nuevo.
sudo apt update
sudo apt install -y sox ffmpeg zenity mailutils multimon-ng net-tools git cmake build-essential ruby ruby-dev python3 python3-venv wget yad mutt msmtp lighttpd
command -v dpkg-scanpackages >/dev/null 2>&1 || {
echo "⚙️ Instalando dpkg-dev (necesario para la gestión de repositorios)..."
sudo apt install dpkg-dev -y
}
# Instalación de FPM
command -v fpm >/dev/null 2>&1 || {
echo "⚙️ Instalando fpm (Fast Package Manager)..."
sudo gem install fpm
}
# --- 1.1. Configuración del Servidor Web (Lighttpd/Userdir y Dirlisting) ---
echo "--- 1.1. Configuración de Infraestructura Web (Lighttpd/Userdir) ---"
# CRÍTICO: Comprobación de existencia de ISPConfig
if [ -d "/usr/local/ispconfig" ]; then
echo "⚠️ Omisión: Detectado ISPConfig. Lighttpd no se configura para evitar conflictos."
else
echo "🚀 Configurando Lighttpd para servir el repositorio local..."
# 1. Habilitar mod_userdir (para ~user/public_html)
sudo lighty-enable-mod userdir 2>/dev/null
# 2. Habilitar mod_dirlisting para que se vean los paquetes .deb
sudo lighty-enable-mod dirlisting 2>/dev/null
# 3. Crear el directorio public_html si no existe
mkdir -p "$HOME/public_html"
# 4. Ajustar permisos
chmod 755 "$HOME/public_html"
# 5. Reiniciar Lighttpd para aplicar cambios
sudo systemctl restart lighttpd || { echo "🚨 Error al reiniciar Lighttpd. Continuación no garantizada."; }
echo "INFO: Lighttpd configurado con Userdir y Dirlisting."
fi
# --- 2. Lógica de Construcción Condicional ---
NEEDS_BUILD_FLAG=false
BUILD_SCRIPTS=()
echo "--- 2. Verificación de Componentes Base (Piper, Whisper, LibreTranslate) ---"
# Asegurar la existencia de las carpetas pool antes de los builders
mkdir -p "$DEB_POOL" "$DEB_POOL_ALL"
for item in "${PACKAGES_TO_CHECK[@]}"; do
# Separar campos
IFS=':' read -r PACKAGE_NAME BUILD_SCRIPT BUILD_MODELS_SCRIPTS <<< "$item"
echo "-> Componente: ${PACKAGE_NAME}..."
if is_installed "$PACKAGE_NAME"; then
echo " [OK] Ya instalado. (Saltando construcción)"
elif deb_exists "$PACKAGE_NAME"; then
echo " [DEB OK] .deb encontrado en el repositorio. (Saltando construcción)"
else
echo " [FALTA] Ni instalado, ni .deb encontrado. Necesita construcción."
NEEDS_BUILD_FLAG=true
BUILD_SCRIPTS+=("./$BUILD_SCRIPT") # Añadir script base
# Añadir scripts de modelos/servicios asociados
for model_script in $BUILD_MODELS_SCRIPTS; do
BUILD_SCRIPTS+=("./$model_script")
done
fi
done
# --- 3. Ejecución de Builders si es necesario ---
if $NEEDS_BUILD_FLAG; then
echo "--- 3. Ejecutando scripts de construcción necesarios ---"
for SCRIPT in "${BUILD_SCRIPTS[@]}"; do
if [ -f "$SCRIPT" ]; then
echo "🚀 Ejecutando: $SCRIPT..."
"$SCRIPT" || { echo "🚨 Error crítico al construir ${SCRIPT}. Abortando instalación."; exit 1; }
else
echo "⚠️ Advertencia: Script de construcción $SCRIPT no encontrado. Saltando."
fi
done
else
echo "--- 3. No se requiere construcción. Continuar a la instalación. ---"
fi
# --- 4. Actualización del Repositorio Local y Configuración de APT ---
echo "--- 4. Actualizando el índice del repositorio local (generate_local_repo.sh) ---"
if [ -f "generate_local_repo.sh" ]; then
./generate_local_repo.sh
else
echo "🚨 Error: generate_local_repo.sh no encontrado. No se puede generar el índice."
exit 1
fi
echo "--- 5. Configurando APT para usar el repositorio local (Loopback) ---"
# Usamos el formato Userdir: http://127.0.0.1/~<usuario>/ (asumiendo que el Mirror lo sirve)
USER_NAME=$(whoami)
# CRÍTICO: Añadir [trusted=yes] para evitar el error de firma GPG en repositorios locales.
REPO_WEB_PATH="deb [trusted=yes] http://127.0.0.1/~${USER_NAME}/ch9/debian stable main"
# 1. Eliminar cualquier fuente anterior del proyecto Channel9
sudo rm -f /etc/apt/sources.list.d/channel9.list
# 2. Añadir la fuente del repositorio
echo "Añadiendo línea de repositorio: ${REPO_WEB_PATH}"
sudo sh -c "echo \"${REPO_WEB_PATH}\" > /etc/apt/sources.list.d/channel9.list"
# 3. Actualizar el índice de paquetes
sudo apt update || { echo "🚨 Error al actualizar APT. Compruebe que el proyecto Mirror esté sirviendo la carpeta $HOME/public_html."; exit 1; }
# --- 6. Instalación de Paquetes ---
echo "--- 6. Instalando paquetes base y modelos mediante APT ---"
# 6.1. Recopilar nombres de paquetes de modelos generados automáticamente
MODEL_PATTERNS="libretranslate-model-|piper-tts-model-"
MODEL_PACKAGES=$(
grep -h "Package: " ${REPO_ROOT}/dists/stable/main/binary-${ARCH}/Packages 2>/dev/null | \
awk '{print $2}' | \
grep -E "$MODEL_PATTERNS" | \
sort -u | tr '\n' ' '
)
if [ -n "$MODEL_PACKAGES" ]; then
echo "-> Paquetes de modelos a instalar (automático): ${MODEL_PACKAGES}"
fi
# Lista final de todos los paquetes a instalar
INSTALL_LIST="${CORE_PACKAGES} ${MODEL_PACKAGES}"
echo "🚀 Iniciando instalación de: ${INSTALL_LIST}"
sudo apt install -y ${INSTALL_LIST} || {
echo "🚨 Error al instalar paquetes APT. La instalación falló. Abortando."
exit 1
}
# --- 7. Generación de Páginas Web (Paso Mantenido, NO Condicional) ---
echo "--- 7. Generando las páginas Home y de Repositorio ---"
if [ -f "create_homepage.sh" ]; then
./create_homepage.sh
else
echo "⚠️ Advertencia: create_homepage.sh no encontrado. No se generará la página de inicio."
fi
# ------------------------------------------------------------------------------
# 7.1. Instalación de Herramientas Gráficas Adicionales (Raspberry Pi)
# ------------------------------------------------------------------------------
install_user_manager_if_rpi
# ------------------------------------------------------------------------------
# --- 8. Instalación Local de Scripts y Launchers ---
echo "--- 8. Instalación local de Channel-9 scripts y lanzadores ---"
BIN_DIR="$HOME/.local/bin"
ICONS_DIR="$HOME/.local/share/icons/hicolor/256x256"
APPLICATIONS_DIR="$HOME/.local/share/applications"
# Lista de scripts
SCRIPTS_TO_INSTALL=(
"CH9.sh"
"CH9-config.sh"
"CH9_loro.sh"
"CH9_monitor.sh"
"CH9_secretaria.sh"
"CH9_whisper.sh"
)
# Lista de iconos
ICONS_TO_INSTALL=(
"CH9.png"
"CH9-config.png"
)
# CREACIÓN DE DIRECTORIOS
mkdir -p "$BIN_DIR" "$ICONS_DIR" "$APPLICATIONS_DIR"
# INSTALACIÓN DE SCRIPTS
echo "Instalando scripts en $BIN_DIR..."
for script in "${SCRIPTS_TO_INSTALL[@]}"; do
if [ -f "$script" ]; then
cp "$script" "$BIN_DIR/"
chmod +x "$BIN_DIR/$script"
fi
done
# INSTALACIÓN DE ICONOS
echo "Instalando iconos en $ICONS_DIR..."
for icon in "${ICONS_TO_INSTALL[@]}"; do
if [ -f "$icon" ]; then
cp "$icon" "$ICONS_DIR/"
fi
done
# CREACIÓN DE LANZADORES DE ESCRITORIO (.desktop)
echo "Creando lanzadores de escritorio en $APPLICATIONS_DIR..."
# Lanzador Principal: Channel-9.desktop
cat <<EOF > "$APPLICATIONS_DIR/Channel-9.desktop"
[Desktop Entry]
Name=Channel 9
Comment=Sistema de automatización y monitoreo de emergencias de radio.
Exec=$HOME/.local/bin/CH9.sh
Icon=$HOME/.local/share/icons/hicolor/256x256/CH9.png
Terminal=true
Type=Application
Categories=Utility;Science;
StartupNotify=false
EOF
# Lanzador Configuración: Channel-9-Config.desktop
cat <<EOF > "$APPLICATIONS_DIR/Channel-9-Config.desktop"
[Desktop Entry]
Name=Configuración Channel 9
Comment=Configura los modos de operación, palabras clave y cuenta de correo.
Exec=$HOME/.local/bin/CH9-config.sh
Icon=$HOME/.local/share/icons/hicolor/256x256/CH9-config.png
Terminal=true
Type=Application
Categories=Settings;Utility;
StartupNotify=true
EOF
# INSTALACIÓN DE ICONOS
echo "Instalando iconos en $ICONS_DIR..."
# ------------------------------------------------------------------------------
# 8.1. Configuración Inicial del Archivo de Variables (.CH9-config)
# ------------------------------------------------------------------------------
echo "--- 8.1. Verificación de variables críticas en $HOME/.CH9-config ---"
CH9_CONFIG_FILE="$HOME/.CH9-config"
# CRÍTICO: Aseguramos la existencia del archivo de configuración
touch "$CH9_CONFIG_FILE"
# Añadir variables críticas si no existen, usando sed para asegurar que la variable no esté ya ahí
# ARCHIVE_EMAIL_TO: Correo donde se envían todos los mensajes no enrutados.
if ! grep -q "^ARCHIVE_EMAIL_TO=" "$CH9_CONFIG_FILE"; then
echo 'ARCHIVE_EMAIL_TO="archive@mi.atalaya"' >> "$CH9_CONFIG_FILE"
echo "INFO: Añadida variable ARCHIVE_EMAIL_TO."
fi
# DOMAIN_ATALAYA: Dominio local usado para construir las direcciones de correo de usuario (ej. marcos@mi.atalaya)
if ! grep -q "^DOMAIN_ATALAYA=" "$CH9_CONFIG_FILE"; then
echo 'DOMAIN_ATALAYA="mi.atalaya"' >> "$CH9_CONFIG_FILE"
echo "INFO: Añadida variable DOMAIN_ATALAYA."
fi
# Configuración básica de tiempo VOX
if ! grep -q "^MinMexDuration=" "$CH9_CONFIG_FILE"; then
echo 'MinMexDuration=2' >> "$CH9_CONFIG_FILE"
fi
if ! grep -q "^TIME=" "$CH9_CONFIG_FILE"; then
echo 'TIME=0.5' >> "$CH9_CONFIG_FILE"
fi
echo "INFO: Variables de configuración iniciales aseguradas."
# ------------------------------------------------------------------------------
# --- 9. Configuración de Infraestructura de Red (BIND9 y Correo) ---
echo "--- 9. Configurando Infraestructura de Red y Correo (ch9_infra_setup.sh) ---"
# CRÍTICO: Comprobación de existencia de ISPConfig
if [ -d "/usr/local/ispconfig" ]; then
echo "⚠️ Omisión: Detectado ISPConfig (/usr/local/ispconfig)."
echo " El paso 9 (configuración de BIND9/Correo) se omite para evitar conflictos."
else
# Si ISPConfig NO está instalado, ejecutamos la configuración de infraestructura.
if [ -f "ch9_infra_setup.sh" ]; then
echo "🚀 Ejecutando ch9_infra_setup.sh..."
./ch9_infra_setup.sh || { echo "🚨 Error al configurar la infraestructura de red/correo. Continuación no garantizada."; }
else
echo "🚨 Error: ch9_infra_setup.sh no encontrado. Se configurará SÓLO el DNS forwarder."
fi
# ----------------------------------------------------------------------
# 9.1. CRÍTICO: Configuración de DNS Forwarders en BIND9
# Esto asegura que BIND pueda resolver dominios de Internet.
# ----------------------------------------------------------------------
NAMED_OPTIONS="/etc/bind/named.conf.options"
if grep -q "forwarders {" "$NAMED_OPTIONS"; then
echo "INFO: La sección 'forwarders' ya existe en BIND9. Omitiendo configuración."
else
echo "🚀 Añadiendo sección 'forwarders' y 'forward only' a $NAMED_OPTIONS..."
# Insertar el bloque de forwarders y forward only
# Utilizamos 'sudo sed' para insertar justo antes de 'dnssec-validation auto;'
# Se añaden escapes (\\) para que la shell no interprete las llaves/punto y coma.
# El patrón de inserción es: buscar 'dnssec-validation auto;' e insertar las líneas antes.
INSERT_TEXT='
// CRÍTICO: Añadido por Channel-9 para resolver Internet
forwarders {
8.8.8.8;
1.1.1.1;
};
forward only;
'
# Usamos Perl para una inserción multilinea más robusta que sed.
sudo perl -i -pe '
BEGIN {$/ = undef}
s/(dnssec-validation auto;)/'"$INSERT_TEXT"'\n\1/s
' "$NAMED_OPTIONS" || { echo "🚨 Error crítico al configurar BIND9 forwarders."; }
echo "INFO: Configuración de forwarders completada. Recargando BIND9..."
sudo systemctl reload bind9 || echo "⚠️ Advertencia: No se pudo recargar BIND9. Compruebe errores."
fi
# ----------------------------------------------------------------------
fi
# ------------------------------------------------------------------------------
# --- 10. SERVICIO DE WHISPER (ASÍNCRONO) ---
echo "--- 10. Configurando y Lanzando Servicio Asíncrono de Whisper (systemd user) ---"
# 1. Crear el directorio de configuración de systemd para el usuario si no existe
SYSTEMD_USER_DIR="$HOME/.config/systemd/user"
mkdir -p "$SYSTEMD_USER_DIR"
WHISPER_SERVICE_FILE="$SYSTEMD_USER_DIR/ch9-whisper.service"
# 2. Escribir el archivo de la unidad de servicio
cat <<EOF > "$WHISPER_SERVICE_FILE"
[Unit]
Description=Channel 9 Whisper Transcriber Service
Documentation=https://ch9.mi.atalaya/docs
After=network-online.target graphical.target
[Service]
Type=simple
Restart=always
# Usamos %h como alias de $HOME para robustez en systemd
ExecStart=%h/.local/bin/CH9_whisper.sh
# Comando para detener el servicio de forma limpia
ExecStop=/usr/bin/kill -s SIGINT \$MAINPID
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=default.target
EOF
# 3. Recargar la configuración de systemd del usuario
echo "INFO: Recargando demonio systemd del usuario..."
systemctl --user daemon-reload || echo "⚠️ Advertencia: No se pudo recargar systemd daemon (puede que no haya iniciado la sesión gráfica/systemd user)."
# 4. Activar el servicio para que inicie automáticamente
echo "INFO: Activando servicio 'ch9-whisper.service' para el inicio de sesión..."
systemctl --user enable ch9-whisper.service || echo "⚠️ Advertencia: No se pudo habilitar el servicio."
# 5. Iniciar el servicio inmediatamente
echo "INFO: Iniciando servicio 'ch9-whisper.service'..."
systemctl --user start ch9-whisper.service || echo "🚨 Error: Fallo al iniciar el servicio 'ch9-whisper.service'. Compruebe el log con 'journalctl --user -u ch9-whisper.service'"
# --- 11. FINALIZACIÓN (Antiguo 10. FINALIZACIÓN) ---
echo "--- 11. Finalización ---"
echo "Actualizando la base de datos de lanzadores y la caché de iconos..."
update-desktop-database "$APPLICATIONS_DIR" 2>/dev/null
gtk-update-icon-cache -f "$HOME/.local/share/icons/hicolor" 2>/dev/null
# ------------------------------------------------------------------------------
# 12. REDIRECCIÓN DE RAÍZ A DIRECTORIO DE USUARIO (~usuario/)
# ------------------------------------------------------------------------------
echo "--- Configurando redirección de la raíz (/) a la carpeta del usuario (~$USER) ---"
# Usamos el usuario del script (asumiendo que es el usuario de Channel-9)
# Añadimos la directiva de redirección. La barra invertida escapa las comillas.
REDIRECT_LINE='url.redirect = ( "^/$" => "/~'${USER_NAME}'/" )'
if ! grep -q "^url.redirect" /etc/lighttpd/lighttpd.conf; then
echo "$REDIRECT_LINE" | sudo tee -a /etc/lighttpd/lighttpd.conf
echo "INFO: Redirección de Lighttpd configurada."
sudo systemctl restart lighttpd
else
echo "⚠️ Advertencia: La directiva url.redirect ya existe. No se modificó el archivo."
fi
echo "======================================================================="
echo "✅ INSTALACIÓN BASE COMPLETA DEL PROYECTO CHANNEL-9."
echo " El servicio de transcripción asíncrona (ch9-whisper.service) ha sido lanzado."
echo "======================================================================="