Add debug.log to the installer
oginstaller/pipeline/head There was a failure building this commit
Details
oginstaller/pipeline/head There was a failure building this commit
Details
parent
7afae7db6d
commit
324d47823a
|
@ -7,12 +7,28 @@ import time # Importar time para simular el progreso
|
||||||
import threading # Importar threading para leer el log en tiempo real
|
import threading # Importar threading para leer el log en tiempo real
|
||||||
import socket
|
import socket
|
||||||
import sys # Importar sys para leer los argumentos del script
|
import sys # Importar sys para leer los argumentos del script
|
||||||
|
import logging # Importar el módulo logging
|
||||||
|
|
||||||
CONFIGS_DIR = "/tmp/oginstall"
|
CONFIGS_DIR = "/tmp/oginstall"
|
||||||
os.makedirs(CONFIGS_DIR, exist_ok=True)
|
os.makedirs(CONFIGS_DIR, exist_ok=True)
|
||||||
|
|
||||||
REPO_URL = "https://ognproject.evlt.uma.es/gitea/opengnsys/ogcore.git"
|
REPO_URL = "https://ognproject.evlt.uma.es/gitea/opengnsys/ogcore.git"
|
||||||
|
|
||||||
|
# Configurar logging
|
||||||
|
try:
|
||||||
|
if not os.path.exists(CONFIGS_DIR):
|
||||||
|
os.makedirs(CONFIGS_DIR, exist_ok=True) # Crear el directorio si no existe
|
||||||
|
LOG_FILE = os.path.join(CONFIGS_DIR, "debug.log")
|
||||||
|
logging.basicConfig(
|
||||||
|
filename=LOG_FILE,
|
||||||
|
level=logging.DEBUG,
|
||||||
|
format="%(asctime)s - %(levelname)s - %(message)s",
|
||||||
|
)
|
||||||
|
logging.debug("Inicio del programa") # Mensaje inicial para verificar que el log se crea
|
||||||
|
except Exception as e:
|
||||||
|
print(f"[ERROR] No se pudo configurar el logging: {e}")
|
||||||
|
print(f"[ERROR] Verifica los permisos del directorio: {CONFIGS_DIR}")
|
||||||
|
exit(1) # Salir si no se puede configurar el logging
|
||||||
|
|
||||||
def get_network_interfaces():
|
def get_network_interfaces():
|
||||||
"""Obtiene los nombres de las interfaces de red disponibles en el servidor."""
|
"""Obtiene los nombres de las interfaces de red disponibles en el servidor."""
|
||||||
|
@ -30,20 +46,48 @@ def get_network_interfaces():
|
||||||
def get_available_versions():
|
def get_available_versions():
|
||||||
"""Obtiene la lista de versiones desde el archivo JSON remoto."""
|
"""Obtiene la lista de versiones desde el archivo JSON remoto."""
|
||||||
try:
|
try:
|
||||||
# Determinar la URL según el argumento recibido
|
# Validar si se pasa un argumento
|
||||||
if len(sys.argv) > 1 and sys.argv[1].lower() == "devel":
|
if len(sys.argv) > 1:
|
||||||
url = "https://ognproject.evlt.uma.es/debian-opengnsys/versions-dev.json"
|
arg = sys.argv[1].strip().lower()
|
||||||
elif len(sys.argv) > 1 and sys.argv[1].lower() == "nightly":
|
logging.debug(f"Argumento recibido: {arg}") # Usar logging en lugar de print
|
||||||
return None # No hay versiones disponibles para nightly
|
|
||||||
|
# Validar explícitamente los valores permitidos
|
||||||
|
if arg == "devel":
|
||||||
|
url = "https://ognproject.evlt.uma.es/debian-opengnsys/versions-dev.json"
|
||||||
|
elif arg == "nightly":
|
||||||
|
logging.debug("No hay versiones disponibles para nightly.")
|
||||||
|
raise ValueError("No hay versiones disponibles para nightly.")
|
||||||
|
else:
|
||||||
|
logging.debug(f"Argumento no reconocido: {arg}. Usando versiones de producción.")
|
||||||
|
url = "https://ognproject.evlt.uma.es/debian-opengnsys/versions-prod.json"
|
||||||
else:
|
else:
|
||||||
|
logging.debug("No se pasó ningún argumento. Usando versiones de producción.")
|
||||||
url = "https://ognproject.evlt.uma.es/debian-opengnsys/versions-prod.json"
|
url = "https://ognproject.evlt.uma.es/debian-opengnsys/versions-prod.json"
|
||||||
|
|
||||||
|
# Realizar la solicitud HTTP
|
||||||
|
logging.debug(f"Realizando solicitud HTTP a: {url}")
|
||||||
response = requests.get(url, timeout=10)
|
response = requests.get(url, timeout=10)
|
||||||
response.raise_for_status() # Lanza una excepción si la respuesta no es 200 OK
|
response.raise_for_status() # Lanza una excepción si la respuesta no es 200 OK
|
||||||
data = response.json()
|
|
||||||
return data.get("versions", [])
|
# Registrar el contenido de la respuesta para depuración
|
||||||
except requests.RequestException:
|
logging.debug(f"Contenido de la respuesta: {response.text}")
|
||||||
# Silenciar errores y devolver una lista vacía
|
|
||||||
return []
|
# Intentar analizar el JSON
|
||||||
|
try:
|
||||||
|
data = response.json()
|
||||||
|
except ValueError as e:
|
||||||
|
logging.error(f"Error al analizar el JSON: {e}")
|
||||||
|
raise RuntimeError(f"El contenido de la respuesta no es un JSON válido: {e}")
|
||||||
|
|
||||||
|
# Validar que el JSON contiene la clave "versions"
|
||||||
|
versions = data.get("versions", [])
|
||||||
|
if not versions:
|
||||||
|
raise ValueError("La lista de versiones está vacía o no existe la clave 'versions'.")
|
||||||
|
logging.debug(f"Versiones obtenidas: {versions}")
|
||||||
|
return versions
|
||||||
|
except (requests.RequestException, ValueError, RuntimeError) as e:
|
||||||
|
logging.error(f"No se pudo obtener la lista de versiones: {e}")
|
||||||
|
raise RuntimeError(f"Error crítico: {e}") # Lanzar una excepción crítica
|
||||||
|
|
||||||
def get_default_ip():
|
def get_default_ip():
|
||||||
"""Obtiene la IP asociada a la interfaz por defecto del servidor."""
|
"""Obtiene la IP asociada a la interfaz por defecto del servidor."""
|
||||||
|
@ -105,6 +149,23 @@ class ComponentSelectionForm(npyscreen.ActionForm):
|
||||||
values=self.versions, scroll_exit=True)
|
values=self.versions, scroll_exit=True)
|
||||||
self.tag.value = [0] # Marcar "latest" (o la primera opción) por defecto
|
self.tag.value = [0] # Marcar "latest" (o la primera opción) por defecto
|
||||||
|
|
||||||
|
# Agregar un cuadro de texto para mostrar el log
|
||||||
|
self.log_box = self.add(npyscreen.BoxTitle, name="Log de depuración", max_height=10, scroll_exit=True)
|
||||||
|
|
||||||
|
def update_log(self):
|
||||||
|
"""Actualiza el cuadro de texto con el contenido del archivo de log."""
|
||||||
|
try:
|
||||||
|
with open(LOG_FILE, "r") as log_file:
|
||||||
|
lines = log_file.readlines()
|
||||||
|
self.log_box.values = lines[-self.log_box.height:] # Mostrar solo las últimas líneas
|
||||||
|
self.log_box.display()
|
||||||
|
except Exception as e:
|
||||||
|
logging.error(f"Error al leer el archivo de log: {e}")
|
||||||
|
|
||||||
|
def while_waiting(self):
|
||||||
|
"""Actualizar el log mientras se espera interacción del usuario."""
|
||||||
|
self.update_log()
|
||||||
|
|
||||||
def on_ok(self):
|
def on_ok(self):
|
||||||
npyscreen.blank_terminal()
|
npyscreen.blank_terminal()
|
||||||
selected_components = [self.components.values[i].lower() for i in self.components.value] # Convertir a minúsculas
|
selected_components = [self.components.values[i].lower() for i in self.components.value] # Convertir a minúsculas
|
||||||
|
@ -369,7 +430,7 @@ def install_components_with_ui(form, components, selected_tag):
|
||||||
while True:
|
while True:
|
||||||
line = log_reader.readline()
|
line = log_reader.readline()
|
||||||
if line:
|
if line:
|
||||||
form.update_log(log_reader.readlines())
|
form.update_log([line]) # Actualizar el log línea por línea
|
||||||
time.sleep(0.1)
|
time.sleep(0.1)
|
||||||
|
|
||||||
log_thread = threading.Thread(target=tail_log, daemon=True)
|
log_thread = threading.Thread(target=tail_log, daemon=True)
|
||||||
|
@ -528,9 +589,19 @@ class MyApp(npyscreen.NPSAppManaged):
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
try:
|
try:
|
||||||
|
logging.debug("Ejecutando la aplicación principal")
|
||||||
MyApp().run()
|
MyApp().run()
|
||||||
|
except RuntimeError as e:
|
||||||
|
print(f"[ERROR] {e}")
|
||||||
|
logging.error(f"[ERROR] {e}")
|
||||||
|
exit(1) # Salir con un código de error
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
logging.warning("El programa fue interrumpido por el usuario (Ctrl-C)")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"[ERROR] Ocurrió un error: {e}")
|
logging.error(f"[ERROR] Ocurrió un error inesperado: {e}")
|
||||||
finally:
|
finally:
|
||||||
|
# Asegurarse de que todos los mensajes de log se escriban en el archivo
|
||||||
|
logging.debug("Finalizando el programa y cerrando el log")
|
||||||
|
logging.shutdown()
|
||||||
# Restaurar el terminal al estado normal
|
# Restaurar el terminal al estado normal
|
||||||
npyscreen.wrapper_basic(lambda stdscr: None)
|
npyscreen.wrapper_basic(lambda stdscr: None)
|
||||||
|
|
Loading…
Reference in New Issue