Updated version for installer
parent
92e24117e0
commit
36b8ee0250
|
@ -6,6 +6,7 @@ import requests # Importar el módulo requests
|
||||||
from tqdm import tqdm # Importar tqdm para la barra de progreso
|
from tqdm import tqdm # Importar tqdm para la barra de progreso
|
||||||
import time # Importar time para simular el progreso
|
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
|
||||||
|
|
||||||
CONFIGS_DIR = "/tmp/oginstall"
|
CONFIGS_DIR = "/tmp/oginstall"
|
||||||
os.makedirs(CONFIGS_DIR, exist_ok=True)
|
os.makedirs(CONFIGS_DIR, exist_ok=True)
|
||||||
|
@ -39,6 +40,33 @@ def get_available_versions():
|
||||||
# Silenciar errores y devolver una lista vacía
|
# Silenciar errores y devolver una lista vacía
|
||||||
return []
|
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):
|
class ComponentSelectionForm(npyscreen.ActionForm):
|
||||||
def create(self):
|
def create(self):
|
||||||
self.components = self.add(npyscreen.TitleMultiSelect, max_height=6, name="Selecciona los componentes",
|
self.components = self.add(npyscreen.TitleMultiSelect, max_height=6, name="Selecciona los componentes",
|
||||||
|
@ -121,25 +149,78 @@ class OgGuiForm(ComponentForm):
|
||||||
component_name = "oggui"
|
component_name = "oggui"
|
||||||
|
|
||||||
def configure_fields(self):
|
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["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://127.0.0.1:3000/.well-known/mercure")}
|
self.fields["ogmercureUrl"] = {"widget": self.add(npyscreen.TitleText, name="Mercure URL:", value="https://{} gr:3000/.well-known/mercure".format(DEFAULT_IP))}
|
||||||
|
|
||||||
class OgDhcpForm(ComponentForm):
|
class OgDhcpForm(ComponentForm):
|
||||||
component_name = "ogdhcp"
|
component_name = "ogdhcp"
|
||||||
interfaces = get_network_interfaces()
|
|
||||||
def configure_fields(self):
|
def configure_fields(self):
|
||||||
self.fields["interfaces"] = {"widget": self.add(npyscreen.TitleText, name="Interfaces ({}):".format(self.interfaces), value=self.interfaces)}
|
# Obtener las interfaces de red disponibles
|
||||||
self.fields["ip"] = {"widget": self.add(npyscreen.TitleText, name="IP del servidor DHCP:", value="192.168.2.2")}
|
available_interfaces = get_network_interfaces().split(",")
|
||||||
self.fields["ogbootIP"] = {"widget": self.add(npyscreen.TitleText, name="IP del servidor Boot:", value="192.168.2.2")}
|
|
||||||
|
# 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):
|
class OgBootForm(ComponentForm):
|
||||||
component_name = "ogboot"
|
component_name = "ogboot"
|
||||||
|
|
||||||
def configure_fields(self):
|
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["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["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/...")}
|
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["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")}
|
self.fields["sambaUserPass"] = {"widget": self.add(npyscreen.TitlePassword, name="Contraseña Samba:", value="og")}
|
||||||
|
|
||||||
|
@ -147,8 +228,8 @@ class OgRepositoryForm(ComponentForm):
|
||||||
component_name = "ogrepository"
|
component_name = "ogrepository"
|
||||||
|
|
||||||
def configure_fields(self):
|
def configure_fields(self):
|
||||||
self.fields["ogrepoIp"] = {"widget": self.add(npyscreen.TitleText, name="IP del Repositorio:", 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="192.168.2.2")}
|
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["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")}
|
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")
|
log_file_path = os.path.join(CONFIGS_DIR, "installation.log")
|
||||||
installed_packages = [] # Lista de paquetes instalados correctamente
|
installed_packages = [] # Lista de paquetes instalados correctamente
|
||||||
failed_packages = [] # Lista de paquetes que fallaron
|
failed_packages = [] # Lista de paquetes que fallaron
|
||||||
|
|
||||||
|
# Registrar el tiempo de inicio
|
||||||
|
start_time = time.time()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
with open(log_file_path, "w") as log_file:
|
with open(log_file_path, "w") as log_file:
|
||||||
total_packages = len(components)
|
total_packages = len(components)
|
||||||
|
@ -208,7 +293,6 @@ def install_components(components, selected_tag):
|
||||||
print(error_message)
|
print(error_message)
|
||||||
log_file.write(f"\n{error_message}\n")
|
log_file.write(f"\n{error_message}\n")
|
||||||
failed_packages.append(package) # Agregar a la lista de fallos
|
failed_packages.append(package) # Agregar a la lista de fallos
|
||||||
break # Detener la instalación si ocurre un error
|
|
||||||
else:
|
else:
|
||||||
log_file.write(f"Paquete {package} instalado correctamente.\n")
|
log_file.write(f"Paquete {package} instalado correctamente.\n")
|
||||||
installed_packages.append(package) # Agregar a la lista de éxitos
|
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")
|
log_file.write(f"\nError durante la instalación de los paquetes: {e}\n")
|
||||||
failed_packages.append("Error general durante la instalación")
|
failed_packages.append("Error general durante la instalación")
|
||||||
|
|
||||||
# Mostrar un resumen al final
|
# Registrar el tiempo de finalización
|
||||||
print("\n--- Resumen de la instalación ---")
|
end_time = time.time()
|
||||||
print(f"Paquetes instalados correctamente: {len(installed_packages)}")
|
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:
|
for pkg in installed_packages:
|
||||||
print(f" - {pkg}")
|
summary += f" - {pkg}\n"
|
||||||
if failed_packages:
|
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:
|
for pkg in failed_packages:
|
||||||
print(f" - {pkg}")
|
summary += f" - {pkg}\n"
|
||||||
else:
|
else:
|
||||||
print("\nTodos los paquetes se instalaron correctamente.")
|
summary += "\nTodos los paquetes se instalaron correctamente.\n"
|
||||||
print(f"\nConsulta el archivo de registro para más detalles: {log_file_path}")
|
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):
|
class MyApp(npyscreen.NPSAppManaged):
|
||||||
def onStart(self):
|
def onStart(self):
|
||||||
|
|
Loading…
Reference in New Issue