diff --git a/non_graf_installer/python-installer/oginstaller-v3.py b/non_graf_installer/python-installer/oginstaller-v3.py index e5ba339..76a6685 100644 --- a/non_graf_installer/python-installer/oginstaller-v3.py +++ b/non_graf_installer/python-installer/oginstaller-v3.py @@ -6,6 +6,7 @@ import requests # Importar el módulo requests from tqdm import tqdm # Importar tqdm para la barra de progreso import time # Importar time para simular el progreso import threading # Importar threading para leer el log en tiempo real +import socket CONFIGS_DIR = "/tmp/oginstall" os.makedirs(CONFIGS_DIR, exist_ok=True) @@ -39,6 +40,33 @@ def get_available_versions(): # Silenciar errores y devolver una lista vacía return [] +def get_default_ip(): + """Obtiene la IP asociada a la interfaz por defecto del servidor.""" + try: + # Obtener la interfaz asociada a la ruta por defecto + result = subprocess.run( + ["ip", "route", "get", "1.1.1.1"], + capture_output=True, + text=True, + check=True + ) + # Extraer la interfaz de la salida + interface = next((line.split()[-1] for line in result.stdout.splitlines() if "dev" in line), None) + if not interface: + raise ValueError("No se pudo determinar la interfaz por defecto.") + + # Obtener la IP de la interfaz + with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s: + s.connect(("8.8.8.8", 80)) + ip_address = s.getsockname()[0] + return ip_address + except Exception as e: + print(f"Error al obtener la IP por defecto: {e}") + return "192.168.2.2" # Valor por defecto + +# Variable global para la IP por defecto +DEFAULT_IP = get_default_ip() + class ComponentSelectionForm(npyscreen.ActionForm): def create(self): self.components = self.add(npyscreen.TitleMultiSelect, max_height=6, name="Selecciona los componentes", @@ -121,25 +149,78 @@ class OgGuiForm(ComponentForm): component_name = "oggui" def configure_fields(self): - self.fields["ogcoreUrl"] = {"widget": self.add(npyscreen.TitleText, name="URL API OgCore:", value="https://127.0.0.1:8443")} - self.fields["ogmercureUrl"] = {"widget": self.add(npyscreen.TitleText, name="Mercure URL:", value="https://127.0.0.1:3000/.well-known/mercure")} + self.fields["ogcoreUrl"] = {"widget": self.add(npyscreen.TitleText, name="URL API OgCore:", value="https://{}:8443".format(DEFAULT_IP))} + self.fields["ogmercureUrl"] = {"widget": self.add(npyscreen.TitleText, name="Mercure URL:", value="https://{} gr:3000/.well-known/mercure".format(DEFAULT_IP))} class OgDhcpForm(ComponentForm): component_name = "ogdhcp" - interfaces = get_network_interfaces() + def configure_fields(self): - self.fields["interfaces"] = {"widget": self.add(npyscreen.TitleText, name="Interfaces ({}):".format(self.interfaces), value=self.interfaces)} - self.fields["ip"] = {"widget": self.add(npyscreen.TitleText, name="IP del servidor DHCP:", value="192.168.2.2")} - self.fields["ogbootIP"] = {"widget": self.add(npyscreen.TitleText, name="IP del servidor Boot:", value="192.168.2.2")} + # Obtener las interfaces de red disponibles + available_interfaces = get_network_interfaces().split(",") + + # Mostrar las interfaces en una sola línea + interfaces_display = ", ".join(f"{i}:{iface}" for i, iface in enumerate(available_interfaces)) + + # Campo para mostrar las interfaces disponibles + self.fields["interfaces_display"] = { + "widget": self.add( + npyscreen.TitleText, + name="Interfaces disponibles (índice:nombre):", + value=interfaces_display, + editable=False # Solo para mostrar, no editable + ) + } + + # Campo para que el usuario seleccione los índices de las interfaces + self.fields["interfaces"] = { + "widget": self.add( + npyscreen.TitleText, + name="Selecciona los índices separados por comas:", + value="" + ) + } + + # Otros campos + self.fields["ip"] = {"widget": self.add(npyscreen.TitleText, name="IP del servidor DHCP:", value=DEFAULT_IP)} + self.fields["ogbootIP"] = {"widget": self.add(npyscreen.TitleText, name="IP del servidor Boot:", value=DEFAULT_IP)} + + def on_ok(self): + # Obtener los índices seleccionados por el usuario + selected_indices = self.fields["interfaces"]["widget"].value.split(",") + try: + # Convertir los índices en nombres de interfaces + available_interfaces = get_network_interfaces().split(",") + selected_interfaces = [available_interfaces[int(i.strip())] for i in selected_indices if i.strip().isdigit()] + interfaces_string = ",".join(selected_interfaces) + except (IndexError, ValueError): + npyscreen.notify_confirm("Selección inválida. Por favor, revisa los índices ingresados.", title="Error") + return + + # Guardar las configuraciones + self.parentApp.configurations[self.component_name] = { + "interfaces": interfaces_string, + "ip": self.fields["ip"]["widget"].value, + "ogbootIP": self.fields["ogbootIP"]["widget"].value, + } + + # Continuar con el siguiente formulario + self.parentApp.current_component_index += 1 + if self.parentApp.current_component_index < len(self.parentApp.selected_components): + next_component = self.parentApp.selected_components[self.parentApp.current_component_index] + self.parentApp.switchForm(next_component) + else: + self.parentApp.generate_debconf() + self.parentApp.setNextForm(None) class OgBootForm(ComponentForm): component_name = "ogboot" def configure_fields(self): - self.fields["ip"] = {"widget": self.add(npyscreen.TitleText, name="IP del servidor Boot:", value="192.168.2.2")} + self.fields["ip"] = {"widget": self.add(npyscreen.TitleText, name="IP del servidor Boot:", value=DEFAULT_IP)} self.fields["port"] = {"widget": self.add(npyscreen.TitleText, name="Puerto Boot:", value="8082")} - self.fields["ogcoreUrl"] = {"widget": self.add(npyscreen.TitleText, name="URL OgCore:", value="https://192.168.2.2:8443")} - self.fields["ogliveUrl"] = {"widget": self.add(npyscreen.TitleText, name="URL OgLive:", value="https://ognproject.evlt.uma.es/oglive/...")} + self.fields["ogcoreUrl"] = {"widget": self.add(npyscreen.TitleText, name="URL OgCore:", value=f"https://{DEFAULT_IP}:8443")} + self.fields["ogliveUrl"] = {"widget": self.add(npyscreen.TitleText, name="URL OgLive:", value="https://ognproject.evlt.uma.es/oglive/ogLive-noble-6.8.0-31-generic-amd64-r20250116.538e3fa_20250120.iso")} self.fields["sambaUser"] = {"widget": self.add(npyscreen.TitleText, name="Usuario Samba:", value="opengnsys")} self.fields["sambaUserPass"] = {"widget": self.add(npyscreen.TitlePassword, name="Contraseña Samba:", value="og")} @@ -147,8 +228,8 @@ class OgRepositoryForm(ComponentForm): component_name = "ogrepository" def configure_fields(self): - self.fields["ogrepoIp"] = {"widget": self.add(npyscreen.TitleText, name="IP del Repositorio:", value="192.168.2.2")} - self.fields["ogcoreIp"] = {"widget": self.add(npyscreen.TitleText, name="IP de OgCore:", value="192.168.2.2")} + self.fields["ogrepoIp"] = {"widget": self.add(npyscreen.TitleText, name="IP del Repositorio:", value=DEFAULT_IP)} + self.fields["ogcoreIp"] = {"widget": self.add(npyscreen.TitleText, name="IP de OgCore:", value=DEFAULT_IP)} self.fields["sambaUser"] = {"widget": self.add(npyscreen.TitleText, name="Usuario Samba:", value="opengnsys")} self.fields["sambaUserPass"] = {"widget": self.add(npyscreen.TitlePassword, name="Contraseña Samba:", value="og")} @@ -157,6 +238,10 @@ def install_components(components, selected_tag): log_file_path = os.path.join(CONFIGS_DIR, "installation.log") installed_packages = [] # Lista de paquetes instalados correctamente failed_packages = [] # Lista de paquetes que fallaron + + # Registrar el tiempo de inicio + start_time = time.time() + try: with open(log_file_path, "w") as log_file: total_packages = len(components) @@ -208,7 +293,6 @@ def install_components(components, selected_tag): print(error_message) log_file.write(f"\n{error_message}\n") failed_packages.append(package) # Agregar a la lista de fallos - break # Detener la instalación si ocurre un error else: log_file.write(f"Paquete {package} instalado correctamente.\n") installed_packages.append(package) # Agregar a la lista de éxitos @@ -217,18 +301,26 @@ def install_components(components, selected_tag): log_file.write(f"\nError durante la instalación de los paquetes: {e}\n") failed_packages.append("Error general durante la instalación") - # Mostrar un resumen al final - print("\n--- Resumen de la instalación ---") - print(f"Paquetes instalados correctamente: {len(installed_packages)}") + # Registrar el tiempo de finalización + end_time = time.time() + duration = end_time - start_time # Calcular la duración en segundos + + # Generar el resumen + summary = "\n--- Resumen de la instalación ---\n" + summary += f"Tiempo total de instalación: {duration:.2f} segundos\n" + summary += f"Paquetes instalados correctamente: {len(installed_packages)}\n" for pkg in installed_packages: - print(f" - {pkg}") + summary += f" - {pkg}\n" if failed_packages: - print(f"\nPaquetes que fallaron: {len(failed_packages)}") + summary += f"\nPaquetes que fallaron: {len(failed_packages)}\n" for pkg in failed_packages: - print(f" - {pkg}") + summary += f" - {pkg}\n" else: - print("\nTodos los paquetes se instalaron correctamente.") - print(f"\nConsulta el archivo de registro para más detalles: {log_file_path}") + summary += "\nTodos los paquetes se instalaron correctamente.\n" + summary += f"\nConsulta el archivo de registro para más detalles: {log_file_path}" + + # Mostrar el resumen en una ventana emergente + npyscreen.notify_confirm(summary, title="Resumen de la instalación", wide=True) class MyApp(npyscreen.NPSAppManaged): def onStart(self):