From 5a7952efe3d6f6a1457e71a6a10ddb12de1f8b6a Mon Sep 17 00:00:00 2001 From: Nicolas Arenas Date: Wed, 13 Nov 2024 20:48:17 +0100 Subject: [PATCH 01/47] push comp --- component-installer/component-installer.sh | 150 +++++++++++++++++++++ component-installer/provision_ogcore.sh | 50 +++++++ component-installer/provision_oggui.sh | 42 ++++++ python-installer/oginstaller.py | 134 ++++++++++++++++++ python-installer/oginstaller.sh | 46 +++++++ 5 files changed, 422 insertions(+) create mode 100644 component-installer/component-installer.sh create mode 100644 component-installer/provision_ogcore.sh create mode 100644 component-installer/provision_oggui.sh create mode 100755 python-installer/oginstaller.py create mode 100755 python-installer/oginstaller.sh diff --git a/component-installer/component-installer.sh b/component-installer/component-installer.sh new file mode 100644 index 0000000..7cb7128 --- /dev/null +++ b/component-installer/component-installer.sh @@ -0,0 +1,150 @@ +#!/usr/bin/bash + +# Paso 1: Seleccionar los componentes +# Los componentes a instalar se encuentran en el directorio /tmp/opengnsys-installer-configs + +# Set configuration + +function install_docker() { + apt-get -y update + apt-get -y install ca-certificates curl + install -m 0755 -d /etc/apt/keyrings + curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc + chmod a+r /etc/apt/keyrings/docker.asc + echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \ + tee /etc/apt/sources.list.d/docker.list > /dev/null + apt-get -y update + apt-get -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin + systemctl enable docker +} + +function install_ogcore_docker() { +cat < /etc/systemd/system/ogcore.service +[Unit] +Description=Servicio para ejecutar Docker Compose de ogCore +After=docker.service +Requires=docker.service + +[Service] +WorkingDirectory=/opt/opengnsys/ogCore/repo/ +ExecStart=/usr/bin/docker compose -f /opt/opengnsys/ogCore/etc/docker-compose-deploy.yml up +ExecStartPost=/opengnsys-installer/provision_ogcore.sh +ExecStop=/usr/bin/docker compose -f /opt/opengnsys/ogCore/etc/docker-compose-deploy.yml stop +Restart=always + +[Install] +WantedBy=multi-user.target +EOF + + systemctl daemon-reload + systemctl enable --now ogcore +} + + + +function install_oggui_docker() { + # Sacar la IP del ogCore de la configuración + oggui_version=$(jq -r '.container_version' /opt/opengnsys/ogGui/installer/config.json) + # Exportar los valores como variables de entorno + ENV_DIR=/opt/opengnsys/ogGui/etc/ + ENV_FILE=$ENV_DIR/.env + + cat < /etc/systemd/system/oggui-app.service +[Unit] +Description=Servicio para contenedor Docker de OgGui +After=docker.service +Requires=docker.service + +[Service] +Restart=always +ExecStartPre=/opengnsys-installer/provision_oggui.sh +ExecStart=/usr/bin/docker run --rm --name ogGui-app -p 4200:4200 -v $ENV_FILE:/app/.env opengnsys/oggui:$oggui_version +ExecStop=/usr/bin/docker stop ogGui-app + +[Install] +WantedBy=multi-user.target +EOF + + systemctl daemon-reload + systemctl enable --now oggui-app + +} + + +COMPONENTS="ogCore ogGui ogDhcp ogBoot ogRepository" +CONFIGS_DIR=/opengnsys-installer/ +PAT_FILE=/opengnsys-installer/pat.txt +PAT=$(cat $PAT_FILE | tr -d '\n\r\t') + +OPENGNSYS_BASE_URL="https://$PAT@ognproject.evlt.uma.es/gitea/opengnsys" + +OGBOOT_REPO="$OPENGNSYS_BASE_URL/ogboot.git" +OGCORE_REPO="$OPENGNSYS_BASE_URL/ogcore.git" +OGDHCP_REPO="$OPENGNSYS_BASE_URL/ogdhcp.git" +OGGUI_REPO="$OPENGNSYS_BASE_URL/oggui.git" +OGREPOSITORY_REPO="$OPENGNSYS_BASE_URL/ogrepo.git" + +export GIT_SSL_NO_VERIFY=1 +echo ======================================== > /etc/issue +echo "OpenGnSys Installer" >> /etc/issue +echo "Componentes instalados:" >> /etc/issue + + + +for component in $COMPONENTS +do + config_file="config_${component}.json" + if [ -f $CONFIGS_DIR/$config_file ]; then + echo "Componente $component seleccionado, instalando configuración..." + component_dir=/opt/opengnsys/$component + mkdir -p $component_dir/installer + mkdir -p $component_dir/repo + cp $CONFIGS_DIR/$config_file /opt/opengnsys/$component/installer/config.json + + case $component in + ogCore) + echo "Instalando ogCore..." + OGCORE_BRANCH=main + container_version=$(jq -r '.container_version' /opt/opengnsys/ogCore/installer/config.json) + git clone --branch "$OGCORE_BRANCH" "$OGCORE_REPO" "$component_dir/repo" + # Copy the docker-compose-deploy.yml file to /opt/opengnsys/ogCore/etc/ + mkdir -p $component_dir/etc/ + cp $component_dir/repo/docker-compose-deploy.yml $component_dir/etc/ + sed -i "s/static/$container_version/g" $component_dir/repo/docker-compose-deploy.yml + echo - ogCore >> /etc/issue + install_docker + install_ogcore_docker + ;; + ogGui) + echo "Instalando ogGui..." + OGGUI_BRANCH=main + git clone --branch "$OGGUI_BRANCH" "$OGGUI_REPO" "$component_dir/repo" + echo - ogGui >> /etc/issue + install_docker + install_oggui_docker + ;; + ogDhcp) + echo "Instalando ogDhcp..." + git clone "$OGDHCP_REPO" "$component_dir/repo" + echo - ogDhcp >> /etc/issue + ;; + ogBoot) + echo "Instalando ogBoot..." + git clone "$OGBOOT_REPO" "$component_dir/repo" + echo - ogBoot >> /etc/issue + ;; + ogRepository) + echo "Instalando ogRepository..." + git clone "$OGREPOSITORY_REPO" "$component_dir/repo" + echo - ogRepository >> /etc/issue + ;; + *) + echo "Componente $component no reconocido" + ;; + esac + continue + fi +done + +echo ======================================== >> /etc/issue +rm -f $PAT_FILE diff --git a/component-installer/provision_ogcore.sh b/component-installer/provision_ogcore.sh new file mode 100644 index 0000000..d693399 --- /dev/null +++ b/component-installer/provision_ogcore.sh @@ -0,0 +1,50 @@ +#!/bin/bash +# +set -x + +cd /opt/opengnsys/ogCore/repo/ + +# Preparar el fichero .yaml +CONF_DIR=/opt/opengnsys/ogCore/etc/ +mkdir -p $CONF_DIR + +# Copiar el fichero de configuración a CONF_DIR +cp docker-compose-deploy.yml $CONF_DIR/ + +if [ -f /opt/opengnsys/ogCore/installer/.deployed ]; then + echo "ogCore ya instalado" + exit 0 +fi + +while ! docker compose -f $CONF_DIR/docker-compose-deploy.yml ps --format json |jq -r '"\(.Name) \(.State)"' |grep -q 'ogcore-php running'; do + sleep 2 +done + +adminuser=$(jq -r '.username' /opt/opengnsys/ogCore/installer/config.json) +adminpass=$(jq -r '.password' /opt/opengnsys/ogCore/installer/config.json) + +docker compose -f $CONF_DIR/docker-compose-deploy.yml exec php composer install +docker compose -f $CONF_DIR/docker-compose-deploy.yml exec php php bin/console lexik:jwt:generate-keypair --overwrite +docker compose -f $CONF_DIR/docker-compose-deploy.yml exec php php bin/console doctrine:migrations:migrate --no-interaction +## TODO we need to feed $adminuser and $adminpass to doctrine:fixtures:load somehow +docker compose -f $CONF_DIR/docker-compose-deploy.yml exec php php bin/console doctrine:fixtures:load --no-interaction + + +# Provision user admin +bearer=$(curl -k -X 'POST' 'https://localhost:8443/auth/login' -H 'accept: application/json' -H 'Content-Type: application/json' -d "{ \"username\": \"ogadmin\", \"password\": \"12345678\" }" | jq .token | sed 's/"//g' ) + + +if [ $adminuser == "ogadmin" ]; then + echo "Cambiando password a ogadmin no puede ser el usuario administrador" + ogadmin_uuid=$(curl -q -k -L https://localhost:8443/users/?username=ogadmin -H 'accept: application/json' -H "Authorization: Bearer $bearer" | jq .[0].uuid | sed 's/"//g') + curl -k -L -X PUT "https://localhost:8443/users/$ogadmin_uuid/reset-password" -H 'accept: application/ld+json' -H 'Content-Type: application/ld+json' -d "{\"currentPassword\": \"12345678\", \"newPassword\": \"$adminpass\", \"repeatNewPassword\": \"$adminpass\"}" -H "Authorization: Bearer $bearer" + exit 0 +fi + +curl -k -L --location 'https://localhost:8443/users' \ +--header 'Content-Type: application/json' \ +--header "Authorization: Bearer $bearer" \ +--data "{ \"username\": \"$adminuser\", \"password\": \"$adminpass\", \"roles\": [\"ROLE_SUPER_ADMIN\"] }" + +touch /opt/opengnsys/ogCore/installer/.deployed +exit 0 diff --git a/component-installer/provision_oggui.sh b/component-installer/provision_oggui.sh new file mode 100644 index 0000000..7aba4d8 --- /dev/null +++ b/component-installer/provision_oggui.sh @@ -0,0 +1,42 @@ +#!/bin/bash +# +set -x + +# preparar el fichero .env +ENV_DIR=/opt/opengnsys/ogGui/etc/ +ENV_FILE=$ENV_DIR/.env +mkdir -p $ENV_DIR + +# Comprobar si ya se ha instalado ogCore +#if [ -f /opt/opengnsys/ogGui/installer/.deployed ]; then +# echo "ogCore ya instalado" +# exit 0 +#fi + +# Sacar la IP del ogCore de la configuración +ogcore_ip=$(jq -r '.ogcore_ip' /opt/opengnsys/ogGui/installer/config.json) +export OGCORE_IP="$ogcore_ip" + +# Si no se ha configurado la IP del ogCore, se intenta obtener de la interfaz de red +if [ -z "$ogcore_ip" ]; then + # Obtiene el nombre del interfaz asociado a la ruta por defecto + interface=$(ip route | grep default | awk '{print $5}') + + # Si se encuentra el interfaz, obtiene su dirección IP + if [ -n "$interface" ]; then + ip_address=$(ip -o -4 addr show "$interface" | awk '{print $4}' | cut -d'/' -f1) + ogcore_ip=$ip_address + # Si no se ha configurado la IP del ogCore, se escribe en el fichero .env + echo "NG_APP_BASE_API_URL=https://$ogcore_ip:8443" > $ENV_FILE + exit 0 + else + echo "No se pudo determinar el interfaz asociado a la ruta por defecto." + exit 1 + fi +fi + + +# Si se ha configurado la IP del ogCore, se escribe en el fichero .env +echo "NG_APP_BASE_API_URL=$OGCORE_IP" > $ENV_FILE + +touch /opt/opengnsys/ogGui/installer/.deployed diff --git a/python-installer/oginstaller.py b/python-installer/oginstaller.py new file mode 100755 index 0000000..7d8f615 --- /dev/null +++ b/python-installer/oginstaller.py @@ -0,0 +1,134 @@ +import curses +import json +import os + +CONFIGS_DIR = "/tmp/opengnsys-installer-configs" +os.makedirs(CONFIGS_DIR, exist_ok=True) + +def main(stdscr): + # Inicializar colores + curses.start_color() + curses.init_pair(1, curses.COLOR_WHITE, curses.COLOR_BLUE) # Texto blanco sobre fondo azul + stdscr.bkgd(' ', curses.color_pair(1)) # Aplicar fondo azul a la pantalla + + curses.curs_set(0) # Ocultar el cursor en el menú de selección + stdscr.clear() + + # Paso 1: Seleccionar componentes + components = ["ogCore", "ogGui", "ogDhcp", "ogBoot", "ogRepository"] + selected_components = [] + current_index = 0 # Índice para saber en qué componente está el cursor + + # Mostrar instrucciones y opciones de componentes + stdscr.addstr(1, 2, "Selecciona los componentes (usa Flechas para navegar, Espacio para seleccionar, Enter para continuar):", curses.color_pair(1) | curses.A_BOLD) + + while True: + # Mostrar el estado actual de selección de cada componente + for idx, comp in enumerate(components): + if comp in selected_components: + stdscr.addstr(idx + 3, 4, f"[X] {comp}", curses.color_pair(1)) + else: + stdscr.addstr(idx + 3, 4, f"[ ] {comp}", curses.color_pair(1)) + + # Mueve el cursor visualmente para resaltar la selección actual + stdscr.addstr(current_index + 3, 4, f"> {components[current_index]}", curses.color_pair(1)) + + key = stdscr.getch() + + if key == curses.KEY_UP and current_index > 0: # Navegar hacia arriba + current_index -= 1 + elif key == curses.KEY_DOWN and current_index < len(components) - 1: # Navegar hacia abajo + current_index += 1 + elif key == ord(" "): # Marcar/desmarcar con espacio + component = components[current_index] + if component in selected_components: + selected_components.remove(component) + else: + selected_components.append(component) + elif key == ord("\n"): # Confirma la selección con Enter + break + + stdscr.refresh() + + # Ahora pasamos a la configuración específica de cada componente seleccionado + curses.echo() # Activar eco para mostrar la entrada + for component in selected_components: + stdscr.clear() + stdscr.addstr(1, 2, f"Configuración para {component}:", curses.color_pair(1) | curses.A_BOLD) + curses.curs_set(1) # Mostrar el cursor para las entradas de configuración + + config_data = {} + if component == "ogCore": + stdscr.addstr(3, 4, "Usuario administrador:", curses.color_pair(1)) + user = stdscr.getstr(3, 26, 20).decode("utf-8") + stdscr.addstr(4, 4, "Contraseña:", curses.color_pair(1)) + password = stdscr.getstr(4, 26, 20).decode("utf-8") + stdscr.addstr(5, 4, "Tag del contenedor:", curses.color_pair(1)) + container_tag = stdscr.getstr(5, 26, 20).decode("utf-8") + + config_data = {"username": user, "password": password, "container_version": container_tag} + + elif component == "ogGui": + stdscr.addstr(3, 4, "IP del servidor de ogCore:", curses.color_pair(1)) + ogcore_ip = stdscr.getstr(3, 32, 20).decode("utf-8") + stdscr.addstr(4, 4, "Tag del contenedor:", curses.color_pair(1)) + container_version = stdscr.getstr(4, 32, 20).decode("utf-8") + + config_data = {"ogcore_ip": ogcore_ip, "container_version": container_version} + + elif component == "ogDhcp": + stdscr.addstr(3, 4, "Configuración IP servidor de Boot:", curses.color_pair(1)) + ogbootIP = stdscr.getstr(3, 37, 20).decode("utf-8") + stdscr.addstr(4, 4, "Interfaces Boot (separadas por coma):", curses.color_pair(1)) + interfaces = stdscr.getstr(4, 40, 20).decode("utf-8") + json_array_interfaces = interfaces.split(",") + + config_data = {"ogbootIP": ogbootIP, "interfaces": json_array_interfaces} + + elif component == "ogBoot": + stdscr.addstr(3, 4, "ogCore Ip Server:", curses.color_pair(1)) + ogcore_ip = stdscr.getstr(3, 28, 20).decode("utf-8") + stdscr.addstr(4, 4, "ogCore Server:", curses.color_pair(1)) + ogcore_server = stdscr.getstr(4, 28, 20).decode("utf-8") + stdscr.addstr(5, 4, "ogCore Dir:", curses.color_pair(1)) + ogcore_dir = stdscr.getstr(5, 28, 20).decode("utf-8") + stdscr.addstr(6, 4, "ogBoot GitRepo:", curses.color_pair(1)) + ogboot_gitrepo = stdscr.getstr(6, 28, 20).decode("utf-8") + stdscr.addstr(7, 4, "ogBoot Samba User:", curses.color_pair(1)) + ogboot_samba_user = stdscr.getstr(7, 28, 20).decode("utf-8") + stdscr.addstr(8, 4, "ogBoot Samba Pass:", curses.color_pair(1)) + ogboot_samba_pass = stdscr.getstr(8, 28, 20).decode("utf-8") + + config_data = { + "ogcore_ip": ogcore_ip, + "ogcore_server": ogcore_server, + "ogcore_dir": ogcore_dir, + "ogboot_gitrepo": ogboot_gitrepo, + "ogboot_samba_user": ogboot_samba_user, + "ogboot_samba_pass": ogboot_samba_pass, + } + elif component == "ogRepository": + stdscr.addstr(3, 4, "ogRepository IP Server: ", curses.color_pair(1)) + ogrepository_ip = stdscr.getstr(3, 28, 20).decode("utf-8") + stdscr.addstr(4, 4, "ogRepository Sambauser: ", curses.color_pair(1)) + ogrepository_samba_user = stdscr.getstr(4, 28, 20).decode("utf-8") + stdscr.addstr(5, 4, "ogRepository Sambapass: ", curses.color_pair(1)) + ogrepository_samba_pass = stdscr.getstr(5, 28, 20).decode("utf-8") + + config_data = { + "ogrepository_ip": ogrepository_ip, + "ogrepository_samba_user": ogrepository_samba_user, + "ogrepository_samba_pass": ogrepository_samba_pass, + } + # Guardar en archivo JSON + config_file = os.path.join(CONFIGS_DIR, f"config_{component}.json") + with open(config_file, "w") as f: + json.dump(config_data, f) + stdscr.clear() + stdscr.addstr(2, 2, f"Configuración de {component} guardada en {config_file}", curses.color_pair(1)) + stdscr.refresh() + stdscr.getch() + + curses.noecho() # Desactivar el eco después de la entrada + +curses.wrapper(main) diff --git a/python-installer/oginstaller.sh b/python-installer/oginstaller.sh new file mode 100755 index 0000000..73595e4 --- /dev/null +++ b/python-installer/oginstaller.sh @@ -0,0 +1,46 @@ +#!/bin/bash + +# Setup installer environment + + +BRANCH=${BRANCH:-main} +GIT_SSL_NO_VERIFY=1 +GIT_REPO="https://ognproject.evlt.uma.es/gitea/api/v1/repos/opengnsys/oginstaller/archive/$BRANCH.zip" +export GIT_SSL_NO_VERIFY + + + +install_packages() { + apt-get update + apt-get install -y curl jq unzip python3 +} + +download_installer() { + + rm -f /tmp/oginstaller.zip + rm -rf /tmp/oginstaller-$BRANCH + rm -rf /tmp/oginstaller + + curl -q -k $GIT_REPO -H 'accept: application/json' -o /tmp/oginstaller.zip + unzip /tmp/oginstaller.zip -d /tmp + mv /tmp/oginstaller /tmp/oginstaller-$BRANCH +} + +extract_installer() { + rm -rf /tmp/oginstall + mkdir -p /tmp/oginstall + cp -r /tmp/oginstaller-$BRANCH/python-installer/* /tmp/oginstall/ + cp -r /tmp/oginstaller-$BRANCH/component-installer/* /tmp/oginstall/ +} + +create_questions() { + echo "Creating questions..." + python3 /tmp/oginstall/oginstaller.py +} + + +install_packages +download_installer +extract_installer +create_questions + From a09814c11355990dc0e926edef09fdd8c05afa47 Mon Sep 17 00:00:00 2001 From: Nicolas Arenas Date: Wed, 13 Nov 2024 20:55:10 +0100 Subject: [PATCH 02/47] Changes config dirs to current direcotry --- python-installer/oginstaller.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python-installer/oginstaller.py b/python-installer/oginstaller.py index 7d8f615..991c424 100755 --- a/python-installer/oginstaller.py +++ b/python-installer/oginstaller.py @@ -2,7 +2,7 @@ import curses import json import os -CONFIGS_DIR = "/tmp/opengnsys-installer-configs" +CONFIGS_DIR = "./" os.makedirs(CONFIGS_DIR, exist_ok=True) def main(stdscr): From dda794f3286ef9fb469f5de1bc72327b1b1f2e65 Mon Sep 17 00:00:00 2001 From: Nicolas Arenas Date: Wed, 13 Nov 2024 20:57:15 +0100 Subject: [PATCH 03/47] Fix path for installer --- python-installer/oginstaller.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python-installer/oginstaller.py b/python-installer/oginstaller.py index 991c424..8d7a374 100755 --- a/python-installer/oginstaller.py +++ b/python-installer/oginstaller.py @@ -2,7 +2,7 @@ import curses import json import os -CONFIGS_DIR = "./" +CONFIGS_DIR = "/tmp/oginstall" os.makedirs(CONFIGS_DIR, exist_ok=True) def main(stdscr): From 50f2c60d313f3235d7ffc7359156e8470126db68 Mon Sep 17 00:00:00 2001 From: Nicolas Arenas Date: Wed, 13 Nov 2024 21:11:22 +0100 Subject: [PATCH 04/47] Enable debug in installer --- component-installer/component-installer.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/component-installer/component-installer.sh b/component-installer/component-installer.sh index 7cb7128..cdddcd4 100644 --- a/component-installer/component-installer.sh +++ b/component-installer/component-installer.sh @@ -1,5 +1,5 @@ #!/usr/bin/bash - +set -x # Paso 1: Seleccionar los componentes # Los componentes a instalar se encuentran en el directorio /tmp/opengnsys-installer-configs From d6d2df9855d81f098bccf2f2d9a71215c42b7687 Mon Sep 17 00:00:00 2001 From: Nicolas Arenas Date: Wed, 13 Nov 2024 21:21:37 +0100 Subject: [PATCH 05/47] Update CONFIG DIR Variable for systemd unit --- component-installer/component-installer.sh | 38 ++++++++++++---------- 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/component-installer/component-installer.sh b/component-installer/component-installer.sh index cdddcd4..2ee2e66 100644 --- a/component-installer/component-installer.sh +++ b/component-installer/component-installer.sh @@ -2,9 +2,27 @@ set -x # Paso 1: Seleccionar los componentes # Los componentes a instalar se encuentran en el directorio /tmp/opengnsys-installer-configs - # Set configuration + +COMPONENTS="ogCore ogGui ogDhcp ogBoot ogRepository" +CONFIGS_DIR=/tmp/oginstall +# PAT_FILE=/opengnsys-installer/pat.txt +# PAT=$(cat $PAT_FILE | tr -d '\n\r\t') + +# OPENGNSYS_BASE_URL="https://$PAT@ognproject.evlt.uma.es/gitea/opengnsys" +OPENGNSYS_BASE_URL="https://ognproject.evlt.uma.es/gitea/opengnsys" + +OGBOOT_REPO="$OPENGNSYS_BASE_URL/ogboot.git" +OGCORE_REPO="$OPENGNSYS_BASE_URL/ogcore.git" +OGDHCP_REPO="$OPENGNSYS_BASE_URL/ogdhcp.git" +OGGUI_REPO="$OPENGNSYS_BASE_URL/oggui.git" +OGREPOSITORY_REPO="$OPENGNSYS_BASE_URL/ogrepo.git" +export GIT_SSL_NO_VERIFY=1 + + +## Functions + function install_docker() { apt-get -y update apt-get -y install ca-certificates curl @@ -28,7 +46,7 @@ Requires=docker.service [Service] WorkingDirectory=/opt/opengnsys/ogCore/repo/ ExecStart=/usr/bin/docker compose -f /opt/opengnsys/ogCore/etc/docker-compose-deploy.yml up -ExecStartPost=/opengnsys-installer/provision_ogcore.sh +ExecStartPost=$CONFIGS_DIR/provision_ogcore.sh ExecStop=/usr/bin/docker compose -f /opt/opengnsys/ogCore/etc/docker-compose-deploy.yml stop Restart=always @@ -41,7 +59,6 @@ EOF } - function install_oggui_docker() { # Sacar la IP del ogCore de la configuración oggui_version=$(jq -r '.container_version' /opt/opengnsys/ogGui/installer/config.json) @@ -70,21 +87,6 @@ EOF } - -COMPONENTS="ogCore ogGui ogDhcp ogBoot ogRepository" -CONFIGS_DIR=/opengnsys-installer/ -PAT_FILE=/opengnsys-installer/pat.txt -PAT=$(cat $PAT_FILE | tr -d '\n\r\t') - -OPENGNSYS_BASE_URL="https://$PAT@ognproject.evlt.uma.es/gitea/opengnsys" - -OGBOOT_REPO="$OPENGNSYS_BASE_URL/ogboot.git" -OGCORE_REPO="$OPENGNSYS_BASE_URL/ogcore.git" -OGDHCP_REPO="$OPENGNSYS_BASE_URL/ogdhcp.git" -OGGUI_REPO="$OPENGNSYS_BASE_URL/oggui.git" -OGREPOSITORY_REPO="$OPENGNSYS_BASE_URL/ogrepo.git" - -export GIT_SSL_NO_VERIFY=1 echo ======================================== > /etc/issue echo "OpenGnSys Installer" >> /etc/issue echo "Componentes instalados:" >> /etc/issue From 1fbbdb657cd192997ab89259ff2cbb2956439034 Mon Sep 17 00:00:00 2001 From: Nicolas Arenas Date: Wed, 13 Nov 2024 21:45:33 +0100 Subject: [PATCH 06/47] make oginstall executable --- python-installer/oginstaller.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/python-installer/oginstaller.sh b/python-installer/oginstaller.sh index 73595e4..6bf7ff2 100755 --- a/python-installer/oginstaller.sh +++ b/python-installer/oginstaller.sh @@ -31,6 +31,8 @@ extract_installer() { mkdir -p /tmp/oginstall cp -r /tmp/oginstaller-$BRANCH/python-installer/* /tmp/oginstall/ cp -r /tmp/oginstaller-$BRANCH/component-installer/* /tmp/oginstall/ + chmod 755 /tmp/oginstall/*.sh + chmod 755 /tmp/oginstall/*.py } create_questions() { From 52e1c2f5a87c16049226922655d6096ed09e984f Mon Sep 17 00:00:00 2001 From: Nicolas Arenas Date: Wed, 13 Nov 2024 21:50:31 +0100 Subject: [PATCH 07/47] Updating installer paths --- component-installer/component-installer.sh | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/component-installer/component-installer.sh b/component-installer/component-installer.sh index 2ee2e66..2119e83 100644 --- a/component-installer/component-installer.sh +++ b/component-installer/component-installer.sh @@ -46,7 +46,7 @@ Requires=docker.service [Service] WorkingDirectory=/opt/opengnsys/ogCore/repo/ ExecStart=/usr/bin/docker compose -f /opt/opengnsys/ogCore/etc/docker-compose-deploy.yml up -ExecStartPost=$CONFIGS_DIR/provision_ogcore.sh +ExecStartPost=/opt/opengnsys/ogCore/bin/provision_ogcore.sh ExecStop=/usr/bin/docker compose -f /opt/opengnsys/ogCore/etc/docker-compose-deploy.yml stop Restart=always @@ -74,7 +74,7 @@ Requires=docker.service [Service] Restart=always -ExecStartPre=/opengnsys-installer/provision_oggui.sh +ExecStartPre=/opt/opengnsys/ogGui/bin/provision_oggui.sh ExecStart=/usr/bin/docker run --rm --name ogGui-app -p 4200:4200 -v $ENV_FILE:/app/.env opengnsys/oggui:$oggui_version ExecStop=/usr/bin/docker stop ogGui-app @@ -111,6 +111,9 @@ do git clone --branch "$OGCORE_BRANCH" "$OGCORE_REPO" "$component_dir/repo" # Copy the docker-compose-deploy.yml file to /opt/opengnsys/ogCore/etc/ mkdir -p $component_dir/etc/ + mkdir -p $component_dir/bin/ + cp provision_ogcore.sh $component_dir/bin/ + chmod 755 $component_dir/bin/provision_ogcore.sh cp $component_dir/repo/docker-compose-deploy.yml $component_dir/etc/ sed -i "s/static/$container_version/g" $component_dir/repo/docker-compose-deploy.yml echo - ogCore >> /etc/issue @@ -120,6 +123,9 @@ do ogGui) echo "Instalando ogGui..." OGGUI_BRANCH=main + mkdir -p $component_dir/bin + cp provision_oggui.sh $component_dir/bin/ + chmod 755 $component_dir/bin/provision_oggui.sh git clone --branch "$OGGUI_BRANCH" "$OGGUI_REPO" "$component_dir/repo" echo - ogGui >> /etc/issue install_docker @@ -149,4 +155,4 @@ do done echo ======================================== >> /etc/issue -rm -f $PAT_FILE +# rm -f $PAT_FILE From 520b2861fc4850ba4815245122ddee7470bfba11 Mon Sep 17 00:00:00 2001 From: Nicolas Arenas Date: Thu, 14 Nov 2024 01:17:30 +0100 Subject: [PATCH 08/47] Component installer downloads specific release - Python script gets tags from repo --- component-installer/component-installer.sh | 24 ++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/component-installer/component-installer.sh b/component-installer/component-installer.sh index 2119e83..2ee6757 100644 --- a/component-installer/component-installer.sh +++ b/component-installer/component-installer.sh @@ -87,6 +87,15 @@ EOF } +function git_checkout_relaase() { + git clone --no-checkout "$1" "$2" + cd "$2" || exit + git checkout tags/"$3" + cd - || exit +} + + + echo ======================================== > /etc/issue echo "OpenGnSys Installer" >> /etc/issue echo "Componentes instalados:" >> /etc/issue @@ -106,10 +115,9 @@ do case $component in ogCore) echo "Instalando ogCore..." - OGCORE_BRANCH=main + OGCORE_BRANCH=$(jq -r '.container_version' /opt/opengnsys/ogCore/installer/config.json) container_version=$(jq -r '.container_version' /opt/opengnsys/ogCore/installer/config.json) - git clone --branch "$OGCORE_BRANCH" "$OGCORE_REPO" "$component_dir/repo" - # Copy the docker-compose-deploy.yml file to /opt/opengnsys/ogCore/etc/ + git_checkout_relaase "$OGCORE_REPO" "$component_dir/repo" "$OGCORE_BRANCH" mkdir -p $component_dir/etc/ mkdir -p $component_dir/bin/ cp provision_ogcore.sh $component_dir/bin/ @@ -122,28 +130,28 @@ do ;; ogGui) echo "Instalando ogGui..." - OGGUI_BRANCH=main + OGGUI_BRANCH=$(jq -r '.container_version' /opt/opengnsys/ogGui/installer/config.json) mkdir -p $component_dir/bin cp provision_oggui.sh $component_dir/bin/ chmod 755 $component_dir/bin/provision_oggui.sh - git clone --branch "$OGGUI_BRANCH" "$OGGUI_REPO" "$component_dir/repo" + git_checkout_relaase "$OGGUI_REPO" "$component_dir/repo" "$OGGUI_BRANCH" echo - ogGui >> /etc/issue install_docker install_oggui_docker ;; ogDhcp) echo "Instalando ogDhcp..." - git clone "$OGDHCP_REPO" "$component_dir/repo" + git_checkout_relaase "$OGDHCP_REPO" "$component_dir/repo" "$OGCORE_BRANCH" echo - ogDhcp >> /etc/issue ;; ogBoot) echo "Instalando ogBoot..." - git clone "$OGBOOT_REPO" "$component_dir/repo" + git_checkout_relaase "$OGBOOT_REPO" "$component_dir/repo" "$OGCORE_BRANCH" echo - ogBoot >> /etc/issue ;; ogRepository) echo "Instalando ogRepository..." - git clone "$OGREPOSITORY_REPO" "$component_dir/repo" + git_checkout_relaase "$OGREPOSITORY_REPO" "$component_dir/repo" "$OGCORE_BRANCH" echo - ogRepository >> /etc/issue ;; *) From 12ca1e75fdd6f1167ee8269bee8fdbacc757cd77 Mon Sep 17 00:00:00 2001 From: Nicolas Arenas Date: Thu, 14 Nov 2024 01:18:27 +0100 Subject: [PATCH 09/47] oginstaller launch installer --- python-installer/oginstaller.py | 71 ++++++++++++++++++++++++++++----- python-installer/oginstaller.sh | 1 + 2 files changed, 62 insertions(+), 10 deletions(-) diff --git a/python-installer/oginstaller.py b/python-installer/oginstaller.py index 8d7a374..da4bcc0 100755 --- a/python-installer/oginstaller.py +++ b/python-installer/oginstaller.py @@ -1,10 +1,39 @@ import curses import json import os +from git import Repo + CONFIGS_DIR = "/tmp/oginstall" os.makedirs(CONFIGS_DIR, exist_ok=True) +REPO_URL = "https://ognproject.evlt.uma.es/gitea/opengnsys/ogcore.git" + +def get_git_tags(): + try: + repo_path = os.path.join(CONFIGS_DIR, "opengnsys_repo") + if not os.path.exists(repo_path): + print("Clonando el repositorio...") + Repo.clone_from(REPO_URL, repo_path) # Clona el repositorio si no existe + else: + print("Usando repositorio existente en", repo_path) + + repo = Repo(repo_path) + # pattern = "opengnsys" + # tags = [tag.name for tag in repo.tags if tag.name.startswith(pattern)] + tags = [tag.name for tag in repo.tags] + # Comprobar si se han obtenido tags correctamente + if tags: + print("Tags encontrados:", tags) + else: + print("No se encontraron tags con el patrón especificado.") + + return tags + except Exception as e: + print("Error al obtener los tags:", str(e)) + return [] + + def main(stdscr): # Inicializar colores curses.start_color() @@ -22,6 +51,7 @@ def main(stdscr): # Mostrar instrucciones y opciones de componentes stdscr.addstr(1, 2, "Selecciona los componentes (usa Flechas para navegar, Espacio para seleccionar, Enter para continuar):", curses.color_pair(1) | curses.A_BOLD) + while True: # Mostrar el estado actual de selección de cada componente for idx, comp in enumerate(components): @@ -50,6 +80,32 @@ def main(stdscr): stdscr.refresh() + # Menu de selección de releases + tags = get_git_tags() + tag_index = 0 + + stdscr.clear() + + while True: + for idx, tag in enumerate(tags): + if idx == tag_index: + stdscr.addstr(idx + 3, 4, f"> {tag}", curses.color_pair(1)) + else: + stdscr.addstr(idx + 3, 4, f" {tag}", curses.color_pair(1)) + + key = stdscr.getch() + + if key == curses.KEY_UP and tag_index > 0: # Navegar hacia arriba + tag_index -= 1 + elif key == curses.KEY_DOWN and tag_index < len(tags) - 1: # Navegar hacia abajo + tag_index += 1 + elif key == ord("\n"): # Confirma la selección con Enter + break + + stdscr.refresh() + + + # Ahora pasamos a la configuración específica de cada componente seleccionado curses.echo() # Activar eco para mostrar la entrada for component in selected_components: @@ -63,18 +119,12 @@ def main(stdscr): user = stdscr.getstr(3, 26, 20).decode("utf-8") stdscr.addstr(4, 4, "Contraseña:", curses.color_pair(1)) password = stdscr.getstr(4, 26, 20).decode("utf-8") - stdscr.addstr(5, 4, "Tag del contenedor:", curses.color_pair(1)) - container_tag = stdscr.getstr(5, 26, 20).decode("utf-8") - - config_data = {"username": user, "password": password, "container_version": container_tag} + config_data = {"username": user, "password": password, "container_version": tags[tag_index]} elif component == "ogGui": stdscr.addstr(3, 4, "IP del servidor de ogCore:", curses.color_pair(1)) ogcore_ip = stdscr.getstr(3, 32, 20).decode("utf-8") - stdscr.addstr(4, 4, "Tag del contenedor:", curses.color_pair(1)) - container_version = stdscr.getstr(4, 32, 20).decode("utf-8") - - config_data = {"ogcore_ip": ogcore_ip, "container_version": container_version} + config_data = {"ogcore_ip": ogcore_ip, "container_version": tags[tag_index]} elif component == "ogDhcp": stdscr.addstr(3, 4, "Configuración IP servidor de Boot:", curses.color_pair(1)) @@ -82,8 +132,7 @@ def main(stdscr): stdscr.addstr(4, 4, "Interfaces Boot (separadas por coma):", curses.color_pair(1)) interfaces = stdscr.getstr(4, 40, 20).decode("utf-8") json_array_interfaces = interfaces.split(",") - - config_data = {"ogbootIP": ogbootIP, "interfaces": json_array_interfaces} + config_data = {"ogbootIP": ogbootIP, "interfaces": json_array_interfaces , "relase": tags[tag_index]} elif component == "ogBoot": stdscr.addstr(3, 4, "ogCore Ip Server:", curses.color_pair(1)) @@ -106,6 +155,7 @@ def main(stdscr): "ogboot_gitrepo": ogboot_gitrepo, "ogboot_samba_user": ogboot_samba_user, "ogboot_samba_pass": ogboot_samba_pass, + "release": tags[tag_index] } elif component == "ogRepository": stdscr.addstr(3, 4, "ogRepository IP Server: ", curses.color_pair(1)) @@ -119,6 +169,7 @@ def main(stdscr): "ogrepository_ip": ogrepository_ip, "ogrepository_samba_user": ogrepository_samba_user, "ogrepository_samba_pass": ogrepository_samba_pass, + "release": tags[tag_index] } # Guardar en archivo JSON config_file = os.path.join(CONFIGS_DIR, f"config_{component}.json") diff --git a/python-installer/oginstaller.sh b/python-installer/oginstaller.sh index 6bf7ff2..16bc5ae 100755 --- a/python-installer/oginstaller.sh +++ b/python-installer/oginstaller.sh @@ -45,4 +45,5 @@ install_packages download_installer extract_installer create_questions +launch_component_installer From b40fc19e552c3e005e45f10c9463d5b2f8fcee5b Mon Sep 17 00:00:00 2001 From: Nicolas Arenas Date: Thu, 14 Nov 2024 01:22:25 +0100 Subject: [PATCH 10/47] Create function to launch component installer --- python-installer/oginstaller.sh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/python-installer/oginstaller.sh b/python-installer/oginstaller.sh index 16bc5ae..dc8efc7 100755 --- a/python-installer/oginstaller.sh +++ b/python-installer/oginstaller.sh @@ -40,6 +40,11 @@ create_questions() { python3 /tmp/oginstall/oginstaller.py } +launch_component_installer() { + echo "Launching component installer..." + /tmp/oginstall/component-installer.sh +} + install_packages download_installer From 23c28e453460e8fd5208428bec237846d2c21ec3 Mon Sep 17 00:00:00 2001 From: Nicolas Arenas Date: Thu, 14 Nov 2024 01:38:42 +0100 Subject: [PATCH 11/47] Fixing minor prooblems --- component-installer.sh | 2 +- component-installer/component-installer.sh | 16 ++++++++-------- python-installer/oginstaller.sh | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/component-installer.sh b/component-installer.sh index 7cb7128..34819a3 100644 --- a/component-installer.sh +++ b/component-installer.sh @@ -82,7 +82,7 @@ OGBOOT_REPO="$OPENGNSYS_BASE_URL/ogboot.git" OGCORE_REPO="$OPENGNSYS_BASE_URL/ogcore.git" OGDHCP_REPO="$OPENGNSYS_BASE_URL/ogdhcp.git" OGGUI_REPO="$OPENGNSYS_BASE_URL/oggui.git" -OGREPOSITORY_REPO="$OPENGNSYS_BASE_URL/ogrepo.git" +OGREPOSITORY_REPO="$OPENGNSYS_BASE_URL/ogrepository.git" export GIT_SSL_NO_VERIFY=1 echo ======================================== > /etc/issue diff --git a/component-installer/component-installer.sh b/component-installer/component-installer.sh index 2ee6757..6aca455 100644 --- a/component-installer/component-installer.sh +++ b/component-installer/component-installer.sh @@ -87,7 +87,7 @@ EOF } -function git_checkout_relaase() { +function git_checkout_release() { git clone --no-checkout "$1" "$2" cd "$2" || exit git checkout tags/"$3" @@ -117,10 +117,10 @@ do echo "Instalando ogCore..." OGCORE_BRANCH=$(jq -r '.container_version' /opt/opengnsys/ogCore/installer/config.json) container_version=$(jq -r '.container_version' /opt/opengnsys/ogCore/installer/config.json) - git_checkout_relaase "$OGCORE_REPO" "$component_dir/repo" "$OGCORE_BRANCH" + git_checkout_release "$OGCORE_REPO" "$component_dir/repo" "$OGCORE_BRANCH" mkdir -p $component_dir/etc/ mkdir -p $component_dir/bin/ - cp provision_ogcore.sh $component_dir/bin/ + cp $CONFIGS_DIR/provision_ogcore.sh $component_dir/bin/ chmod 755 $component_dir/bin/provision_ogcore.sh cp $component_dir/repo/docker-compose-deploy.yml $component_dir/etc/ sed -i "s/static/$container_version/g" $component_dir/repo/docker-compose-deploy.yml @@ -132,26 +132,26 @@ do echo "Instalando ogGui..." OGGUI_BRANCH=$(jq -r '.container_version' /opt/opengnsys/ogGui/installer/config.json) mkdir -p $component_dir/bin - cp provision_oggui.sh $component_dir/bin/ + cp $CONFIGS_DIR/provision_oggui.sh $component_dir/bin/ chmod 755 $component_dir/bin/provision_oggui.sh - git_checkout_relaase "$OGGUI_REPO" "$component_dir/repo" "$OGGUI_BRANCH" + git_checkout_release "$OGGUI_REPO" "$component_dir/repo" "$OGGUI_BRANCH" echo - ogGui >> /etc/issue install_docker install_oggui_docker ;; ogDhcp) echo "Instalando ogDhcp..." - git_checkout_relaase "$OGDHCP_REPO" "$component_dir/repo" "$OGCORE_BRANCH" + git_checkout_release "$OGDHCP_REPO" "$component_dir/repo" "$OGCORE_BRANCH" echo - ogDhcp >> /etc/issue ;; ogBoot) echo "Instalando ogBoot..." - git_checkout_relaase "$OGBOOT_REPO" "$component_dir/repo" "$OGCORE_BRANCH" + git_checkout_release "$OGBOOT_REPO" "$component_dir/repo" "$OGCORE_BRANCH" echo - ogBoot >> /etc/issue ;; ogRepository) echo "Instalando ogRepository..." - git_checkout_relaase "$OGREPOSITORY_REPO" "$component_dir/repo" "$OGCORE_BRANCH" + git_checkout_release "$OGREPOSITORY_REPO" "$component_dir/repo" "$OGCORE_BRANCH" echo - ogRepository >> /etc/issue ;; *) diff --git a/python-installer/oginstaller.sh b/python-installer/oginstaller.sh index dc8efc7..1523fe1 100755 --- a/python-installer/oginstaller.sh +++ b/python-installer/oginstaller.sh @@ -12,7 +12,7 @@ export GIT_SSL_NO_VERIFY install_packages() { apt-get update - apt-get install -y curl jq unzip python3 + apt-get install -y curl jq unzip python3 python3-git } download_installer() { From 9450a614678181b841342e5c60e6d6e52d1f150f Mon Sep 17 00:00:00 2001 From: Nicolas Arenas Date: Thu, 14 Nov 2024 01:45:25 +0100 Subject: [PATCH 12/47] Fix ogrepository URL --- component-installer/component-installer.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/component-installer/component-installer.sh b/component-installer/component-installer.sh index 6aca455..42a294b 100644 --- a/component-installer/component-installer.sh +++ b/component-installer/component-installer.sh @@ -17,7 +17,7 @@ OGBOOT_REPO="$OPENGNSYS_BASE_URL/ogboot.git" OGCORE_REPO="$OPENGNSYS_BASE_URL/ogcore.git" OGDHCP_REPO="$OPENGNSYS_BASE_URL/ogdhcp.git" OGGUI_REPO="$OPENGNSYS_BASE_URL/oggui.git" -OGREPOSITORY_REPO="$OPENGNSYS_BASE_URL/ogrepo.git" +OGREPOSITORY_REPO="$OPENGNSYS_BASE_URL/ogrepository.git" export GIT_SSL_NO_VERIFY=1 From bc024b08c116098c466c72adf8d80171fd9ee6d3 Mon Sep 17 00:00:00 2001 From: Nicolas Arenas Date: Thu, 14 Nov 2024 02:20:28 +0100 Subject: [PATCH 13/47] Fix provision gui problem --- component-installer/provision_oggui.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/component-installer/provision_oggui.sh b/component-installer/provision_oggui.sh index 7aba4d8..7648afb 100644 --- a/component-installer/provision_oggui.sh +++ b/component-installer/provision_oggui.sh @@ -8,10 +8,10 @@ ENV_FILE=$ENV_DIR/.env mkdir -p $ENV_DIR # Comprobar si ya se ha instalado ogCore -#if [ -f /opt/opengnsys/ogGui/installer/.deployed ]; then -# echo "ogCore ya instalado" -# exit 0 -#fi +if [ -f /opt/opengnsys/ogGui/installer/.deployed ]; then + echo "ogCore ya instalado" + exit 0 +fi # Sacar la IP del ogCore de la configuración ogcore_ip=$(jq -r '.ogcore_ip' /opt/opengnsys/ogGui/installer/config.json) From b2305740b28b0d6e0dc8dbd4a01caee9d768ef66 Mon Sep 17 00:00:00 2001 From: Nicolas Arenas Date: Thu, 14 Nov 2024 07:26:50 +0100 Subject: [PATCH 14/47] Improving input methods --- python-installer/oginstaller.py | 373 ++++++++++++++++++++++++++------ 1 file changed, 308 insertions(+), 65 deletions(-) diff --git a/python-installer/oginstaller.py b/python-installer/oginstaller.py index da4bcc0..10c9730 100755 --- a/python-installer/oginstaller.py +++ b/python-installer/oginstaller.py @@ -1,12 +1,222 @@ +# import curses +# import json +# import os +# from git import Repo + + +# CONFIGS_DIR = "/tmp/oginstall" +# os.makedirs(CONFIGS_DIR, exist_ok=True) + +# REPO_URL = "https://ognproject.evlt.uma.es/gitea/opengnsys/ogcore.git" + +# def get_git_tags(): +# try: +# repo_path = os.path.join(CONFIGS_DIR, "opengnsys_repo") +# if not os.path.exists(repo_path): +# print("Clonando el repositorio...") +# Repo.clone_from(REPO_URL, repo_path) # Clona el repositorio si no existe +# else: +# print("Usando repositorio existente en", repo_path) + +# repo = Repo(repo_path) +# # pattern = "opengnsys" +# # tags = [tag.name for tag in repo.tags if tag.name.startswith(pattern)] +# tags = [tag.name for tag in repo.tags] +# # Comprobar si se han obtenido tags correctamente +# if tags: +# print("Tags encontrados:", tags) +# else: +# print("No se encontraron tags con el patrón especificado.") + +# return tags +# except Exception as e: +# print("Error al obtener los tags:", str(e)) +# return [] + +# def get_password(stdscr, y, x, prompt): +# stdscr.addstr(y, x, prompt, curses.color_pair(1)) +# password = "" +# while True: +# key = stdscr.getch() +# if key == curses.KEY_BACKSPACE or key == 127: # Manejar borrado +# if len(password) > 0: +# password = password[:-1] +# y, x = stdscr.getyx() +# stdscr.delch(y, x - 1) # Borra el último asterisco +# elif key == ord("\n"): # Confirmar con Enter +# break +# elif 32 <= key <= 126: # Rango de caracteres imprimibles +# password += chr(key) +# stdscr.addch("*") # Muestra un asterisco por cada carácter ingresado +# return password + + +# def main(stdscr): +# # Inicializar colores +# curses.start_color() +# curses.init_pair(1, curses.COLOR_WHITE, curses.COLOR_BLUE) # Texto blanco sobre fondo azul +# stdscr.bkgd(' ', curses.color_pair(1)) # Aplicar fondo azul a la pantalla + +# curses.curs_set(0) # Ocultar el cursor en el menú de selección +# stdscr.clear() + +# # Paso 1: Seleccionar componentes +# components = ["ogCore", "ogGui", "ogDhcp", "ogBoot", "ogRepository"] +# selected_components = [] +# current_index = 0 # Índice para saber en qué componente está el cursor + +# # Mostrar instrucciones y opciones de componentes +# stdscr.addstr(1, 2, "Selecciona los componentes (usa Flechas para navegar, Espacio para seleccionar, Enter para continuar):", curses.color_pair(1) | curses.A_BOLD) + + +# while True: +# # Mostrar el estado actual de selección de cada componente +# for idx, comp in enumerate(components): +# if comp in selected_components: +# stdscr.addstr(idx + 3, 4, f"[X] {comp}", curses.color_pair(1)) +# else: +# stdscr.addstr(idx + 3, 4, f"[ ] {comp}", curses.color_pair(1)) + +# # Mueve el cursor visualmente para resaltar la selección actual +# stdscr.addstr(current_index + 3, 4, f"> {components[current_index]}", curses.color_pair(1)) + +# key = stdscr.getch() + +# if key == curses.KEY_UP and current_index > 0: # Navegar hacia arriba +# current_index -= 1 +# elif key == curses.KEY_DOWN and current_index < len(components) - 1: # Navegar hacia abajo +# current_index += 1 +# elif key == ord(" "): # Marcar/desmarcar con espacio +# component = components[current_index] +# if component in selected_components: +# selected_components.remove(component) +# else: +# selected_components.append(component) +# elif key == ord("\n"): # Confirma la selección con Enter +# break + +# stdscr.refresh() + +# # Menu de selección de releases +# tags = get_git_tags() +# tag_index = 0 + +# stdscr.clear() + +# while True: +# for idx, tag in enumerate(tags): +# if idx == tag_index: +# stdscr.addstr(idx + 3, 4, f"> {tag}", curses.color_pair(1)) +# else: +# stdscr.addstr(idx + 3, 4, f" {tag}", curses.color_pair(1)) + +# key = stdscr.getch() + +# if key == curses.KEY_UP and tag_index > 0: # Navegar hacia arriba +# tag_index -= 1 +# elif key == curses.KEY_DOWN and tag_index < len(tags) - 1: # Navegar hacia abajo +# tag_index += 1 +# elif key == ord("\n"): # Confirma la selección con Enter +# break + +# stdscr.refresh() + + + +# # Ahora pasamos a la configuración específica de cada componente seleccionado +# curses.echo() # Activar eco para mostrar la entrada +# for component in selected_components: +# stdscr.clear() +# stdscr.addstr(1, 2, f"Configuración para {component}:", curses.color_pair(1) | curses.A_BOLD) +# curses.curs_set(1) # Mostrar el cursor para las entradas de configuración + +# config_data = {} +# if component == "ogCore": +# stdscr.addstr(3, 4, "Usuario administrador (ogadmin): ", curses.color_pair(1)) +# user = stdscr.getstr(3, 26, 20).decode("utf-8") or "ogadmin" +# stdscr.addstr(4, 4, "Contraseña (12345678): ", curses.color_pair(1)) +# password = get_password(stdscr, 4, 4, "Contraseña (por defecto 'password'): ") or "password" +# config_data = {"username": user, "password": password, "container_version": tags[tag_index]} + +# elif component == "ogGui": +# stdscr.addstr(3, 4, "IP del servidor de ogCore: ", curses.color_pair(1)) +# ogcore_ip = stdscr.getstr(3, 32, 20).decode("utf-8") +# config_data = {"ogcore_ip": ogcore_ip, "container_version": tags[tag_index]} + +# elif component == "ogDhcp": +# stdscr.addstr(3, 4, "Configuración IP servidor de Boot: ", curses.color_pair(1)) +# ogbootIP = stdscr.getstr(3, 37, 20).decode("utf-8") +# stdscr.addstr(3, 4, "Configuración IP servidor de DHCP: ", curses.color_pair(1)) +# ogdhcpIP = stdscr.getstr(3, 37, 20).decode("utf-8") +# stdscr.addstr(4, 4, "Interfaces Boot (eth0,eth1): ", curses.color_pair(1)) +# interfaces = stdscr.getstr(4, 40, 20).decode("utf-8") or "eth0,eth1" +# json_array_interfaces = interfaces.split(",") +# stdscr.addstr(4, 4, "Directorio de ogdhcp (/opt/opengnsys/ogdhcp): ", curses.color_pair(1)) +# ogdhcp_dir = stdscr.getstr(5, 4, 20).decode("utf-8") or "/opt/opengnsys/ogdhcp" +# config_data = {"ogbootIP": ogbootIP, "ogDhcpIP": ogdhcpIP, "ogDhcp_Dir": ogdhcp_dir , "interfaces": json_array_interfaces , "relase": tags[tag_index]} + +# elif component == "ogBoot": +# stdscr.addstr(3, 4, "ogCore Ip Server: ", curses.color_pair(1)) +# ogcore_ip = stdscr.getstr(3, 28, 20).decode("utf-8") +# stdscr.addstr(4, 4, "ogBoot Server IP: ", curses.color_pair(1)) +# ogboot_server_ip = stdscr.getstr(4, 28, 20).decode("utf-8") +# stdscr.addstr(5, 4, "ogCore Dir (/opt/opengnsys/ogcore): ", curses.color_pair(1)) +# ogcore_dir = stdscr.getstr(5, 28, 20).decode("utf-8") or "/opt/opengnsys/ogcore" +# stdscr.addstr(6, 4, "ogLive por defecto (https://ognproject.evlt.uma.es/oglive//ogLive-noble-6.8.0-31-generic-amd64-r20241024.8100be23_20241112.iso): ", curses.color_pair(1)) +# ogLive_default = stdscr.getstr(6, 28, 20).decode("utf-8") or "https://ognproject.evlt.uma.es/oglive//ogLive-noble-6.8.0-31-generic-amd64-r20241024.8100be23_20241112.iso" +# stdscr.addstr(7, 4, "ogBoot Samba User (opengnsys):", curses.color_pair(1)) +# ogboot_samba_user = stdscr.getstr(7, 28, 20).decode("utf-8") or "opengnsys" +# stdscr.addstr(8, 4, "ogBoot Samba Pass (og):", curses.color_pair(1)) +# ogboot_samba_pass = get_password(stdscr, 4, 4, "Contraseña (por defecto 'password'): ") or "og" + +# config_data = { +# "ogCore_ServerIP": ogcore_ip, +# "ogBoot_ServerIP": ogboot_server_ip, +# "ogBoot_Dir": ogcore_dir, +# "ogLive_Default": ogLive_default, +# "ogBootSambaUser": ogboot_samba_user, +# "ogBootSambaPass": ogboot_samba_pass, +# "release": tags[tag_index] +# } + +# elif component == "ogRepository": +# stdscr.addstr(3, 4, "ogRepository IP Server: ", curses.color_pair(1)) +# ogrepository_ip = stdscr.getstr(3, 28, 20).decode("utf-8") +# stdscr.addstr(4, 4, "ogRepository Sambauser (opengnsys): ", curses.color_pair(1)) +# ogrepository_samba_user = stdscr.getstr(4, 28, 20).decode("utf-8") or "opengnsys" +# stdscr.addstr(5, 4, "ogRepository Sambapass (og): ", curses.color_pair(1)) +# ogrepository_samba_pass = get_password(stdscr, 5, 4, "Contraseña (por defecto 'password'): ") or "og" + +# config_data = { +# "ogrepository_ip": ogrepository_ip, +# "ogrepository_samba_user": ogrepository_samba_user, +# "ogrepository_samba_pass": ogrepository_samba_pass, +# "release": tags[tag_index] +# } +# # Guardar en archivo JSON +# config_file = os.path.join(CONFIGS_DIR, f"config_{component}.json") +# with open(config_file, "w") as f: +# json.dump(config_data, f) +# stdscr.clear() +# stdscr.addstr(2, 2, f"Configuración de {component} guardada en {config_file}", curses.color_pair(1)) +# stdscr.refresh() +# stdscr.getch() + +# curses.noecho() # Desactivar el eco después de la entrada + +# curses.wrapper(main) + + import curses import json import os from git import Repo - CONFIGS_DIR = "/tmp/oginstall" os.makedirs(CONFIGS_DIR, exist_ok=True) + +# Uso ogCore para obtener ellistado de tags REPO_URL = "https://ognproject.evlt.uma.es/gitea/opengnsys/ogcore.git" def get_git_tags(): @@ -14,15 +224,12 @@ def get_git_tags(): repo_path = os.path.join(CONFIGS_DIR, "opengnsys_repo") if not os.path.exists(repo_path): print("Clonando el repositorio...") - Repo.clone_from(REPO_URL, repo_path) # Clona el repositorio si no existe + Repo.clone_from(REPO_URL, repo_path) else: print("Usando repositorio existente en", repo_path) repo = Repo(repo_path) - # pattern = "opengnsys" - # tags = [tag.name for tag in repo.tags if tag.name.startswith(pattern)] tags = [tag.name for tag in repo.tags] - # Comprobar si se han obtenido tags correctamente if tags: print("Tags encontrados:", tags) else: @@ -33,49 +240,99 @@ def get_git_tags(): print("Error al obtener los tags:", str(e)) return [] +def get_password(stdscr, y, x, prompt, default=""): + stdscr.addstr(y, x, prompt, curses.color_pair(1)) + password = "" + masked_password = "" + + # Mostrar prompt sin enmascarar el valor predeterminado hasta que el usuario comience a escribir + stdscr.move(y, x + len(prompt)) # Coloca el cursor después del prompt + + while True: + key = stdscr.getch() + if key in (curses.KEY_BACKSPACE, 127): # Maneja el retroceso + if len(password) > 0: + password = password[:-1] + masked_password = "*" * len(password) + stdscr.move(y, x + len(prompt)) # Mueve el cursor después del prompt + stdscr.addstr(y, x + len(prompt), " " * (len(masked_password) + 1)) # Borra la línea + stdscr.addstr(y, x + len(prompt), masked_password) # Vuelve a mostrar los asteriscos actualizados + elif key == ord("\n"): # Confirmar con Enter + if not password and default: # Si el usuario no ingresó nada, usa el valor predeterminado + password = default + break + elif 32 <= key <= 126: # Rango de caracteres imprimibles + password += chr(key) + masked_password = "*" * len(password) + stdscr.addstr(y, x + len(prompt), masked_password) # Muestra asteriscos + + return password + +def get_input(stdscr, y, x, prompt, default=""): + stdscr.addstr(y, x, prompt, curses.color_pair(1)) + input_text = "" + prompt_end_x = x + len(prompt) # Calcula la posición final del prompt + stdscr.move(y, prompt_end_x) # Coloca el cursor después del prompt + + while True: + key = stdscr.getch() + if key in (curses.KEY_BACKSPACE, 127): # Maneja el retroceso + if len(input_text) > 0: + input_text = input_text[:-1] + stdscr.move(y, prompt_end_x) # Mueve el cursor después del prompt + stdscr.clrtoeol() # Limpia la línea desde la posición actual hacia el final + stdscr.addstr(y, prompt_end_x, input_text) # Vuelve a mostrar el texto actualizado + stdscr.move(y, prompt_end_x + len(input_text)) + elif key == ord("\n"): # Confirmar con Enter + if not input_text and default: # Usa el valor predeterminado si está vacío + input_text = default + break + elif 32 <= key <= 126: # Rango de caracteres imprimibles + input_text += chr(key) + stdscr.addstr(y, prompt_end_x, input_text) # Muestra el texto actualizado + stdscr.move(y, prompt_end_x + len(input_text)) # Mueve el cursor al final del texto + + return input_text + def main(stdscr): # Inicializar colores curses.start_color() - curses.init_pair(1, curses.COLOR_WHITE, curses.COLOR_BLUE) # Texto blanco sobre fondo azul - stdscr.bkgd(' ', curses.color_pair(1)) # Aplicar fondo azul a la pantalla + curses.init_pair(1, curses.COLOR_WHITE, curses.COLOR_BLUE) + stdscr.bkgd(' ', curses.color_pair(1)) - curses.curs_set(0) # Ocultar el cursor en el menú de selección + curses.curs_set(0) stdscr.clear() # Paso 1: Seleccionar componentes components = ["ogCore", "ogGui", "ogDhcp", "ogBoot", "ogRepository"] selected_components = [] - current_index = 0 # Índice para saber en qué componente está el cursor + current_index = 0 # Mostrar instrucciones y opciones de componentes stdscr.addstr(1, 2, "Selecciona los componentes (usa Flechas para navegar, Espacio para seleccionar, Enter para continuar):", curses.color_pair(1) | curses.A_BOLD) - while True: - # Mostrar el estado actual de selección de cada componente for idx, comp in enumerate(components): if comp in selected_components: stdscr.addstr(idx + 3, 4, f"[X] {comp}", curses.color_pair(1)) else: stdscr.addstr(idx + 3, 4, f"[ ] {comp}", curses.color_pair(1)) - - # Mueve el cursor visualmente para resaltar la selección actual stdscr.addstr(current_index + 3, 4, f"> {components[current_index]}", curses.color_pair(1)) key = stdscr.getch() - if key == curses.KEY_UP and current_index > 0: # Navegar hacia arriba + if key == curses.KEY_UP and current_index > 0: current_index -= 1 - elif key == curses.KEY_DOWN and current_index < len(components) - 1: # Navegar hacia abajo + elif key == curses.KEY_DOWN and current_index < len(components) - 1: current_index += 1 - elif key == ord(" "): # Marcar/desmarcar con espacio + elif key == ord(" "): component = components[current_index] if component in selected_components: selected_components.remove(component) else: selected_components.append(component) - elif key == ord("\n"): # Confirma la selección con Enter + elif key == ord("\n"): break stdscr.refresh() @@ -83,9 +340,9 @@ def main(stdscr): # Menu de selección de releases tags = get_git_tags() tag_index = 0 - + stdscr.clear() - + while True: for idx, tag in enumerate(tags): if idx == tag_index: @@ -95,82 +352,68 @@ def main(stdscr): key = stdscr.getch() - if key == curses.KEY_UP and tag_index > 0: # Navegar hacia arriba + if key == curses.KEY_UP and tag_index > 0: tag_index -= 1 - elif key == curses.KEY_DOWN and tag_index < len(tags) - 1: # Navegar hacia abajo + elif key == curses.KEY_DOWN and tag_index < len(tags) - 1: tag_index += 1 - elif key == ord("\n"): # Confirma la selección con Enter + elif key == ord("\n"): break - stdscr.refresh() - - + stdscr.refresh() - # Ahora pasamos a la configuración específica de cada componente seleccionado - curses.echo() # Activar eco para mostrar la entrada + # Configuración específica de cada componente seleccionado + curses.echo() for component in selected_components: stdscr.clear() stdscr.addstr(1, 2, f"Configuración para {component}:", curses.color_pair(1) | curses.A_BOLD) - curses.curs_set(1) # Mostrar el cursor para las entradas de configuración + curses.curs_set(1) config_data = {} if component == "ogCore": - stdscr.addstr(3, 4, "Usuario administrador:", curses.color_pair(1)) - user = stdscr.getstr(3, 26, 20).decode("utf-8") - stdscr.addstr(4, 4, "Contraseña:", curses.color_pair(1)) - password = stdscr.getstr(4, 26, 20).decode("utf-8") + user = get_input(stdscr, 3, 0, "Usuario administrador (ogadmin): ", "ogadmin") + password = get_password(stdscr, 4, 0, "Contraseña (por defecto '12345678'): ", "12345678") config_data = {"username": user, "password": password, "container_version": tags[tag_index]} elif component == "ogGui": - stdscr.addstr(3, 4, "IP del servidor de ogCore:", curses.color_pair(1)) - ogcore_ip = stdscr.getstr(3, 32, 20).decode("utf-8") + ogcore_ip = get_input(stdscr, 3, 0, "IP del servidor de ogCore (127.0.0.1): " , "127.0.0.1") config_data = {"ogcore_ip": ogcore_ip, "container_version": tags[tag_index]} elif component == "ogDhcp": - stdscr.addstr(3, 4, "Configuración IP servidor de Boot:", curses.color_pair(1)) - ogbootIP = stdscr.getstr(3, 37, 20).decode("utf-8") - stdscr.addstr(4, 4, "Interfaces Boot (separadas por coma):", curses.color_pair(1)) - interfaces = stdscr.getstr(4, 40, 20).decode("utf-8") + ogbootIP = get_input(stdscr, 3, 0, "IP servidor de Boot (127.0.0.1): ", "127.0.0.1") + ogdhcpIP = get_input(stdscr, 4, 0, "IP servidor de DHCP (127.0.0.1): ", "127.0.0.1") + ogdhcpDir = get_input(stdscr, 5, 0, "Directorio de ogdhcp (/opt/opengnsys/ogdhcp): ", "/opt/opengnsys/ogdhcp") + interfaces = get_input(stdscr, 6, 0, "Interfaces Boot (eth0,eth1): ", "eth0,eth1") json_array_interfaces = interfaces.split(",") - config_data = {"ogbootIP": ogbootIP, "interfaces": json_array_interfaces , "relase": tags[tag_index]} + config_data = {"ogbootIP": ogbootIP, "ogDhcpIP": ogdhcpIP , "ogDhcp_Dir" : ogdhcpDir , "interfaces": json_array_interfaces, "release": tags[tag_index]} elif component == "ogBoot": - stdscr.addstr(3, 4, "ogCore Ip Server:", curses.color_pair(1)) - ogcore_ip = stdscr.getstr(3, 28, 20).decode("utf-8") - stdscr.addstr(4, 4, "ogCore Server:", curses.color_pair(1)) - ogcore_server = stdscr.getstr(4, 28, 20).decode("utf-8") - stdscr.addstr(5, 4, "ogCore Dir:", curses.color_pair(1)) - ogcore_dir = stdscr.getstr(5, 28, 20).decode("utf-8") - stdscr.addstr(6, 4, "ogBoot GitRepo:", curses.color_pair(1)) - ogboot_gitrepo = stdscr.getstr(6, 28, 20).decode("utf-8") - stdscr.addstr(7, 4, "ogBoot Samba User:", curses.color_pair(1)) - ogboot_samba_user = stdscr.getstr(7, 28, 20).decode("utf-8") - stdscr.addstr(8, 4, "ogBoot Samba Pass:", curses.color_pair(1)) - ogboot_samba_pass = stdscr.getstr(8, 28, 20).decode("utf-8") - + ogcore_ip = get_input(stdscr, 3, 0, "ogCore Ip Server: ", "") + ogboot_server_ip = get_input(stdscr, 4, 0, "ogBoot Server IP: ", "") + ogcore_dir = get_input(stdscr, 5, 0, "ogCore Dir (/opt/opengnsys/ogcore): ", "/opt/opengnsys/ogcore") + ogLive_default = get_input(stdscr, 6, 0, "ogLive por defecto (https://ognproject.evlt.uma.es/oglive//ogLive-noble-6.8.0-31-generic-amd64-r20241024.8100be23_20241112.iso): ", "https://ognproject.evlt.uma.es/oglive//ogLive-noble-6.8.0-31-generic-amd64-r20241024.8100be23_20241112.iso") + ogboot_samba_user = get_input(stdscr, 7, 0, "ogBoot Samba User (opengnsys): ", "opengnsys") + ogboot_samba_pass = get_password(stdscr, 8, 0, "ogBoot Samba Pass (og): ", "og") config_data = { - "ogcore_ip": ogcore_ip, - "ogcore_server": ogcore_server, - "ogcore_dir": ogcore_dir, - "ogboot_gitrepo": ogboot_gitrepo, - "ogboot_samba_user": ogboot_samba_user, - "ogboot_samba_pass": ogboot_samba_pass, + "ogCore_ServerIP": ogcore_ip, + "ogBoot_ServerIP": ogboot_server_ip, + "ogBoot_Dir": ogcore_dir, + "ogLive_Default": ogLive_default, + "ogBootSambaUser": ogboot_samba_user, + "ogBootSambaPass": ogboot_samba_pass, "release": tags[tag_index] } + elif component == "ogRepository": - stdscr.addstr(3, 4, "ogRepository IP Server: ", curses.color_pair(1)) - ogrepository_ip = stdscr.getstr(3, 28, 20).decode("utf-8") - stdscr.addstr(4, 4, "ogRepository Sambauser: ", curses.color_pair(1)) - ogrepository_samba_user = stdscr.getstr(4, 28, 20).decode("utf-8") - stdscr.addstr(5, 4, "ogRepository Sambapass: ", curses.color_pair(1)) - ogrepository_samba_pass = stdscr.getstr(5, 28, 20).decode("utf-8") - + ogrepository_ip = get_input(stdscr, 3, 0, "ogRepository IP Server (127.0.0.1): ", "") + ogrepository_samba_user = get_input(stdscr, 4, 0, "ogRepository Sambauser (opengnsys): ", "opengnsys") + ogrepository_samba_pass = get_password(stdscr, 5, 0, "ogRepository Sambapass (og): ", "og") config_data = { "ogrepository_ip": ogrepository_ip, "ogrepository_samba_user": ogrepository_samba_user, "ogrepository_samba_pass": ogrepository_samba_pass, "release": tags[tag_index] } + # Guardar en archivo JSON config_file = os.path.join(CONFIGS_DIR, f"config_{component}.json") with open(config_file, "w") as f: From a1cf2b59dd7540ca9dbc345210ad67200c0a8de0 Mon Sep 17 00:00:00 2001 From: Nicolas Arenas Date: Thu, 14 Nov 2024 08:41:09 +0100 Subject: [PATCH 15/47] Calling rest of installers --- component-installer/component-installer.sh | 16 ++- component-installer/provision_ogrepository.sh | 102 ++++++++++++++++++ 2 files changed, 117 insertions(+), 1 deletion(-) create mode 100644 component-installer/provision_ogrepository.sh diff --git a/component-installer/component-installer.sh b/component-installer/component-installer.sh index 42a294b..8d8f9da 100644 --- a/component-installer/component-installer.sh +++ b/component-installer/component-installer.sh @@ -142,16 +142,30 @@ do ogDhcp) echo "Instalando ogDhcp..." git_checkout_release "$OGDHCP_REPO" "$component_dir/repo" "$OGCORE_BRANCH" + cp $CONFIGS_DIR/$config_file $component_dir/repo/config_ogdhcp.json + cd $component_dir/repo/installer || exit + chmod 755 ogdhcp_installer.sh + ./ogdhcp_installer.sh + cd - || exit echo - ogDhcp >> /etc/issue ;; ogBoot) echo "Instalando ogBoot..." git_checkout_release "$OGBOOT_REPO" "$component_dir/repo" "$OGCORE_BRANCH" + cp $CONFIGS_DIR/$config_file $component_dir/repo/config.json + apt install -y python3 git vim + cd $component_dir/repo/installer || exit + python3 ogboot_installer.py + cd - || exit echo - ogBoot >> /etc/issue ;; ogRepository) echo "Instalando ogRepository..." - git_checkout_release "$OGREPOSITORY_REPO" "$component_dir/repo" "$OGCORE_BRANCH" + cp $CONFIGS_DIR/$config_file $component_dir/installer/config.json + REPO_IP=$(jq -r '.ogrepository_ip' $component_dir/installer/config.json) + OGUSER=$(jq -r '.ogrepository_samba_user' $component_dir/installer/config.json) + OGPASS=$(jq -r '.ogrepository_samba_pass' $component_dir/installer/config.json) + provision_ogrepository.sh $REPO_IP $OGUSER $OGPASS $component_dir/repo echo - ogRepository >> /etc/issue ;; *) diff --git a/component-installer/provision_ogrepository.sh b/component-installer/provision_ogrepository.sh new file mode 100644 index 0000000..0b7b049 --- /dev/null +++ b/component-installer/provision_ogrepository.sh @@ -0,0 +1,102 @@ +#!/bin/bash + +set -e + + +REPO_IP=${1:-"127.0.0.1"} +OGUSER=${2:-"opengnsys"} +OGPASS=${3:-"og"} +INSTALL_DIR=/opt/opengnsys/ogrepository +DOWNLOAD_DIR=${4:-"/tmp/ogrepository"} +DEBIAN_FRONTEND=noninteractive +export DEBIAN_FRONTEND +export GIT_SSL_NO_VERIFY + + +check_root() { + if [ "$(id -u)" != "0" ]; then + echo "This script must be run as root" 1>&2 + exit 1 + fi +} + +install_uftp() { + apt install uftp -y + systemctl stop uftp + systemctl disable uftp +} + +install_updcast () { + apt install $DOWNLOAD_DIR/packets/udpcast_20230924_amd64.deb +} + +add_user_ogrepository() { + if ! id "$OGUSER" &>/dev/null; then + echo "User ogrepository does not exist, creating it" + useradd -r -s /bin/bash $OGUSER + fi + if [ ! -f /etc/sudoers.d/$OGUSER ]; then + echo "User $OGUSER does not have sudo permissions, adding it" + echo "$OGUSER ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/"$OGUSER" + fi + +} + +create_directories() { + mkdir -p $INSTALL_DIR + mkdir -p $INSTALL_DIR/images $INSTALL_DIR/images_trash/ $INSTALL_DIR/bin/ $INSTALL_DIR/etc/ $INSTALL_DIR/log/ $INSTALL_DIR/api/ + chown -R $OGUSER:$OGUSER $INSTALL_DIR +} + +install_dependencies() { + apt update -y + apt install -y git python3 python3-pip python3-flask python3-paramiko python3-psutil python3-flasgger debian-archive-keyring samba gunicorn wakeonlan +} + +install_ext_repo() { + cp $DOWNLOAD_DIR/installer/files/ctorrent.sources /etc/apt/sources.list.d/ctorrent.sources + apt update -y +} + +install_external_packages() { + apt install -y bittorrent bittornado ctorrent +} + +install_ogrepo-api_service() { + cp -r $DOWNLOAD_DIR/installer/files/ogrepo-api.service /etc/systemd/system/ogrepo-api.service + sed -i "s/%%OGREPOSITORY_USER%%/$OGUSER/g" /etc/systemd/system/ogrepo-api.service + systemctl enable --now ogrepo-api +} + +install_files() { + cp -pr $DOWNLOAD_DIR/bin/* $INSTALL_DIR/bin/ + cp -pr $DOWNLOAD_DIR/etc/* $INSTALL_DIR/etc/ + cp -pr $DOWNLOAD_DIR/api/* $INSTALL_DIR/api/ + chown -R $OGUSER:$OGUSER $INSTALL_DIR + chmod 755 $INSTALL_DIR/bin/* + echo IPlocal="$REPO_IP" > $INSTALL_DIR/etc/ogAdmRepo.cfg + sudo chown $OGUSER:$OGUSER $INSTALL_DIR/etc/ogAdmRepo.cfg +} + +configure_samba() { + echo "include = /etc/samba/smb.conf.ogrepository" >> /etc/samba/smb.conf + cp $DOWNLOAD_DIR/installer/files/ogrepo-smb.conf /etc/samba/smb.conf.ogrepository + sed -i "s/%%OGREPOSITORY_USER%%/$OGUSER/g" /etc/samba/smb.conf.ogrepository + systemctl restart smbd + # Create default user ogrepository + (echo $OGPASS; echo $OGPASS) | smbpasswd -s -a $OGUSER + +} + +## Main program + +install_dependencies +add_user_ogrepository +install_ext_repo +install_external_packages +install_uftp +install_updcast +create_directories +install_files +install_ogrepo-api_service +configure_samba From 278564d35f6fc22b50579f88126d9553d69c05e5 Mon Sep 17 00:00:00 2001 From: Nicolas Arenas Date: Thu, 14 Nov 2024 08:58:08 +0100 Subject: [PATCH 16/47] shorting oglive image --- python-installer/oginstaller.py | 213 +------------------------------- 1 file changed, 2 insertions(+), 211 deletions(-) diff --git a/python-installer/oginstaller.py b/python-installer/oginstaller.py index 10c9730..7494e80 100755 --- a/python-installer/oginstaller.py +++ b/python-installer/oginstaller.py @@ -1,212 +1,3 @@ -# import curses -# import json -# import os -# from git import Repo - - -# CONFIGS_DIR = "/tmp/oginstall" -# os.makedirs(CONFIGS_DIR, exist_ok=True) - -# REPO_URL = "https://ognproject.evlt.uma.es/gitea/opengnsys/ogcore.git" - -# def get_git_tags(): -# try: -# repo_path = os.path.join(CONFIGS_DIR, "opengnsys_repo") -# if not os.path.exists(repo_path): -# print("Clonando el repositorio...") -# Repo.clone_from(REPO_URL, repo_path) # Clona el repositorio si no existe -# else: -# print("Usando repositorio existente en", repo_path) - -# repo = Repo(repo_path) -# # pattern = "opengnsys" -# # tags = [tag.name for tag in repo.tags if tag.name.startswith(pattern)] -# tags = [tag.name for tag in repo.tags] -# # Comprobar si se han obtenido tags correctamente -# if tags: -# print("Tags encontrados:", tags) -# else: -# print("No se encontraron tags con el patrón especificado.") - -# return tags -# except Exception as e: -# print("Error al obtener los tags:", str(e)) -# return [] - -# def get_password(stdscr, y, x, prompt): -# stdscr.addstr(y, x, prompt, curses.color_pair(1)) -# password = "" -# while True: -# key = stdscr.getch() -# if key == curses.KEY_BACKSPACE or key == 127: # Manejar borrado -# if len(password) > 0: -# password = password[:-1] -# y, x = stdscr.getyx() -# stdscr.delch(y, x - 1) # Borra el último asterisco -# elif key == ord("\n"): # Confirmar con Enter -# break -# elif 32 <= key <= 126: # Rango de caracteres imprimibles -# password += chr(key) -# stdscr.addch("*") # Muestra un asterisco por cada carácter ingresado -# return password - - -# def main(stdscr): -# # Inicializar colores -# curses.start_color() -# curses.init_pair(1, curses.COLOR_WHITE, curses.COLOR_BLUE) # Texto blanco sobre fondo azul -# stdscr.bkgd(' ', curses.color_pair(1)) # Aplicar fondo azul a la pantalla - -# curses.curs_set(0) # Ocultar el cursor en el menú de selección -# stdscr.clear() - -# # Paso 1: Seleccionar componentes -# components = ["ogCore", "ogGui", "ogDhcp", "ogBoot", "ogRepository"] -# selected_components = [] -# current_index = 0 # Índice para saber en qué componente está el cursor - -# # Mostrar instrucciones y opciones de componentes -# stdscr.addstr(1, 2, "Selecciona los componentes (usa Flechas para navegar, Espacio para seleccionar, Enter para continuar):", curses.color_pair(1) | curses.A_BOLD) - - -# while True: -# # Mostrar el estado actual de selección de cada componente -# for idx, comp in enumerate(components): -# if comp in selected_components: -# stdscr.addstr(idx + 3, 4, f"[X] {comp}", curses.color_pair(1)) -# else: -# stdscr.addstr(idx + 3, 4, f"[ ] {comp}", curses.color_pair(1)) - -# # Mueve el cursor visualmente para resaltar la selección actual -# stdscr.addstr(current_index + 3, 4, f"> {components[current_index]}", curses.color_pair(1)) - -# key = stdscr.getch() - -# if key == curses.KEY_UP and current_index > 0: # Navegar hacia arriba -# current_index -= 1 -# elif key == curses.KEY_DOWN and current_index < len(components) - 1: # Navegar hacia abajo -# current_index += 1 -# elif key == ord(" "): # Marcar/desmarcar con espacio -# component = components[current_index] -# if component in selected_components: -# selected_components.remove(component) -# else: -# selected_components.append(component) -# elif key == ord("\n"): # Confirma la selección con Enter -# break - -# stdscr.refresh() - -# # Menu de selección de releases -# tags = get_git_tags() -# tag_index = 0 - -# stdscr.clear() - -# while True: -# for idx, tag in enumerate(tags): -# if idx == tag_index: -# stdscr.addstr(idx + 3, 4, f"> {tag}", curses.color_pair(1)) -# else: -# stdscr.addstr(idx + 3, 4, f" {tag}", curses.color_pair(1)) - -# key = stdscr.getch() - -# if key == curses.KEY_UP and tag_index > 0: # Navegar hacia arriba -# tag_index -= 1 -# elif key == curses.KEY_DOWN and tag_index < len(tags) - 1: # Navegar hacia abajo -# tag_index += 1 -# elif key == ord("\n"): # Confirma la selección con Enter -# break - -# stdscr.refresh() - - - -# # Ahora pasamos a la configuración específica de cada componente seleccionado -# curses.echo() # Activar eco para mostrar la entrada -# for component in selected_components: -# stdscr.clear() -# stdscr.addstr(1, 2, f"Configuración para {component}:", curses.color_pair(1) | curses.A_BOLD) -# curses.curs_set(1) # Mostrar el cursor para las entradas de configuración - -# config_data = {} -# if component == "ogCore": -# stdscr.addstr(3, 4, "Usuario administrador (ogadmin): ", curses.color_pair(1)) -# user = stdscr.getstr(3, 26, 20).decode("utf-8") or "ogadmin" -# stdscr.addstr(4, 4, "Contraseña (12345678): ", curses.color_pair(1)) -# password = get_password(stdscr, 4, 4, "Contraseña (por defecto 'password'): ") or "password" -# config_data = {"username": user, "password": password, "container_version": tags[tag_index]} - -# elif component == "ogGui": -# stdscr.addstr(3, 4, "IP del servidor de ogCore: ", curses.color_pair(1)) -# ogcore_ip = stdscr.getstr(3, 32, 20).decode("utf-8") -# config_data = {"ogcore_ip": ogcore_ip, "container_version": tags[tag_index]} - -# elif component == "ogDhcp": -# stdscr.addstr(3, 4, "Configuración IP servidor de Boot: ", curses.color_pair(1)) -# ogbootIP = stdscr.getstr(3, 37, 20).decode("utf-8") -# stdscr.addstr(3, 4, "Configuración IP servidor de DHCP: ", curses.color_pair(1)) -# ogdhcpIP = stdscr.getstr(3, 37, 20).decode("utf-8") -# stdscr.addstr(4, 4, "Interfaces Boot (eth0,eth1): ", curses.color_pair(1)) -# interfaces = stdscr.getstr(4, 40, 20).decode("utf-8") or "eth0,eth1" -# json_array_interfaces = interfaces.split(",") -# stdscr.addstr(4, 4, "Directorio de ogdhcp (/opt/opengnsys/ogdhcp): ", curses.color_pair(1)) -# ogdhcp_dir = stdscr.getstr(5, 4, 20).decode("utf-8") or "/opt/opengnsys/ogdhcp" -# config_data = {"ogbootIP": ogbootIP, "ogDhcpIP": ogdhcpIP, "ogDhcp_Dir": ogdhcp_dir , "interfaces": json_array_interfaces , "relase": tags[tag_index]} - -# elif component == "ogBoot": -# stdscr.addstr(3, 4, "ogCore Ip Server: ", curses.color_pair(1)) -# ogcore_ip = stdscr.getstr(3, 28, 20).decode("utf-8") -# stdscr.addstr(4, 4, "ogBoot Server IP: ", curses.color_pair(1)) -# ogboot_server_ip = stdscr.getstr(4, 28, 20).decode("utf-8") -# stdscr.addstr(5, 4, "ogCore Dir (/opt/opengnsys/ogcore): ", curses.color_pair(1)) -# ogcore_dir = stdscr.getstr(5, 28, 20).decode("utf-8") or "/opt/opengnsys/ogcore" -# stdscr.addstr(6, 4, "ogLive por defecto (https://ognproject.evlt.uma.es/oglive//ogLive-noble-6.8.0-31-generic-amd64-r20241024.8100be23_20241112.iso): ", curses.color_pair(1)) -# ogLive_default = stdscr.getstr(6, 28, 20).decode("utf-8") or "https://ognproject.evlt.uma.es/oglive//ogLive-noble-6.8.0-31-generic-amd64-r20241024.8100be23_20241112.iso" -# stdscr.addstr(7, 4, "ogBoot Samba User (opengnsys):", curses.color_pair(1)) -# ogboot_samba_user = stdscr.getstr(7, 28, 20).decode("utf-8") or "opengnsys" -# stdscr.addstr(8, 4, "ogBoot Samba Pass (og):", curses.color_pair(1)) -# ogboot_samba_pass = get_password(stdscr, 4, 4, "Contraseña (por defecto 'password'): ") or "og" - -# config_data = { -# "ogCore_ServerIP": ogcore_ip, -# "ogBoot_ServerIP": ogboot_server_ip, -# "ogBoot_Dir": ogcore_dir, -# "ogLive_Default": ogLive_default, -# "ogBootSambaUser": ogboot_samba_user, -# "ogBootSambaPass": ogboot_samba_pass, -# "release": tags[tag_index] -# } - -# elif component == "ogRepository": -# stdscr.addstr(3, 4, "ogRepository IP Server: ", curses.color_pair(1)) -# ogrepository_ip = stdscr.getstr(3, 28, 20).decode("utf-8") -# stdscr.addstr(4, 4, "ogRepository Sambauser (opengnsys): ", curses.color_pair(1)) -# ogrepository_samba_user = stdscr.getstr(4, 28, 20).decode("utf-8") or "opengnsys" -# stdscr.addstr(5, 4, "ogRepository Sambapass (og): ", curses.color_pair(1)) -# ogrepository_samba_pass = get_password(stdscr, 5, 4, "Contraseña (por defecto 'password'): ") or "og" - -# config_data = { -# "ogrepository_ip": ogrepository_ip, -# "ogrepository_samba_user": ogrepository_samba_user, -# "ogrepository_samba_pass": ogrepository_samba_pass, -# "release": tags[tag_index] -# } -# # Guardar en archivo JSON -# config_file = os.path.join(CONFIGS_DIR, f"config_{component}.json") -# with open(config_file, "w") as f: -# json.dump(config_data, f) -# stdscr.clear() -# stdscr.addstr(2, 2, f"Configuración de {component} guardada en {config_file}", curses.color_pair(1)) -# stdscr.refresh() -# stdscr.getch() - -# curses.noecho() # Desactivar el eco después de la entrada - -# curses.wrapper(main) - - import curses import json import os @@ -390,14 +181,14 @@ def main(stdscr): ogcore_ip = get_input(stdscr, 3, 0, "ogCore Ip Server: ", "") ogboot_server_ip = get_input(stdscr, 4, 0, "ogBoot Server IP: ", "") ogcore_dir = get_input(stdscr, 5, 0, "ogCore Dir (/opt/opengnsys/ogcore): ", "/opt/opengnsys/ogcore") - ogLive_default = get_input(stdscr, 6, 0, "ogLive por defecto (https://ognproject.evlt.uma.es/oglive//ogLive-noble-6.8.0-31-generic-amd64-r20241024.8100be23_20241112.iso): ", "https://ognproject.evlt.uma.es/oglive//ogLive-noble-6.8.0-31-generic-amd64-r20241024.8100be23_20241112.iso") + ogLive_default = get_input(stdscr, 6, 0, "ogLive por defecto (ogLive-noble-6.8.0-31-generic-amd64-r20241024.8100be23_20241112): ", "ogLive-noble-6.8.0-31-generic-amd64-r20241024.8100be23_20241112") ogboot_samba_user = get_input(stdscr, 7, 0, "ogBoot Samba User (opengnsys): ", "opengnsys") ogboot_samba_pass = get_password(stdscr, 8, 0, "ogBoot Samba Pass (og): ", "og") config_data = { "ogCore_ServerIP": ogcore_ip, "ogBoot_ServerIP": ogboot_server_ip, "ogBoot_Dir": ogcore_dir, - "ogLive_Default": ogLive_default, + "ogLive_Default": "https://ognproject.evlt.uma.es/oglive/" + ogLive_default + ".iso", "ogBootSambaUser": ogboot_samba_user, "ogBootSambaPass": ogboot_samba_pass, "release": tags[tag_index] From e53fc605bb28a4cd62e90b22618ca269372dfe0c Mon Sep 17 00:00:00 2001 From: Nicolas Arenas Date: Thu, 14 Nov 2024 09:02:20 +0100 Subject: [PATCH 17/47] Mejorar la respuesta del script a diferentes eventos --- python-installer/oginstaller.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/python-installer/oginstaller.py b/python-installer/oginstaller.py index 7494e80..dc305bb 100755 --- a/python-installer/oginstaller.py +++ b/python-installer/oginstaller.py @@ -6,8 +6,6 @@ from git import Repo CONFIGS_DIR = "/tmp/oginstall" os.makedirs(CONFIGS_DIR, exist_ok=True) - -# Uso ogCore para obtener ellistado de tags REPO_URL = "https://ognproject.evlt.uma.es/gitea/opengnsys/ogcore.git" def get_git_tags(): @@ -36,7 +34,6 @@ def get_password(stdscr, y, x, prompt, default=""): password = "" masked_password = "" - # Mostrar prompt sin enmascarar el valor predeterminado hasta que el usuario comience a escribir stdscr.move(y, x + len(prompt)) # Coloca el cursor después del prompt while True: @@ -60,6 +57,10 @@ def get_password(stdscr, y, x, prompt, default=""): return password def get_input(stdscr, y, x, prompt, default=""): + max_y, max_x = stdscr.getmaxyx() + if x + len(prompt) >= max_x: + raise ValueError("El prompt es demasiado largo para caber en la pantalla.") + stdscr.addstr(y, x, prompt, curses.color_pair(1)) input_text = "" prompt_end_x = x + len(prompt) # Calcula la posición final del prompt @@ -79,13 +80,13 @@ def get_input(stdscr, y, x, prompt, default=""): input_text = default break elif 32 <= key <= 126: # Rango de caracteres imprimibles - input_text += chr(key) - stdscr.addstr(y, prompt_end_x, input_text) # Muestra el texto actualizado - stdscr.move(y, prompt_end_x + len(input_text)) # Mueve el cursor al final del texto + if prompt_end_x + len(input_text) < max_x - 1: + input_text += chr(key) + stdscr.addstr(y, prompt_end_x, input_text) # Muestra el texto actualizado + stdscr.move(y, prompt_end_x + len(input_text)) # Mueve el cursor al final del texto return input_text - def main(stdscr): # Inicializar colores curses.start_color() From 1b6535ffee73f01b52d588250c0c95fe25e895e2 Mon Sep 17 00:00:00 2001 From: Nicolas Arenas Date: Thu, 14 Nov 2024 09:22:49 +0100 Subject: [PATCH 18/47] Fix directory Get OGCORE BRANCH for components --- component-installer/component-installer.sh | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/component-installer/component-installer.sh b/component-installer/component-installer.sh index 8d8f9da..57ae6e3 100644 --- a/component-installer/component-installer.sh +++ b/component-installer/component-installer.sh @@ -139,8 +139,9 @@ do install_docker install_oggui_docker ;; - ogDhcp) + ogDhcp) echo "Instalando ogDhcp..." + OGCORE_BRANCH=$(jq -r '.release' /opt/opengnsys/ogDhcp/installer/config.json) git_checkout_release "$OGDHCP_REPO" "$component_dir/repo" "$OGCORE_BRANCH" cp $CONFIGS_DIR/$config_file $component_dir/repo/config_ogdhcp.json cd $component_dir/repo/installer || exit @@ -150,6 +151,7 @@ do echo - ogDhcp >> /etc/issue ;; ogBoot) + OGCORE_BRANCH=$(jq -r '.release' /opt/opengnsys/ogBoot/installer/config.json) echo "Instalando ogBoot..." git_checkout_release "$OGBOOT_REPO" "$component_dir/repo" "$OGCORE_BRANCH" cp $CONFIGS_DIR/$config_file $component_dir/repo/config.json @@ -161,6 +163,8 @@ do ;; ogRepository) echo "Instalando ogRepository..." + OGCORE_BRANCH=$(jq -r '.release' /opt/opengnsys/ogRepository/installer/config.json) + git_checkout_release "$OGREPOSITORY_REPO" "$component_dir/repo" "$OGCORE_BRANCH" cp $CONFIGS_DIR/$config_file $component_dir/installer/config.json REPO_IP=$(jq -r '.ogrepository_ip' $component_dir/installer/config.json) OGUSER=$(jq -r '.ogrepository_samba_user' $component_dir/installer/config.json) From bb379b7c68dd21cd51892d4a01fcbc75ae38602a Mon Sep 17 00:00:00 2001 From: Nicolas Arenas Date: Thu, 14 Nov 2024 09:56:34 +0100 Subject: [PATCH 19/47] Fix repo path --- component-installer/component-installer.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/component-installer/component-installer.sh b/component-installer/component-installer.sh index 57ae6e3..26b5242 100644 --- a/component-installer/component-installer.sh +++ b/component-installer/component-installer.sh @@ -143,7 +143,7 @@ do echo "Instalando ogDhcp..." OGCORE_BRANCH=$(jq -r '.release' /opt/opengnsys/ogDhcp/installer/config.json) git_checkout_release "$OGDHCP_REPO" "$component_dir/repo" "$OGCORE_BRANCH" - cp $CONFIGS_DIR/$config_file $component_dir/repo/config_ogdhcp.json + cp $CONFIGS_DIR/$config_file $component_dir/repo/installer/config_ogdhcp.json cd $component_dir/repo/installer || exit chmod 755 ogdhcp_installer.sh ./ogdhcp_installer.sh @@ -154,7 +154,7 @@ do OGCORE_BRANCH=$(jq -r '.release' /opt/opengnsys/ogBoot/installer/config.json) echo "Instalando ogBoot..." git_checkout_release "$OGBOOT_REPO" "$component_dir/repo" "$OGCORE_BRANCH" - cp $CONFIGS_DIR/$config_file $component_dir/repo/config.json + cp $CONFIGS_DIR/$config_file $component_dir/repo/installer/config.json apt install -y python3 git vim cd $component_dir/repo/installer || exit python3 ogboot_installer.py From 6acebd38a4b7a056dbf4480f847c7405fa1a3a93 Mon Sep 17 00:00:00 2001 From: Nicolas Arenas Date: Thu, 14 Nov 2024 10:56:44 +0100 Subject: [PATCH 20/47] Update path for ogrepository provision --- component-installer/component-installer.sh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/component-installer/component-installer.sh b/component-installer/component-installer.sh index 26b5242..eef96cd 100644 --- a/component-installer/component-installer.sh +++ b/component-installer/component-installer.sh @@ -169,7 +169,10 @@ do REPO_IP=$(jq -r '.ogrepository_ip' $component_dir/installer/config.json) OGUSER=$(jq -r '.ogrepository_samba_user' $component_dir/installer/config.json) OGPASS=$(jq -r '.ogrepository_samba_pass' $component_dir/installer/config.json) - provision_ogrepository.sh $REPO_IP $OGUSER $OGPASS $component_dir/repo + mkdir -p $component_dir/bin + cp $CONFIGS_DIR/provision_ogrepository.sh $component_dir/bin/ + chmod 755 $component_dir/bin/provision_ogrepository.sh + $component_dir/bin/$provision_ogrepository.sh $REPO_IP $OGUSER $OGPASS $component_dir/repo echo - ogRepository >> /etc/issue ;; *) From c5257913c0140d8b90e5f0351f8848e852e66141 Mon Sep 17 00:00:00 2001 From: Nicolas Arenas Date: Thu, 14 Nov 2024 12:10:25 +0100 Subject: [PATCH 21/47] Fix proble with ogrepository --- component-installer/component-installer.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/component-installer/component-installer.sh b/component-installer/component-installer.sh index eef96cd..5801164 100644 --- a/component-installer/component-installer.sh +++ b/component-installer/component-installer.sh @@ -172,7 +172,7 @@ do mkdir -p $component_dir/bin cp $CONFIGS_DIR/provision_ogrepository.sh $component_dir/bin/ chmod 755 $component_dir/bin/provision_ogrepository.sh - $component_dir/bin/$provision_ogrepository.sh $REPO_IP $OGUSER $OGPASS $component_dir/repo + $component_dir/bin/provision_ogrepository.sh $REPO_IP $OGUSER $OGPASS $component_dir/repo echo - ogRepository >> /etc/issue ;; *) From 3f496234172f894767326d9be29ac4253594b921 Mon Sep 17 00:00:00 2001 From: Nicolas Arenas Date: Thu, 14 Nov 2024 18:04:28 +0100 Subject: [PATCH 22/47] Making timeout start seconds higher --- component-installer/component-installer.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/component-installer/component-installer.sh b/component-installer/component-installer.sh index 5801164..874199a 100644 --- a/component-installer/component-installer.sh +++ b/component-installer/component-installer.sh @@ -10,7 +10,7 @@ CONFIGS_DIR=/tmp/oginstall # PAT_FILE=/opengnsys-installer/pat.txt # PAT=$(cat $PAT_FILE | tr -d '\n\r\t') -# OPENGNSYS_BASE_URL="https://$PAT@ognproject.evlt.uma.es/gitea/opengnsys" +# OPENGNSYS_BASE_URL="https://$PAT@ognproject.evlt.uma.es/gitea/opengnsys"ls OPENGNSYS_BASE_URL="https://ognproject.evlt.uma.es/gitea/opengnsys" OGBOOT_REPO="$OPENGNSYS_BASE_URL/ogboot.git" @@ -49,6 +49,7 @@ ExecStart=/usr/bin/docker compose -f /opt/opengnsys/ogCore/etc/docker-compose-de ExecStartPost=/opt/opengnsys/ogCore/bin/provision_ogcore.sh ExecStop=/usr/bin/docker compose -f /opt/opengnsys/ogCore/etc/docker-compose-deploy.yml stop Restart=always +timeoutStartSec=600 [Install] WantedBy=multi-user.target From 82effbb989ede78c867f61dd0e19b5df2aee3e3d Mon Sep 17 00:00:00 2001 From: Nicolas Arenas Date: Thu, 14 Nov 2024 18:09:25 +0100 Subject: [PATCH 23/47] Fix a couple of typos in messages and defaults --- python-installer/oginstaller.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python-installer/oginstaller.py b/python-installer/oginstaller.py index dc305bb..e1c03e1 100755 --- a/python-installer/oginstaller.py +++ b/python-installer/oginstaller.py @@ -167,7 +167,7 @@ def main(stdscr): config_data = {"username": user, "password": password, "container_version": tags[tag_index]} elif component == "ogGui": - ogcore_ip = get_input(stdscr, 3, 0, "IP del servidor de ogCore (127.0.0.1): " , "127.0.0.1") + ogcore_ip = get_input(stdscr, 3, 0, "URL Api OgCore (https://127.0.0.1:8443): " , "https://127.0.0.1:8443") config_data = {"ogcore_ip": ogcore_ip, "container_version": tags[tag_index]} elif component == "ogDhcp": @@ -181,7 +181,7 @@ def main(stdscr): elif component == "ogBoot": ogcore_ip = get_input(stdscr, 3, 0, "ogCore Ip Server: ", "") ogboot_server_ip = get_input(stdscr, 4, 0, "ogBoot Server IP: ", "") - ogcore_dir = get_input(stdscr, 5, 0, "ogCore Dir (/opt/opengnsys/ogcore): ", "/opt/opengnsys/ogcore") + ogcore_dir = get_input(stdscr, 5, 0, "ogCore Dir (/opt/opengnsys/ogboot): ", "/opt/opengnsys/ogboot") ogLive_default = get_input(stdscr, 6, 0, "ogLive por defecto (ogLive-noble-6.8.0-31-generic-amd64-r20241024.8100be23_20241112): ", "ogLive-noble-6.8.0-31-generic-amd64-r20241024.8100be23_20241112") ogboot_samba_user = get_input(stdscr, 7, 0, "ogBoot Samba User (opengnsys): ", "opengnsys") ogboot_samba_pass = get_password(stdscr, 8, 0, "ogBoot Samba Pass (og): ", "og") From 412334bc238d62cfb455ec4d69b31bc72d59d0cd Mon Sep 17 00:00:00 2001 From: Nicolas Arenas Date: Fri, 15 Nov 2024 13:43:41 +0100 Subject: [PATCH 24/47] Fix typo in Tieout start --- component-installer/component-installer.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/component-installer/component-installer.sh b/component-installer/component-installer.sh index 874199a..e66f455 100644 --- a/component-installer/component-installer.sh +++ b/component-installer/component-installer.sh @@ -49,7 +49,7 @@ ExecStart=/usr/bin/docker compose -f /opt/opengnsys/ogCore/etc/docker-compose-de ExecStartPost=/opt/opengnsys/ogCore/bin/provision_ogcore.sh ExecStop=/usr/bin/docker compose -f /opt/opengnsys/ogCore/etc/docker-compose-deploy.yml stop Restart=always -timeoutStartSec=600 +TimeoutStartSec=600 [Install] WantedBy=multi-user.target @@ -78,6 +78,7 @@ Restart=always ExecStartPre=/opt/opengnsys/ogGui/bin/provision_oggui.sh ExecStart=/usr/bin/docker run --rm --name ogGui-app -p 4200:4200 -v $ENV_FILE:/app/.env opengnsys/oggui:$oggui_version ExecStop=/usr/bin/docker stop ogGui-app +TimeoutStartSec=600 [Install] WantedBy=multi-user.target From 4916d157365605665c51b79db512c925dd329fc5 Mon Sep 17 00:00:00 2001 From: Nicolas Arenas Date: Wed, 20 Nov 2024 13:44:11 +0100 Subject: [PATCH 25/47] Create version to use npyscreen module --- component-installer/component-installer.sh | 2 + python-installer/oginstaller-v2.py | 194 +++++++++++++++++++++ python-installer/opengnsys_installer.sh | 54 ++++++ 3 files changed, 250 insertions(+) create mode 100644 python-installer/oginstaller-v2.py create mode 100755 python-installer/opengnsys_installer.sh diff --git a/component-installer/component-installer.sh b/component-installer/component-installer.sh index e66f455..d0e104f 100644 --- a/component-installer/component-installer.sh +++ b/component-installer/component-installer.sh @@ -120,6 +120,8 @@ do OGCORE_BRANCH=$(jq -r '.container_version' /opt/opengnsys/ogCore/installer/config.json) container_version=$(jq -r '.container_version' /opt/opengnsys/ogCore/installer/config.json) git_checkout_release "$OGCORE_REPO" "$component_dir/repo" "$OGCORE_BRANCH" + cp $component_dir/repo/.env $component_dir/etc/ + cp $component_dir/repo/env.json $component_dir/etc/ mkdir -p $component_dir/etc/ mkdir -p $component_dir/bin/ cp $CONFIGS_DIR/provision_ogcore.sh $component_dir/bin/ diff --git a/python-installer/oginstaller-v2.py b/python-installer/oginstaller-v2.py new file mode 100644 index 0000000..8dc7d33 --- /dev/null +++ b/python-installer/oginstaller-v2.py @@ -0,0 +1,194 @@ +import npyscreen +import json +import os +from git import Repo + +CONFIGS_DIR = "/tmp/oginstall" +os.makedirs(CONFIGS_DIR, exist_ok=True) + +REPO_URL = "https://ognproject.evlt.uma.es/gitea/opengnsys/ogcore.git" + +def get_git_tags(): + try: + repo_path = os.path.join(CONFIGS_DIR, "opengnsys_repo") + if not os.path.exists(repo_path): + print("Clonando el repositorio...") + Repo.clone_from(REPO_URL, repo_path) + else: + print("Usando repositorio existente en", repo_path) + + repo = Repo(repo_path) + tags = [tag.name for tag in repo.tags] + return tags + except Exception as e: + print("Error al obtener los tags:", str(e)) + return [] + +class ComponentSelectionForm(npyscreen.ActionForm): + def create(self): + self.components = self.add(npyscreen.TitleMultiSelect, max_height=6, name="Selecciona los componentes", + values=["ogCore", "ogGui", "ogDhcp", "ogBoot", "ogRepository"], scroll_exit=True) + self.tags = get_git_tags() + self.tag = self.add(npyscreen.TitleSelectOne, max_height=4, name="Selecciona el tag", + values=self.tags, scroll_exit=True) + + def beforeEditing(self): + npyscreen.blank_terminal() + + def on_ok(self): + npyscreen.blank_terminal() + selected_components = [self.components.values[i] for i in self.components.value] + if not selected_components or not self.tag.value: + npyscreen.notify_confirm("Debes seleccionar al menos un componente y un tag.", title="Error") + return + selected_tag = self.tags[self.tag.value[0]] + self.parentApp.selected_components = selected_components + self.parentApp.selected_tag = selected_tag + self.parentApp.current_component_index = 0 + self.parentApp.switchForm(selected_components[0]) + + def on_cancel(self): + if npyscreen.notify_yes_no("¿Estás seguro de que deseas salir?", title="Confirmación"): + self.parentApp.setNextForm(None) + +class ComponentForm(npyscreen.ActionForm): + component_name = None + + def create(self): + self.fields = {} + + def beforeEditing(self): + npyscreen.blank_terminal() + self.fields.clear() + self._recreate_form() + + def _recreate_form(self): + """Limpia y recrea los widgets del formulario.""" + self._clear_widgets() + self.configure_fields() + + def configure_fields(self): + """Método para definir los campos de configuración para cada componente""" + pass + + def _clear_widgets(self): + """Limpia todos los widgets del formulario.""" + self._widgets__ = [] + self._widgets_by_id__ = {} + self._contained_widgets = [] + + def validate_fields(self): + """Validaciones personalizadas para contraseñas.""" + password_field = None + confirmation_field = None + + # Identificar los campos de contraseña y confirmación + for key, field_data in self.fields.items(): + if field_data.get("is_password_field"): + password_field = field_data["widget"] + if field_data.get("is_password_confirmation"): + confirmation_field = field_data["widget"] + + # Validar contraseñas si ambos campos están definidos + if password_field and confirmation_field: + if password_field.value != confirmation_field.value: + npyscreen.notify_confirm("Las contraseñas no coinciden. Por favor, revísalas.", title="Error") + return False + return True + + def add_password_field(self, key, name, is_confirmation=False): + """Añade un campo de contraseña con metadatos.""" + widget = self.add(npyscreen.TitlePassword, name=name) + self.fields[key] = { + "widget": widget, + "is_password_field": not is_confirmation, + "is_password_confirmation": is_confirmation, + } + + def on_ok(self): + if not self.validate_fields(): + return # Si las validaciones fallan, no proceder + + npyscreen.blank_terminal() + config_data = {"release": self.parentApp.selected_tag} + for key, field_data in self.fields.items(): + config_data[key] = field_data["widget"].value + + config_file = os.path.join(CONFIGS_DIR, f"config_{self.component_name}.json") + with open(config_file, "w") as f: + json.dump(config_data, f) + npyscreen.notify_confirm(f"Configuración de {self.component_name} guardada en {config_file}", title="Confirmación") + + 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.setNextForm(None) + + def on_cancel(self): + if npyscreen.notify_yes_no("¿Estás seguro de que deseas salir?", title="Confirmación"): + self.parentApp.setNextForm(None) + +class OgCoreForm(ComponentForm): + component_name = "ogCore" + + def configure_fields(self): + self.fields["username"] = {"widget": self.add(npyscreen.TitleText, name="Usuario administrador (ogadmin):", value="ogadmin")} + self.add_password_field("password", "Contraseña:") + self.add_password_field("confirm_password", "Confirmar Contraseña:", is_confirmation=True) + +class OgGuiForm(ComponentForm): + component_name = "ogGui" + + def configure_fields(self): + self.fields["ogcore_ip"] = {"widget": self.add(npyscreen.TitleText, name="URL Api OgCore (https://127.0.0.1:8443):", value="https://127.0.0.1:8443")} + +class OgDhcpForm(ComponentForm): + component_name = "ogDhcp" + + def configure_fields(self): + self.fields["ogbootIP"] = {"widget": self.add(npyscreen.TitleText, name="IP servidor de Boot (127.0.0.1):", value="127.0.0.1")} + self.fields["ogDhcpIP"] = {"widget": self.add(npyscreen.TitleText, name="IP servidor de DHCP (127.0.0.1):", value="127.0.0.1")} + self.fields["ogdhcpDir"] = {"widget": self.add(npyscreen.TitleText, name="Directorio de ogdhcp (/opt/opengnsys/ogdhcp):", value="/opt/opengnsys/ogdhcp")} + self.fields["interfaces"] = {"widget": self.add(npyscreen.TitleText, name="Interfaces Boot (eth0,eth1):", value="eth0,eth1")} + + +class OgBootForm(ComponentForm): + component_name = "ogBoot" + + def configure_fields(self): + self.fields["ogCore_ServerIP"] = {"widget": self.add(npyscreen.TitleText, name="ogCore IP:", value="")} + self.fields["ogBoot_ServerIP"] = {"widget": self.add(npyscreen.TitleText, name="ogBoot Server IP:", value="")} + self.fields["ogBoot_Dir"] = {"widget": self.add(npyscreen.TitleText, name="ogCore Dir (/opt/opengnsys/ogboot):", value="/opt/opengnsys/ogboot")} + self.fields["ogLive_Default"] = {"widget": self.add(npyscreen.TitleText, name="ogLive por defecto:", value="ogLive-noble-6.8.0-31-generic-amd64-r20241024.8100be23_20241112")} + self.fields["ogBootSambaUser"] = {"widget": self.add(npyscreen.TitleText, name="ogBoot Samba User (opengnsys):", value="opengnsys")} + self.add_password_field("ogBootSambaPass", "ogBoot Samba Pass (og):") + self.add_password_field("confirm_ogBootSambaPass", "Confirmar ogBoot Samba Pass (og):", value="og" ,is_confirmation=True) + + +class OgRepositoryForm(ComponentForm): + component_name = "ogRepository" + + def configure_fields(self): + self.fields["ogrepository_ip"] = {"widget": self.add(npyscreen.TitleText, name="ogRepository IP:", value="127.0.0.1")} + self.fields["ogcore_server_ip"] = {"widget": self.add(npyscreen.TitleText, name="ogCoreserver IP(127.0.0.1):", value="127.0.0.1")} + self.fields["ogrepository_samba_user"] = {"widget": self.add(npyscreen.TitleText, name="Samba User:", value="opengnsys")} + self.add_password_field("ogrepository_samba_pass", "Samba Password:") + self.add_password_field("confirm_repository_password", "Confirmar Samba Password:", value="og" ,is_confirmation=True) + +class ConfigApp(npyscreen.NPSAppManaged): + def onStart(self): + self.addForm("MAIN", ComponentSelectionForm, name="Selección de Componentes") + self.addForm("ogCore", OgCoreForm, name="Configuración de ogCore") + self.addForm("ogGui", OgGuiForm, name="Configuración de ogGui") + self.addForm("ogDhcp", OgDhcpForm, name="Configuración de ogDhcp") + self.addForm("ogBoot", OgBootForm, name="Configuración de ogBoot") + self.addForm("ogRepository", OgRepositoryForm, name="Configuración de ogRepository") + self.selected_components = [] + self.selected_tag = "" + self.current_component_index = 0 + +if __name__ == "__main__": + app = ConfigApp() + app.run() diff --git a/python-installer/opengnsys_installer.sh b/python-installer/opengnsys_installer.sh new file mode 100755 index 0000000..174d499 --- /dev/null +++ b/python-installer/opengnsys_installer.sh @@ -0,0 +1,54 @@ +#!/bin/bash + +# Setup installer environment + + +BRANCH=${BRANCH:-main} +GIT_SSL_NO_VERIFY=1 +GIT_REPO="https://ognproject.evlt.uma.es/gitea/api/v1/repos/opengnsys/oginstaller/archive/$BRANCH.zip" +export GIT_SSL_NO_VERIFY + + + +install_packages() { + apt-get update + apt-get install -y curl jq unzip python3 python3-git +} + +download_installer() { + + rm -f /tmp/oginstaller.zip + rm -rf /tmp/oginstaller-$BRANCH + rm -rf /tmp/oginstaller + + curl -q -k $GIT_REPO -H 'accept: application/json' -o /tmp/oginstaller.zip + unzip /tmp/oginstaller.zip -d /tmp + mv /tmp/oginstaller /tmp/oginstaller-$BRANCH +} + +extract_installer() { + rm -rf /tmp/oginstall + mkdir -p /tmp/oginstall + cp -r /tmp/oginstaller-$BRANCH/python-installer/* /tmp/oginstall/ + cp -r /tmp/oginstaller-$BRANCH/component-installer/* /tmp/oginstall/ + chmod 755 /tmp/oginstall/*.sh + chmod 755 /tmp/oginstall/*.py +} + +create_questions() { + echo "Creating questions..." + python3 /tmp/oginstall/oginstaller-v2.py +} + +launch_component_installer() { + echo "Launching component installer..." + /tmp/oginstall/component-installer.sh +} + + +install_packages +download_installer +extract_installer +create_questions +launch_component_installer + From 0a0bd59f8dcb5ea528856fc634b2f7e6059816e5 Mon Sep 17 00:00:00 2001 From: Nicolas Arenas Date: Wed, 20 Nov 2024 13:49:05 +0100 Subject: [PATCH 26/47] Install pip dependencies --- python-installer/opengnsys_installer.sh | 9 +++++++++ python-installer/requirements.txt | 2 ++ 2 files changed, 11 insertions(+) create mode 100644 python-installer/requirements.txt diff --git a/python-installer/opengnsys_installer.sh b/python-installer/opengnsys_installer.sh index 174d499..ff154f7 100755 --- a/python-installer/opengnsys_installer.sh +++ b/python-installer/opengnsys_installer.sh @@ -15,6 +15,14 @@ install_packages() { apt-get install -y curl jq unzip python3 python3-git } + +create_python_venv() { + apt-get install -y python3-venv + python3 -m venv /tmp/oginstall/venv + source /tmp/oginstall/venv/bin/activate + pip install -r /tmp/oginstall/requirements.txt +} + download_installer() { rm -f /tmp/oginstaller.zip @@ -49,6 +57,7 @@ launch_component_installer() { install_packages download_installer extract_installer +create_python_venv create_questions launch_component_installer diff --git a/python-installer/requirements.txt b/python-installer/requirements.txt new file mode 100644 index 0000000..54171c6 --- /dev/null +++ b/python-installer/requirements.txt @@ -0,0 +1,2 @@ +GitPython +npyscreen From 3b00609c1e675b5ad9cdd2ad5bf857551d66d8b9 Mon Sep 17 00:00:00 2001 From: Nicolas Arenas Date: Wed, 20 Nov 2024 13:49:43 +0100 Subject: [PATCH 27/47] Clean oginstaller --- python-installer/opengnsys_installer.sh | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/python-installer/opengnsys_installer.sh b/python-installer/opengnsys_installer.sh index ff154f7..c63fd3c 100755 --- a/python-installer/opengnsys_installer.sh +++ b/python-installer/opengnsys_installer.sh @@ -53,6 +53,12 @@ launch_component_installer() { /tmp/oginstall/component-installer.sh } +clean_tmp() { + rm -rf /tmp/oginstall + rm -rf /tmp/oginstaller-$BRANCH + rm -f /tmp/oginstaller.zip +} + install_packages download_installer @@ -60,4 +66,4 @@ extract_installer create_python_venv create_questions launch_component_installer - +clean_tmp From 176b0cba2e226fcf061bcb9e80017025801c4748 Mon Sep 17 00:00:00 2001 From: Nicolas Arenas Date: Wed, 20 Nov 2024 14:00:50 +0100 Subject: [PATCH 28/47] Adjust release parameter --- component-installer/component-installer.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/component-installer/component-installer.sh b/component-installer/component-installer.sh index d0e104f..9d31349 100644 --- a/component-installer/component-installer.sh +++ b/component-installer/component-installer.sh @@ -62,7 +62,7 @@ EOF function install_oggui_docker() { # Sacar la IP del ogCore de la configuración - oggui_version=$(jq -r '.container_version' /opt/opengnsys/ogGui/installer/config.json) + oggui_version=$(jq -r '.release' /opt/opengnsys/ogGui/installer/config.json) # Exportar los valores como variables de entorno ENV_DIR=/opt/opengnsys/ogGui/etc/ ENV_FILE=$ENV_DIR/.env @@ -117,8 +117,8 @@ do case $component in ogCore) echo "Instalando ogCore..." - OGCORE_BRANCH=$(jq -r '.container_version' /opt/opengnsys/ogCore/installer/config.json) - container_version=$(jq -r '.container_version' /opt/opengnsys/ogCore/installer/config.json) + OGCORE_BRANCH=$(jq -r '.release' /opt/opengnsys/ogCore/installer/config.json) + container_version=$(jq -r '.release' /opt/opengnsys/ogCore/installer/config.json) git_checkout_release "$OGCORE_REPO" "$component_dir/repo" "$OGCORE_BRANCH" cp $component_dir/repo/.env $component_dir/etc/ cp $component_dir/repo/env.json $component_dir/etc/ From 033ecb17e7c646cb889d979b34efcbbb7aac4fc7 Mon Sep 17 00:00:00 2001 From: Nicolas Arenas Date: Wed, 20 Nov 2024 14:09:00 +0100 Subject: [PATCH 29/47] Fix typo in directory --- component-installer/component-installer.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/component-installer/component-installer.sh b/component-installer/component-installer.sh index 9d31349..93d626f 100644 --- a/component-installer/component-installer.sh +++ b/component-installer/component-installer.sh @@ -127,7 +127,7 @@ do cp $CONFIGS_DIR/provision_ogcore.sh $component_dir/bin/ chmod 755 $component_dir/bin/provision_ogcore.sh cp $component_dir/repo/docker-compose-deploy.yml $component_dir/etc/ - sed -i "s/static/$container_version/g" $component_dir/repo/docker-compose-deploy.yml + sed -i "s/static/$container_version/g" $component_dir/etc/docker-compose-deploy.yml echo - ogCore >> /etc/issue install_docker install_ogcore_docker From b7c3523b10f1c158e7f27d30ee1eee5952634b59 Mon Sep 17 00:00:00 2001 From: Nicolas Arenas Date: Wed, 20 Nov 2024 18:29:26 +0100 Subject: [PATCH 30/47] Update parameters for ogrepository --- component-installer/component-installer.sh | 3 ++- component-installer/provision_ogrepository.sh | 8 +++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/component-installer/component-installer.sh b/component-installer/component-installer.sh index 93d626f..2911203 100644 --- a/component-installer/component-installer.sh +++ b/component-installer/component-installer.sh @@ -171,12 +171,13 @@ do git_checkout_release "$OGREPOSITORY_REPO" "$component_dir/repo" "$OGCORE_BRANCH" cp $CONFIGS_DIR/$config_file $component_dir/installer/config.json REPO_IP=$(jq -r '.ogrepository_ip' $component_dir/installer/config.json) + CORE_IP=$(jq -r '.ogcore_ip' $component_dir/installer/config.json) OGUSER=$(jq -r '.ogrepository_samba_user' $component_dir/installer/config.json) OGPASS=$(jq -r '.ogrepository_samba_pass' $component_dir/installer/config.json) mkdir -p $component_dir/bin cp $CONFIGS_DIR/provision_ogrepository.sh $component_dir/bin/ chmod 755 $component_dir/bin/provision_ogrepository.sh - $component_dir/bin/provision_ogrepository.sh $REPO_IP $OGUSER $OGPASS $component_dir/repo + $component_dir/bin/provision_ogrepository.sh $REPO_IP $CORE_IP $OGUSER $OGPASS $component_dir/repo echo - ogRepository >> /etc/issue ;; *) diff --git a/component-installer/provision_ogrepository.sh b/component-installer/provision_ogrepository.sh index 0b7b049..64f9b25 100644 --- a/component-installer/provision_ogrepository.sh +++ b/component-installer/provision_ogrepository.sh @@ -4,10 +4,11 @@ set -e REPO_IP=${1:-"127.0.0.1"} -OGUSER=${2:-"opengnsys"} -OGPASS=${3:-"og"} +CORE_IP=${2:-"127.0.0.1"} +OGUSER=${3:-"opengnsys"} +OGPASS=${4:-"og"} INSTALL_DIR=/opt/opengnsys/ogrepository -DOWNLOAD_DIR=${4:-"/tmp/ogrepository"} +DOWNLOAD_DIR=${5:-"/tmp/ogrepository"} DEBIAN_FRONTEND=noninteractive export DEBIAN_FRONTEND export GIT_SSL_NO_VERIFY @@ -75,6 +76,7 @@ install_files() { chown -R $OGUSER:$OGUSER $INSTALL_DIR chmod 755 $INSTALL_DIR/bin/* echo IPlocal="$REPO_IP" > $INSTALL_DIR/etc/ogAdmRepo.cfg + echo IPcore="$CORE_IP" >> $INSTALL_DIR/etc/ogAdmRepo.cfg sudo chown $OGUSER:$OGUSER $INSTALL_DIR/etc/ogAdmRepo.cfg } From 237ccf6675e902258c7ec689fd0e3eef8ae4c3af Mon Sep 17 00:00:00 2001 From: Nicolas Arenas Date: Wed, 20 Nov 2024 18:29:43 +0100 Subject: [PATCH 31/47] Add default values for password --- python-installer/oginstaller-v2.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/python-installer/oginstaller-v2.py b/python-installer/oginstaller-v2.py index 8dc7d33..ac971d6 100644 --- a/python-installer/oginstaller-v2.py +++ b/python-installer/oginstaller-v2.py @@ -96,9 +96,9 @@ class ComponentForm(npyscreen.ActionForm): return False return True - def add_password_field(self, key, name, is_confirmation=False): + def add_password_field(self, key, name, is_confirmation=False, default_value=""): """Añade un campo de contraseña con metadatos.""" - widget = self.add(npyscreen.TitlePassword, name=name) + widget = self.add(npyscreen.TitlePassword, name=name, value=default_value) self.fields[key] = { "widget": widget, "is_password_field": not is_confirmation, @@ -136,7 +136,7 @@ class OgCoreForm(ComponentForm): def configure_fields(self): self.fields["username"] = {"widget": self.add(npyscreen.TitleText, name="Usuario administrador (ogadmin):", value="ogadmin")} self.add_password_field("password", "Contraseña:") - self.add_password_field("confirm_password", "Confirmar Contraseña:", is_confirmation=True) + self.add_password_field("confirm_password", "Confirmar Contraseña:", is_confirmation=True, default_value="12345678") class OgGuiForm(ComponentForm): component_name = "ogGui" @@ -163,8 +163,8 @@ class OgBootForm(ComponentForm): self.fields["ogBoot_Dir"] = {"widget": self.add(npyscreen.TitleText, name="ogCore Dir (/opt/opengnsys/ogboot):", value="/opt/opengnsys/ogboot")} self.fields["ogLive_Default"] = {"widget": self.add(npyscreen.TitleText, name="ogLive por defecto:", value="ogLive-noble-6.8.0-31-generic-amd64-r20241024.8100be23_20241112")} self.fields["ogBootSambaUser"] = {"widget": self.add(npyscreen.TitleText, name="ogBoot Samba User (opengnsys):", value="opengnsys")} - self.add_password_field("ogBootSambaPass", "ogBoot Samba Pass (og):") - self.add_password_field("confirm_ogBootSambaPass", "Confirmar ogBoot Samba Pass (og):", value="og" ,is_confirmation=True) + self.add_password_field("ogBootSambaPass", "ogBoot Samba Pass (og):", default_value="og") + self.add_password_field("confirm_ogBootSambaPass", "Confirmar ogBoot Samba Pass (og):", is_confirmation=True, default_value="og") class OgRepositoryForm(ComponentForm): @@ -174,8 +174,8 @@ class OgRepositoryForm(ComponentForm): self.fields["ogrepository_ip"] = {"widget": self.add(npyscreen.TitleText, name="ogRepository IP:", value="127.0.0.1")} self.fields["ogcore_server_ip"] = {"widget": self.add(npyscreen.TitleText, name="ogCoreserver IP(127.0.0.1):", value="127.0.0.1")} self.fields["ogrepository_samba_user"] = {"widget": self.add(npyscreen.TitleText, name="Samba User:", value="opengnsys")} - self.add_password_field("ogrepository_samba_pass", "Samba Password:") - self.add_password_field("confirm_repository_password", "Confirmar Samba Password:", value="og" ,is_confirmation=True) + self.add_password_field("ogrepository_samba_pass", "Samba Password:", default_value="og") + self.add_password_field("confirm_repository_password", "Confirmar Samba Password:", is_confirmation=True, default_value="og") class ConfigApp(npyscreen.NPSAppManaged): def onStart(self): From 858763c4733dad6a85efddab42613f1a266e43db Mon Sep 17 00:00:00 2001 From: Nicolas Arenas Date: Wed, 20 Nov 2024 20:13:19 +0100 Subject: [PATCH 32/47] Improve tag selection --- python-installer/oginstaller-v2.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python-installer/oginstaller-v2.py b/python-installer/oginstaller-v2.py index ac971d6..9173b62 100644 --- a/python-installer/oginstaller-v2.py +++ b/python-installer/oginstaller-v2.py @@ -18,7 +18,7 @@ def get_git_tags(): print("Usando repositorio existente en", repo_path) repo = Repo(repo_path) - tags = [tag.name for tag in repo.tags] + tags = [tag.name for tag in repo.tags if tag.name.startswith("opengnsys")] return tags except Exception as e: print("Error al obtener los tags:", str(e)) @@ -29,7 +29,7 @@ class ComponentSelectionForm(npyscreen.ActionForm): self.components = self.add(npyscreen.TitleMultiSelect, max_height=6, name="Selecciona los componentes", values=["ogCore", "ogGui", "ogDhcp", "ogBoot", "ogRepository"], scroll_exit=True) self.tags = get_git_tags() - self.tag = self.add(npyscreen.TitleSelectOne, max_height=4, name="Selecciona el tag", + self.tag = self.add(npyscreen.TitleSelectOne, max_height=10, name="Selecciona el tag", values=self.tags, scroll_exit=True) def beforeEditing(self): From 9e7cc4e22dc7c397fc796f099aa1532e51c256ec Mon Sep 17 00:00:00 2001 From: Nicolas Arenas Date: Wed, 20 Nov 2024 21:11:42 +0100 Subject: [PATCH 33/47] Create missing directory --- component-installer/component-installer.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/component-installer/component-installer.sh b/component-installer/component-installer.sh index 2911203..e595a17 100644 --- a/component-installer/component-installer.sh +++ b/component-installer/component-installer.sh @@ -120,6 +120,7 @@ do OGCORE_BRANCH=$(jq -r '.release' /opt/opengnsys/ogCore/installer/config.json) container_version=$(jq -r '.release' /opt/opengnsys/ogCore/installer/config.json) git_checkout_release "$OGCORE_REPO" "$component_dir/repo" "$OGCORE_BRANCH" + mkdir -p $component_dir/etc cp $component_dir/repo/.env $component_dir/etc/ cp $component_dir/repo/env.json $component_dir/etc/ mkdir -p $component_dir/etc/ From 30ae35c6f1b7c6a2064e84228c5f70e859535f32 Mon Sep 17 00:00:00 2001 From: Nicolas Arenas Date: Wed, 20 Nov 2024 21:23:46 +0100 Subject: [PATCH 34/47] Add cat to view file --- component-installer/component-installer.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/component-installer/component-installer.sh b/component-installer/component-installer.sh index e595a17..75d0065 100644 --- a/component-installer/component-installer.sh +++ b/component-installer/component-installer.sh @@ -129,6 +129,7 @@ do chmod 755 $component_dir/bin/provision_ogcore.sh cp $component_dir/repo/docker-compose-deploy.yml $component_dir/etc/ sed -i "s/static/$container_version/g" $component_dir/etc/docker-compose-deploy.yml + cat $component_dir/etc/docker-compose-deploy.yml echo - ogCore >> /etc/issue install_docker install_ogcore_docker From 3fbbb3b3404ea66c606f30901a17b60ada383d3d Mon Sep 17 00:00:00 2001 From: Nicolas Arenas Date: Wed, 20 Nov 2024 21:27:29 +0100 Subject: [PATCH 35/47] Leave deploy yaml to docker --- component-installer/provision_ogcore.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/component-installer/provision_ogcore.sh b/component-installer/provision_ogcore.sh index d693399..a5a7f7f 100644 --- a/component-installer/provision_ogcore.sh +++ b/component-installer/provision_ogcore.sh @@ -5,11 +5,11 @@ set -x cd /opt/opengnsys/ogCore/repo/ # Preparar el fichero .yaml -CONF_DIR=/opt/opengnsys/ogCore/etc/ -mkdir -p $CONF_DIR +# CONF_DIR=/opt/opengnsys/ogCore/etc/ +# mkdir -p $CONF_DIR # Copiar el fichero de configuración a CONF_DIR -cp docker-compose-deploy.yml $CONF_DIR/ +# cp docker-compose-deploy.yml $CONF_DIR/ if [ -f /opt/opengnsys/ogCore/installer/.deployed ]; then echo "ogCore ya instalado" From cbf1f0715dc70989163f0d4389136f4c62785439 Mon Sep 17 00:00:00 2001 From: Nicolas Arenas Date: Wed, 20 Nov 2024 21:33:24 +0100 Subject: [PATCH 36/47] Add default value for password --- python-installer/oginstaller-v2.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python-installer/oginstaller-v2.py b/python-installer/oginstaller-v2.py index 9173b62..e23c1f9 100644 --- a/python-installer/oginstaller-v2.py +++ b/python-installer/oginstaller-v2.py @@ -135,7 +135,7 @@ class OgCoreForm(ComponentForm): def configure_fields(self): self.fields["username"] = {"widget": self.add(npyscreen.TitleText, name="Usuario administrador (ogadmin):", value="ogadmin")} - self.add_password_field("password", "Contraseña:") + self.add_password_field("password", "Contraseña:" , default_value="12345678") self.add_password_field("confirm_password", "Confirmar Contraseña:", is_confirmation=True, default_value="12345678") class OgGuiForm(ComponentForm): From 77053c41421a2bf6b3c38a4d80f374349d6c04af Mon Sep 17 00:00:00 2001 From: Nicolas Arenas Date: Wed, 20 Nov 2024 21:36:46 +0100 Subject: [PATCH 37/47] Recover CONF_DIR variable --- component-installer/provision_ogcore.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/component-installer/provision_ogcore.sh b/component-installer/provision_ogcore.sh index a5a7f7f..4fbefe8 100644 --- a/component-installer/provision_ogcore.sh +++ b/component-installer/provision_ogcore.sh @@ -2,6 +2,7 @@ # set -x +CONF_DIR=/opt/opengnsys/ogCore/etc/ cd /opt/opengnsys/ogCore/repo/ # Preparar el fichero .yaml From b8f53f91e833fcc610355124172772bd6bae91df Mon Sep 17 00:00:00 2001 From: Nicolas Arenas Date: Wed, 20 Nov 2024 21:46:00 +0100 Subject: [PATCH 38/47] Finishing provision if user ogadmin --- component-installer/provision_ogcore.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/component-installer/provision_ogcore.sh b/component-installer/provision_ogcore.sh index 4fbefe8..8e7cd18 100644 --- a/component-installer/provision_ogcore.sh +++ b/component-installer/provision_ogcore.sh @@ -39,6 +39,7 @@ if [ $adminuser == "ogadmin" ]; then echo "Cambiando password a ogadmin no puede ser el usuario administrador" ogadmin_uuid=$(curl -q -k -L https://localhost:8443/users/?username=ogadmin -H 'accept: application/json' -H "Authorization: Bearer $bearer" | jq .[0].uuid | sed 's/"//g') curl -k -L -X PUT "https://localhost:8443/users/$ogadmin_uuid/reset-password" -H 'accept: application/ld+json' -H 'Content-Type: application/ld+json' -d "{\"currentPassword\": \"12345678\", \"newPassword\": \"$adminpass\", \"repeatNewPassword\": \"$adminpass\"}" -H "Authorization: Bearer $bearer" + touch /opt/opengnsys/ogCore/installer/.deployed exit 0 fi From f6fe1615f46d8abf0952525a048ed2406cb700b5 Mon Sep 17 00:00:00 2001 From: Nicolas Arenas Date: Wed, 20 Nov 2024 22:12:44 +0100 Subject: [PATCH 39/47] deactivate python venv after questions --- python-installer/opengnsys_installer.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/python-installer/opengnsys_installer.sh b/python-installer/opengnsys_installer.sh index c63fd3c..c228988 100755 --- a/python-installer/opengnsys_installer.sh +++ b/python-installer/opengnsys_installer.sh @@ -46,6 +46,7 @@ extract_installer() { create_questions() { echo "Creating questions..." python3 /tmp/oginstall/oginstaller-v2.py + deactivate } launch_component_installer() { From 5ef82a4d4f9eb7586be2a236642cbd50ef819913 Mon Sep 17 00:00:00 2001 From: Nicolas Arenas Date: Wed, 20 Nov 2024 22:55:08 +0100 Subject: [PATCH 40/47] Adjust dhcp directory parameter name --- python-installer/oginstaller-v2.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python-installer/oginstaller-v2.py b/python-installer/oginstaller-v2.py index e23c1f9..796d9de 100644 --- a/python-installer/oginstaller-v2.py +++ b/python-installer/oginstaller-v2.py @@ -150,7 +150,7 @@ class OgDhcpForm(ComponentForm): def configure_fields(self): self.fields["ogbootIP"] = {"widget": self.add(npyscreen.TitleText, name="IP servidor de Boot (127.0.0.1):", value="127.0.0.1")} self.fields["ogDhcpIP"] = {"widget": self.add(npyscreen.TitleText, name="IP servidor de DHCP (127.0.0.1):", value="127.0.0.1")} - self.fields["ogdhcpDir"] = {"widget": self.add(npyscreen.TitleText, name="Directorio de ogdhcp (/opt/opengnsys/ogdhcp):", value="/opt/opengnsys/ogdhcp")} + self.fields["ogDhcp_Dir"] = {"widget": self.add(npyscreen.TitleText, name="Directorio de ogdhcp (/opt/opengnsys/ogdhcp):", value="/opt/opengnsys/ogdhcp")} self.fields["interfaces"] = {"widget": self.add(npyscreen.TitleText, name="Interfaces Boot (eth0,eth1):", value="eth0,eth1")} From 8f08e35f4294b7015da4fcd4fd5fd698e83eb083 Mon Sep 17 00:00:00 2001 From: Nicolas Arenas Date: Thu, 21 Nov 2024 00:25:06 +0100 Subject: [PATCH 41/47] Modified default oglive --- python-installer/oginstaller-v2.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python-installer/oginstaller-v2.py b/python-installer/oginstaller-v2.py index 796d9de..c4755be 100644 --- a/python-installer/oginstaller-v2.py +++ b/python-installer/oginstaller-v2.py @@ -29,7 +29,7 @@ class ComponentSelectionForm(npyscreen.ActionForm): self.components = self.add(npyscreen.TitleMultiSelect, max_height=6, name="Selecciona los componentes", values=["ogCore", "ogGui", "ogDhcp", "ogBoot", "ogRepository"], scroll_exit=True) self.tags = get_git_tags() - self.tag = self.add(npyscreen.TitleSelectOne, max_height=10, name="Selecciona el tag", + self.tag = self.add(nyscreen.TitleSelectOne, max_height=4, name="Selecciona el tag", values=self.tags, scroll_exit=True) def beforeEditing(self): @@ -161,7 +161,7 @@ class OgBootForm(ComponentForm): self.fields["ogCore_ServerIP"] = {"widget": self.add(npyscreen.TitleText, name="ogCore IP:", value="")} self.fields["ogBoot_ServerIP"] = {"widget": self.add(npyscreen.TitleText, name="ogBoot Server IP:", value="")} self.fields["ogBoot_Dir"] = {"widget": self.add(npyscreen.TitleText, name="ogCore Dir (/opt/opengnsys/ogboot):", value="/opt/opengnsys/ogboot")} - self.fields["ogLive_Default"] = {"widget": self.add(npyscreen.TitleText, name="ogLive por defecto:", value="ogLive-noble-6.8.0-31-generic-amd64-r20241024.8100be23_20241112")} + self.fields["ogLive_Default"] = {"widget": self.add(npyscreen.TitleText, name="ogLive por defecto:", value="https://ognproject.evlt.uma.es/oglive/ogLive-noble-6.8.0-31-generic-amd64-r20241114.6cdde68_20241120.iso")} self.fields["ogBootSambaUser"] = {"widget": self.add(npyscreen.TitleText, name="ogBoot Samba User (opengnsys):", value="opengnsys")} self.add_password_field("ogBootSambaPass", "ogBoot Samba Pass (og):", default_value="og") self.add_password_field("confirm_ogBootSambaPass", "Confirmar ogBoot Samba Pass (og):", is_confirmation=True, default_value="og") From 0096a5b9424054338775c76714619a6964a96abe Mon Sep 17 00:00:00 2001 From: Nicolas Arenas Date: Thu, 21 Nov 2024 00:29:28 +0100 Subject: [PATCH 42/47] Fix typo --- python-installer/oginstaller-v2.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python-installer/oginstaller-v2.py b/python-installer/oginstaller-v2.py index c4755be..73e573c 100644 --- a/python-installer/oginstaller-v2.py +++ b/python-installer/oginstaller-v2.py @@ -29,7 +29,7 @@ class ComponentSelectionForm(npyscreen.ActionForm): self.components = self.add(npyscreen.TitleMultiSelect, max_height=6, name="Selecciona los componentes", values=["ogCore", "ogGui", "ogDhcp", "ogBoot", "ogRepository"], scroll_exit=True) self.tags = get_git_tags() - self.tag = self.add(nyscreen.TitleSelectOne, max_height=4, name="Selecciona el tag", + self.tag = self.add(npyscreen.TitleSelectOne, max_height=4, name="Selecciona el tag", values=self.tags, scroll_exit=True) def beforeEditing(self): From 69bdd32f74880dc346342d1adafe8dcb968a3f34 Mon Sep 17 00:00:00 2001 From: Nicolas Arenas Date: Thu, 21 Nov 2024 00:30:38 +0100 Subject: [PATCH 43/47] Fixing max eight --- python-installer/oginstaller-v2.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python-installer/oginstaller-v2.py b/python-installer/oginstaller-v2.py index 73e573c..2437978 100644 --- a/python-installer/oginstaller-v2.py +++ b/python-installer/oginstaller-v2.py @@ -29,7 +29,7 @@ class ComponentSelectionForm(npyscreen.ActionForm): self.components = self.add(npyscreen.TitleMultiSelect, max_height=6, name="Selecciona los componentes", values=["ogCore", "ogGui", "ogDhcp", "ogBoot", "ogRepository"], scroll_exit=True) self.tags = get_git_tags() - self.tag = self.add(npyscreen.TitleSelectOne, max_height=4, name="Selecciona el tag", + self.tag = self.add(npyscreen.TitleSelectOne, max_height=10, name="Selecciona el tag", values=self.tags, scroll_exit=True) def beforeEditing(self): From ee28a98157a85db240a1dffbaa070f9ee0db20bf Mon Sep 17 00:00:00 2001 From: Nicolas Arenas Date: Thu, 21 Nov 2024 01:19:05 +0100 Subject: [PATCH 44/47] fix ogcore parameter for iprepository --- component-installer/component-installer.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/component-installer/component-installer.sh b/component-installer/component-installer.sh index 75d0065..54a3125 100644 --- a/component-installer/component-installer.sh +++ b/component-installer/component-installer.sh @@ -173,7 +173,7 @@ do git_checkout_release "$OGREPOSITORY_REPO" "$component_dir/repo" "$OGCORE_BRANCH" cp $CONFIGS_DIR/$config_file $component_dir/installer/config.json REPO_IP=$(jq -r '.ogrepository_ip' $component_dir/installer/config.json) - CORE_IP=$(jq -r '.ogcore_ip' $component_dir/installer/config.json) + CORE_IP=$(jq -r '.ogcore_server_ip' $component_dir/installer/config.json) OGUSER=$(jq -r '.ogrepository_samba_user' $component_dir/installer/config.json) OGPASS=$(jq -r '.ogrepository_samba_pass' $component_dir/installer/config.json) mkdir -p $component_dir/bin From 00a96b0a8417a6ae1beebf067cb3c8786cdf047e Mon Sep 17 00:00:00 2001 From: Nicolas Arenas Date: Fri, 22 Nov 2024 10:05:21 +0100 Subject: [PATCH 45/47] Hanfle interfaces exception for json --- python-installer/oginstaller-v2.py | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/python-installer/oginstaller-v2.py b/python-installer/oginstaller-v2.py index 2437978..a1aa9da 100644 --- a/python-installer/oginstaller-v2.py +++ b/python-installer/oginstaller-v2.py @@ -150,9 +150,32 @@ class OgDhcpForm(ComponentForm): def configure_fields(self): self.fields["ogbootIP"] = {"widget": self.add(npyscreen.TitleText, name="IP servidor de Boot (127.0.0.1):", value="127.0.0.1")} self.fields["ogDhcpIP"] = {"widget": self.add(npyscreen.TitleText, name="IP servidor de DHCP (127.0.0.1):", value="127.0.0.1")} - self.fields["ogDhcp_Dir"] = {"widget": self.add(npyscreen.TitleText, name="Directorio de ogdhcp (/opt/opengnsys/ogdhcp):", value="/opt/opengnsys/ogdhcp")} + self.fields["ogDhcp_Dir"] = {"widget": self.add(npyscreen.TitleText, name="Directorio de ogdhcp (/opt/opengnsys/ogdhcp):", value="/opt/opengnsys/ogdhcp")} self.fields["interfaces"] = {"widget": self.add(npyscreen.TitleText, name="Interfaces Boot (eth0,eth1):", value="eth0,eth1")} - + + def on_ok(self): + if not self.validate_fields(): + return # Si las validaciones fallan, no proceder + + npyscreen.blank_terminal() + config_data = {"release": self.parentApp.selected_tag} + for key, field_data in self.fields.items(): + if key == "interfaces": + config_data[key] = [iface.strip() for iface in field_data["widget"].value.split(",")] + else: + config_data[key] = field_data["widget"].value + + config_file = os.path.join(CONFIGS_DIR, f"config_{self.component_name}.json") + with open(config_file, "w") as f: + json.dump(config_data, f) + npyscreen.notify_confirm(f"Configuración de {self.component_name} guardada en {config_file}", title="Confirmación") + + 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.setNextForm(None) class OgBootForm(ComponentForm): component_name = "ogBoot" From 8e235f526dc4c67a22c6110dc6137e10ec603cf3 Mon Sep 17 00:00:00 2001 From: Nicolas Arenas Date: Wed, 4 Dec 2024 13:03:48 +0100 Subject: [PATCH 46/47] Update default oglive version --- python-installer/oginstaller.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python-installer/oginstaller.py b/python-installer/oginstaller.py index e1c03e1..08cb6ba 100755 --- a/python-installer/oginstaller.py +++ b/python-installer/oginstaller.py @@ -182,7 +182,7 @@ def main(stdscr): ogcore_ip = get_input(stdscr, 3, 0, "ogCore Ip Server: ", "") ogboot_server_ip = get_input(stdscr, 4, 0, "ogBoot Server IP: ", "") ogcore_dir = get_input(stdscr, 5, 0, "ogCore Dir (/opt/opengnsys/ogboot): ", "/opt/opengnsys/ogboot") - ogLive_default = get_input(stdscr, 6, 0, "ogLive por defecto (ogLive-noble-6.8.0-31-generic-amd64-r20241024.8100be23_20241112): ", "ogLive-noble-6.8.0-31-generic-amd64-r20241024.8100be23_20241112") + ogLive_default = get_input(stdscr, 6, 0, "ogLive por defecto (ogLive-noble-6.8.0-31-generic-amd64-r20241128.62778c9_20241129): ", "ogLive-noble-6.8.0-31-generic-amd64-r20241128.62778c9_20241129") ogboot_samba_user = get_input(stdscr, 7, 0, "ogBoot Samba User (opengnsys): ", "opengnsys") ogboot_samba_pass = get_password(stdscr, 8, 0, "ogBoot Samba Pass (og): ", "og") config_data = { From a39258f9789f6425ad0607f9b05c6dfe10dbc3e6 Mon Sep 17 00:00:00 2001 From: Nicolas Arenas Date: Thu, 5 Dec 2024 16:34:19 +0100 Subject: [PATCH 47/47] Replace oglive for latest --- python-installer/oginstaller-v2.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python-installer/oginstaller-v2.py b/python-installer/oginstaller-v2.py index a1aa9da..646c669 100644 --- a/python-installer/oginstaller-v2.py +++ b/python-installer/oginstaller-v2.py @@ -184,7 +184,7 @@ class OgBootForm(ComponentForm): self.fields["ogCore_ServerIP"] = {"widget": self.add(npyscreen.TitleText, name="ogCore IP:", value="")} self.fields["ogBoot_ServerIP"] = {"widget": self.add(npyscreen.TitleText, name="ogBoot Server IP:", value="")} self.fields["ogBoot_Dir"] = {"widget": self.add(npyscreen.TitleText, name="ogCore Dir (/opt/opengnsys/ogboot):", value="/opt/opengnsys/ogboot")} - self.fields["ogLive_Default"] = {"widget": self.add(npyscreen.TitleText, name="ogLive por defecto:", value="https://ognproject.evlt.uma.es/oglive/ogLive-noble-6.8.0-31-generic-amd64-r20241114.6cdde68_20241120.iso")} + self.fields["ogLive_Default"] = {"widget": self.add(npyscreen.TitleText, name="ogLive por defecto:", value="https://ognproject.evlt.uma.es/oglive/ogLive-noble-6.8.0-31-generic-amd64-r20241128.62778c9_20241129.iso")} self.fields["ogBootSambaUser"] = {"widget": self.add(npyscreen.TitleText, name="ogBoot Samba User (opengnsys):", value="opengnsys")} self.add_password_field("ogBootSambaPass", "ogBoot Samba Pass (og):", default_value="og") self.add_password_field("confirm_ogBootSambaPass", "Confirmar ogBoot Samba Pass (og):", is_confirmation=True, default_value="og")