# Ogboot

Ogboot es una implementación independiente que facilita la funcionalidad de arranque remoto (PXE) en entornos gestionados por Opengnsys. Este componente permite la carga remota de sistemas operativos y otros archivos esenciales durante el proceso de arranque de las estaciones de trabajo.

## Instalación

### Requisitos Previos:
- **Sistema Operativo**: Ubuntu 24.
- **Python 3**: La instalación se ha probado con la versión **Python 3.12.3**.
  ```bash
  python3 --version
  Python 3.12.3
  ```

### Instalación de Python 3:
Ejecuta el siguiente comando para instalar Python 3 y `pip`:
```bash
apt-get install -y python3 python3-pip
```

### Configuración Inicial:
El archivo de configuración ya viene incluido en el repositorio, por lo que solo necesitas modificarlo con los parámetros adecuados:

```json
{
    "ogCore_ServerIP": "172.17.8.82",
    "ogBoot_ServerIP": "172.17.8.37",
    "ogBoot_Dir": "/opt/opengnsys/ogboot",
    "ogBootSambaUser": "opengnsys",
    "ogBootSambaPass": "og"
}
```

- **`ogCore_ServerIP`**: IP del servidor ogcore.
- **`ogBoot_ServerIP`**: IP del servidor ogboot.
- **`ogBoot_Dir`**: Directorio de instalación de ogboot.
- **`ogBootSambaUser`** y **`ogBootSambaPass`**: Usuario y contraseña de Samba.

### Instalación:
1. Asegúrate de que Python 3 esté instalado.
2. Modifica el archivo de configuración existente con los parámetros necesarios.


## API de Ogboot

La API de Ogboot proporciona una interfaz para facilitar el proceso de inicialización remota de sistemas operativos en entornos administrados por OpenGnsys. Ogboot permite la gestión eficiente de los archivos de arranque tanto de particiones locales como de sistemas operativos remotos. 

El presente documento detalla los endpoints del API con sus respectivos parámetros de entrada así como las acciones que llevan a cabo


### Tabla de Contenido

1. [Obtener configuración de ogboot](#obtener-configuración-de-ogboot) - `GET /ogboot/v1/config`
2. [Obtener datos de rendimiento](#obtener-datos-de-rendimiento) - `GET /ogboot/v1/status`
3. [Mostrar información de todos los clientes ogLive instalados](#mostrar-información-de-todos-los-clientes-oglive-instalados) - `GET /ogboot/v1/oglives`
4. [Mostrar información de un cliente ogLive instalado](#mostrar-información-de-todos-los-clientes-oglive-instalados) - `GET /ogboot/v1/oglives/{Index|Dir}`
5. [Mostrar información del cliente ogLive predeterminado](#mostrar-información-del-cliente-oglive-predeterminado) - `GET /ogboot/v1/oglives/default`
6. [Cambiar ogLive predeterminado](#cambiar-oglive-predeterminado) - `POST /ogboot/v1/oglives/default/{Index}`
7. [Instalar nuevo cliente ogLive desde imagen descargada](#instalar-nuevo-cliente-oglive-desde-imagen-descargada) - `POST /ogboot/v1/oglive/{iso}`
8. [Desinstalar cliente ogLive y eliminar imagen](#desinstalar-cliente-oglive-y-eliminar-imagen) - `DELETE /ogboot/v1/oglives/{iso}`
9. [Regenerar archivo de información de los ogLive](#regenerar-archivo-de-información-de-los-oglive) - `PUT /ogboot/v1/oglives`
10. [Mostrar menú de descarga de imagen de ogLive](#mostrar-menú-de-descarga-de-imagen-de-oglive) - `GET /ogboot/v1/images/download`
11. [Obtener todos los archivos de arranque](#obtener-todos-los-archivos-de-arranque) - `GET /ogboot/v1/pxes`
12. [Obtener archivo de arranque](#obtener-archivo-de-arranque) - `GET /ogboot/v1/pxes/{mac}`
13. [Crear archivo de arranque](#crear-archivo-de-arranque) - `POST /ogboot/v1/pxes` 
14. [Eliminar archivo de arranque](#eliminar-archivo-de-arranque) - `DELETE /ogboot/v1/pxes`
15. [Obtener todas las plantillas](#obtener-todas-las-plantillas) - `GET /ogboot/v1/pxe-templates`
16. [Obtener contenido de la plantilla](#obtener-contenido-de-la-plantilla) - `GET /ogboot/v1/pxe-templates/{nombre}`
17. [Crear plantilla](#crear-plantilla) - `POST /ogboot/v1/pxe-templates`
18. [Regenerar plantilla](#regenerar-plantilla) - `PUT /ogboot/v1/pxe-templates` 



### Obtener Estado de ogboot

Devuelve el uso de disco, el cliente `ogLive` predeterminado, la lista de `ogLives` instalados y el estado de los servicios.

**URL:** `/ogboot/v1/status`  
**Método HTTP:** GET

**Ejemplo de Solicitud:**

```bash
curl -X GET  http://example.com/ogboot/v1/status
```

**Respuestas:**

- **Código 200 OK:** El estado de ogboot se obtuvo exitosamente.
  - **Contenido:**
    ```json
    {
        "success": "Status retrieved successfully",
        "message": {
            "disk_usage": {
                "total": "22591996",
                "used": "11995812",
                "available": "9542092",
                "percentage": "56%"
            },
            "default_oglive": "ogLive-6.8.0-i386-20241014",
            "installed_oglives": [
                {
                    "id": "dcca1bf9762189e147cc4cde926392b1",
                    "distribution": "noble",
                    "kernel": "6.8.0-31-generic-amd64-r20240716",
                    "architecture": "i386",
                    "revision": "20241014",
                    "directory": "/opt/ogboot/tftpboot//ogLive-6.8.0-i386-20241014"
                },
                {
                    "id": "ad8222511753d4013be21602899d642e",
                    "distribution": "noble",
                    "kernel": "6.8.0-31-generic-amd64-r20240716",
                    "architecture": "i386",
                    "revision": "20241017",
                    "directory": "/opt/ogboot/tftpboot//ogLive-6.8.0-i386-20241017"
                }
            ],
            "services_status": {
                "tftpboot": "active",
                "nginx": "active"
            }
        }
    }
    ```

- **Código 404 Not Found:** No se encontraron clientes `ogLive` instalados ni predeterminados.
  - **Contenido:**
    ```json
    {
        "error": "NOT_FOUND",
        "message": "No default or installed ogLives found."
    }
    ```

- **Código 500 Internal Server Error:** Se produjo un error del servidor al recuperar el estado.
  - **Posibles respuestas:**
    ```json
    {
        "error": "FAILED_TO_RETRIEVE_DISK_USAGE",
        "message": "Error to retrieve disk usage"
    }
    ```
    o
    ```json
    {
        "error": "FAILED_TO_RETRIEVE_OGLIVE_CONFIGURATION",
        "message": "Error to retrieve ogLive configuration"
    }
    ```
    o
    ```json
    {
        "error": "FAILED_TO_RETRIEVE_SERVICES_STATUS",
        "message": "Error to retrieve services status"
    }
    ```


### Obtener Menú de Descargas de ogLive

Devuelve la lista de ISOs de ogLive disponibles para descargar.

**URL:** `/ogboot/v1/oglives/isos`  
**Método HTTP:** GET

**Ejemplo de Solicitud:**

```bash
curl -X GET  http://example.com/ogboot/v1/oglives/isos
```

**Respuestas:**

- **Código 200 OK:** Las ISOs se obtuvieron exitosamente.
  - **Contenido:**
    ```json
    {
        "success": "ISOs retrieved successfully",
        "message": [
            {
              "id": "1",
              "filename": "ogLive-noble-6.8.0-31-generic-amd64-r20240716-20241014.iso",
              "url": "https://ognproject.evlt.uma.es/oglive//ogLive-noble-6.8.0-31-generic-amd64-r20240716-20241014.iso",
              "installed": true,
              "compatible": false
            },
            {
              "id": "2",
              "filename": "ogLive-noble-6.8.0-31-generic-amd64-r20240716-20241017.iso",
              "url": "https://ognproject.evlt.uma.es/oglive//ogLive-noble-6.8.0-31-generic-amd64-r20240716-20241017.iso",
              "installed": true,
              "compatible": false
            }
    
        ]
    }
    ```

- **Código 500 Internal Server Error:** Ocurrió un error al intentar recuperar las ISOs.
  - **Contenido:**
    ```json
    {
        "error": "FAILED_TO_RETRIEVE_ISOS",
        "message": "Error to retrieve ISO downloads"
    }
    ```


### Obtener Lista de Todos los Clientes ogLive Instalados

Devuelve la lista de clientes ogLive instalados, incluyendo el cliente `ogLive` predeterminado.

**URL:** `/ogboot/v1/oglives`  
**Método HTTP:** GET

**Ejemplo de Solicitud:**

```bash
curl -X 'GET' \
  'http://172.17.8.37/ogboot/v1/oglives' \
  -H 'accept: application/json'
```

**Respuestas:**

- **Código 200 OK:** La lista de clientes ogLive instalados se obtuvo exitosamente.
  - **Contenido:**
    ```json
    {
        "success": "ogLive clients retrieved successfully",
        "message": {
            "default_oglive": "ogLive-6.8.0-i386-20241014",
            "installed_ogLives": [
                {
                    "id": "dcca1bf9762189e147cc4cde926392b1",
                    "distribution": "noble",
                    "kernel": "6.8.0-31-generic-amd64-r20240716",
                    "architecture": "i386",
                    "revision": "20241014",
                    "directory": "/opt/ogboot/tftpboot//ogLive-6.8.0-i386-20241014"
                },
                {
                    "id": "ad8222511753d4013be21602899d642e",
                    "distribution": "noble",
                    "kernel": "6.8.0-31-generic-amd64-r20240716",
                    "architecture": "i386",
                    "revision": "20241017",
                    "directory": "/opt/ogboot/tftpboot//ogLive-6.8.0-i386-20241017"
                }
            ]
        }
    }
    ```

- **Código 404 Not Found:** No se encontraron clientes `ogLive` instalados.
  - **Contenido:**
    ```json
    {
        "error": "NOT_FOUND",
        "message": "No ogLive clients found."
    }
    ```

- **Código 500 Internal Server Error:** Se produjo un error del servidor o un error desconocido al recuperar la lista de clientes.
  - **Posibles respuestas:**
    ```json
    {
        "error": "SERVER_ERROR",
        "message": "Failed to retrieve ogLive clients due to server error."
    }
    ```
    o
    ```json
    {
        "error": "UNKNOWN_ERROR",
        "message": "An unknown error occurred."
    }
    ```


### Obtener Información de un Cliente ogLive Instalado

Devuelve la información de un cliente `ogLive` instalado identificado por su checksum.

**URL:** `/ogboot/v1/oglives/{checksum}`  
**Método HTTP:** GET

**Parámetros de Ruta:**
- **`checksum`** (string): Checksum del cliente `ogLive` instalado.
  - **Ejemplo**: `9e49a085ba74f97a81bdf9b3d0785094`

**Ejemplo de Solicitud:**

```bash
curl -X 'GET' \
  'http://172.17.8.37/ogboot/v1/oglives/9e49a085ba74f97a81bdf9b3d0785094' \
  -H 'accept: application/json'
```

**Respuestas:**

- **Código 200 OK:** El cliente `ogLive` se obtuvo exitosamente.
  - **Contenido:**
    ```json
    {
        "success": "ogLive client retrieved successfully",
        "message": {
            "id": "9e49a085ba74f97a81bdf9b3d0785094",
            "distribution": "noble",
            "kernel": "6.8.0-31-generic-amd64-r20240716",
            "architecture": "i386",
            "revision": "20241014",
            "directory": "/opt/ogboot/tftpboot//ogLive-6.8.0-i386-20241014"
        }
    }
    ```

- **Código 404 Not Found:** No se encontró el cliente `ogLive` con el checksum proporcionado.
  - **Contenido:**
    ```json
    {
        "error": "NOT_FOUND",
        "message": "ogLive client with checksum 9e49a085ba74f97a81bdf9b3d0785094 not found."
    }
    ```

- **Código 500 Internal Server Error:** Error del servidor al intentar recuperar la información del cliente `ogLive`.
  - **Contenido:**
    ```json
    {
        "error": "SERVER_ERROR",
        "message": "Failed to retrieve ogLive client."
    }
    ```




### Obtener Información del Cliente ogLive por Defecto

Devuelve la información del cliente `ogLive` configurado como predeterminado.

**URL:** `/ogboot/v1/oglives/default`  
**Método HTTP:** GET

**Ejemplo de Solicitud:**

```bash
curl -X 'GET' \
  'http://172.17.8.37/ogboot/v1/oglives/default' \
  -H 'accept: application/json'
```

**Respuestas:**

- **Código 200 OK:** La información del cliente `ogLive` por defecto se obtuvo exitosamente.
  - **Contenido:**
    ```json
    {
        "success": "se ha obtenido el oglive por defecto",
        "message": {
            "id": "default_oglive_id",
            "distribution": "noble",
            "kernel": "6.8.0-31-generic-amd64-r20240716",
            "architecture": "i386",
            "revision": "20241014",
            "directory": "/opt/ogboot/tftpboot//ogLive-6.8.0-i386-20241014"
        }
    }
    ```

- **Código 500 Internal Server Error:** Ocurrió un error al intentar recuperar el cliente `ogLive` por defecto.
  - **Contenido:**
    ```json
    {
        "error": "SERVER_ERROR",
        "message": "Failed to retrieve default ogLive."
    }
    ```


### Establecer Cliente ogLive por Defecto

Permite establecer un cliente `ogLive` como predeterminado usando su checksum.

**URL:** `/ogboot/v1/oglives/default`  
**Método HTTP:** PUT

**Cuerpo de la Solicitud:**
- Debe enviarse un JSON con la siguiente estructura:
  ```json
  {
      "checksum": "9e49a085ba74f97a81bdf9b3d0785094"
  }
  ```
  - **`checksum`** (string): El checksum del cliente `ogLive` que se va a establecer como predeterminado.

**Ejemplo de Solicitud:**

```bash
curl -X 'PUT' \
  'http://172.17.8.37/ogboot/v1/oglives/default' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
        "checksum": "9e49a085ba74f97a81bdf9b3d0785094"
      }'
```

**Respuestas:**

- **Código 200 OK:** El cliente `ogLive` se estableció como predeterminado exitosamente.
  - **Contenido:**
    ```json
    {
        "success": "ogLive client set as default successfully",
        "message": {
            "id": "9e49a085ba74f97a81bdf9b3d0785094",
            "distribution": "noble",
            "kernel": "6.8.0-31-generic-amd64-r20240716",
            "architecture": "i386",
            "revision": "20241014",
            "directory": "/opt/ogboot/tftpboot//ogLive-6.8.0-i386-20241014"
        }
    }
    ```

- **Código 400 Bad Request:** Los datos de entrada son inválidos.
  - **Contenido:**
    ```json
    {
        "error": "INVALID_INPUT",
        "message": "Invalid input data: checksum is required."
    }
    ```

- **Código 500 Internal Server Error:** Ocurrió un error al intentar establecer el cliente `ogLive` como predeterminado.
  - **Contenido:**
    ```json
    {
        "error": "SERVER_ERROR",
        "message": "Failed to set ogLive as default."
    }
    ```


### Iniciar Instalación de un Cliente ogLive

Inicia el proceso de instalación de un cliente `ogLive` a partir de una URL de descarga proporcionada. Este endpoint es asincrónico y, tras la instalación, envía una notificación a la URL del webhook configurada en `ogCore`.

**URL:** `/ogboot/v1/oglives/install`  
**Método HTTP:** POST

**Cuerpo de la Solicitud:**
- Se debe enviar un JSON con la siguiente estructura:
  ```json
  {
      "url": "https://ognproject.evlt.uma.es/trac/downloads/ogLive-focal-5.11.0-22-generic-amd64-r20210413.992ebb9.iso",
      "id": "12345"
  }
  ```
  - **`url`** (string): URL del archivo ISO de `ogLive` a descargar e instalar.
  - **`id`** (string): ID único de transacción para rastrear el proceso de instalación.

**Ejemplo de Solicitud:**

```bash
curl -X 'POST' \
  'http://172.17.8.37/ogboot/v1/oglives/install' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
        "url": "https://ognproject.evlt.uma.es/trac/downloads/ogLive-focal-5.11.0-22-generic-amd64-r20210413.992ebb9.iso",
        "id": "12345"
      }'
```

**Respuestas:**

- **Código 202 Accepted:** La instalación del cliente `ogLive` se ha iniciado correctamente.
  - **Contenido:**
    ```json
    {
        "success": "ogLive client installation started",
        "transaction_id": "12345"
    }
    ```

- **Código 400 Bad Request:** Los datos de entrada no son válidos.
  - **Contenido:**
    ```json
    {
        "error": "Invalid input data",
        "details": "URL and transaction ID are required."
    }
    ```

- **Código 500 Internal Server Error:** Fallo al iniciar la instalación del cliente `ogLive`.
  - **Contenido:**
    ```json
    {
        "error": "Failed to initiate ogLive installation",
        "details": "Detalles del error específico"
    }
    ```

**Nota:**
Este endpoint ejecuta la instalación en segundo plano y notifica al `ogCore` a través de un webhook en la URL configurada al finalizar el proceso, enviando el estado, el código de respuesta (200 si es exitoso) y un mensaje.



### Desinstalar un Cliente ogLive

Permite desinstalar un cliente `ogLive` identificado por su checksum.

**URL:** `/ogboot/v1/oglives/{checksum}`  
**Método HTTP:** DELETE

**Parámetros de Ruta:**
- **`checksum`** (string): Checksum del cliente `ogLive` a desinstalar.
  - **Ejemplo**: `9e49a085ba74f97a81bdf9b3d0785094`

**Ejemplo de Solicitud:**

```bash
curl -X 'DELETE' \
  'http://172.17.8.37/ogboot/v1/oglives/9e49a085ba74f97a81bdf9b3d0785094' \
  -H 'accept: application/json'
```

**Respuestas:**

- **Código 200 OK:** El cliente `ogLive` se desinstaló exitosamente.
  - **Contenido:**
    ```json
    {
        "message": "ogLive client uninstalled successfully",
        "details": "Detalles adicionales de la desinstalación."
    }
    ```

- **Código 404 Not Found:** No se encontró el cliente `ogLive` con el checksum proporcionado.
  - **Contenido:**
    ```json
    {
        "error": "NOT_FOUND",
        "message": "ogLive client not found."
    }
    ```

- **Código 403 Forbidden:** No se puede desinstalar el cliente `ogLive` predeterminado.
  - **Contenido:**
    ```json
    {
        "error": "FORBIDDEN",
        "message": "Cannot uninstall the default ogLive client."
    }
    ```

- **Código 500 Internal Server Error:** Ocurrió un error al intentar desinstalar el cliente `ogLive`.
  - **Contenido:**
    ```json
    {
        "error": "SERVER_ERROR",
        "message": "Failed to uninstall ogLive client."
    }
    ```

- **Otros errores no previstos:**
  ```json
  {
      "error": "UNKNOWN_ERROR",
      "message": "An unknown error occurred."
  }
  ```


### Obtener todos los ficheros de arranque

Devuelve la lista de archivos de arranque PXE disponibles.

**URL:** `/ogboot/v1/pxes`  
**Método HTTP:** GET

**Respuesta Exitosa (200 OK):**  
- **Descripción:** Archivos de arranque PXE obtenidos exitosamente.
- **Ejemplo de Respuesta:**
    ```json
    {
        "success": "Boot files retrieved successfully",
        "message": [
            "01-00-50-56-aa-bb-cc",
            "01-00-50-56-dd-ee-ff"
        ]
    }
    ```

**Posibles Respuestas de Error:**

- **Código 404 Not Found:** No se encontraron archivos de arranque PXE.
    - **Ejemplo de Respuesta:**
      ```json
      {
          "error": "NOT_FOUND",
          "message": "No boot files found."
      }
      ```
- **Código 500 Internal Server Error:** Fallo en la obtención de archivos debido a problemas internos, como que el directorio no exista.
    - **Ejemplo de Respuesta:**
      ```json
      {
          "error": "SERVER_ERROR",
          "message": "Failed to retrieve boot files: directory not found."
      }
      ```


Aquí está la documentación actualizada para incluir el caso de éxito en el que el archivo de arranque es un archivo de arranque por disco.

---

### Obtener fichero de arranque

Devuelve el archivo de arranque para una dirección MAC específica, incluyendo los parámetros de configuración. Si el archivo de arranque es por disco, se devolverá un mensaje específico indicando la posibilidad de un archivo de plantilla para arranque desde disco.

**URL:** `/ogboot/v1/pxes/{mac}`  
**Método HTTP:** GET  

#### Parámetro de Ruta
- **mac** (string, requerido): Dirección MAC para la cual se recuperará el archivo de arranque.  
  - **Ejemplo:** `00:50:56:22:11:12`

#### Respuesta Exitosa (200 OK)
- **Descripción:** Archivo de arranque obtenido exitosamente.

##### Caso 1: Archivo de arranque con parámetros

- **Ejemplo de Respuesta:**
    ```json
    {
        "success": "Boot file retrieved successfully",
        "message": {
            "template_name": "pxe",
            "mac": "00:50:56:22:11:12",
            "lang": "es_ES.UTF-8",
            "ip": "192.168.2.11",
            "server_ip": "192.168.2.1",
            "router": "192.168.2.1",
            "netmask": "255.255.255.0",
            "computer_name": "pc11",
            "netiface": "eth0",
            "group": "Aula_virtual",
            "ogrepo": "192.168.2.1",
            "oglive": "192.168.2.1",
            "oglog": "192.168.2.1",
            "ogshare": "192.168.2.1",
            "oglivedir": "ogLive",
            "ogprof": "false",
            "hardprofile": "",
            "ogntp": "",
            "ogdns": "",
            "ogproxy": "",
            "ogunit": "",
            "resolution": "788"
        }
    }
    ```

##### Caso 2: Archivo de arranque por disco (sin parámetros)

- **Ejemplo de Respuesta:**
    ```json
    {
        "success": "Boot file retrieved successfully",
        "message": {
            "template_name": "disk_boot",
            "mac": "00:50:56:22:11:12",
            "message": "Boot file without parameters, possibly a disk boot template."
        }
    }
    ```

#### Posibles Respuestas de Error

- **Código 404 Not Found:** No se encontró ningún archivo de arranque para la dirección MAC especificada.
    - **Ejemplo de Respuesta:**
      ```json
      {
          "error": "NOT_FOUND",
          "message": "No boot file found for the specified MAC address."
      }
      ```

- **Código 500 Internal Server Error:** Error interno del servidor.
    - **Ejemplo de Respuesta:**
      ```json
      {
          "error": "SERVER_ERROR",
          "message": "An error occurred while retrieving the boot file."
      }
      ```

Aquí tienes la documentación del endpoint `createBootFile` actualizada para incluir todos los parámetros opcionales que puedes pasar para generar el archivo de arranque PXE.

---

### Crear archivo PXE

Este endpoint permite crear un archivo de arranque PXE con la MAC y la plantilla especificadas, con parámetros adicionales como IP, directorio ogLive, servidor, y más.

**URL:** `/ogboot/v1/pxes`  
**Método HTTP:** POST  

#### Cuerpo de la Solicitud
- **mac** (string, requerido): Dirección MAC para el archivo de arranque.
  - **Ejemplo:** `"00:50:56:22:11:12"`
- **template_name** (string, requerido): Nombre de la plantilla que se utilizará para crear el archivo PXE.
  - **Ejemplo:** `"mi_plantilla.ipxe"`
- **server_ip** (string, opcional): Dirección IP del servidor.
  - **Ejemplo:** `"192.168.2.1"`
- **oglivedir** (string, opcional): Directorio ogLive a utilizar en el arranque.
  - **Ejemplo:** `"ogLive"`

#### Parámetros Opcionales
- **lang** (string): Idioma de la configuración regional.
  - **Ejemplo:** `"es_ES.UTF-8"`
- **ip** (string): Dirección IP.
  - **Ejemplo:** `"192.168.2.11"`
- **router** (string): Dirección IP gateway.
  - **Ejemplo:** `"192.168.2.1"`
- **netmask** (string): Máscara de red.
  - **Ejemplo:** `"255.255.255.0"`
- **computer_name** (string): Nombre del equipo.
  - **Ejemplo:** `"pc11"`
- **netiface** (string): Interfaz de red.
  - **Ejemplo:** `"eth0"`
- **group** (string): Grupo de la máquina.
  - **Ejemplo:** `"Aula_virtual"`
- **ogrepo** (string): IP del servidor de ogrepositorio.
  - **Ejemplo:** `"192.168.2.1"`
- **oglive** (string): IP del servidor tftpboot.
  - **Ejemplo:** `"192.168.2.1"`
- **oglog** (string): IP del servidor de logs.
  - **Ejemplo:** `"192.168.2.1"`
- **ogshare** (string): IP del servidor ogclient
  - **Ejemplo:** `"192.168.2.1"`
- **ogprof** (string): Indica si es profesor.
  - **Ejemplo:** `"false"`
- **hardprofile** (string): Perfil de hardware.
  - **Ejemplo:** `""`
- **ogntp** (string): IP del servidor NTP.
  - **Ejemplo:** `"192.168.2.1"`
- **ogdns** (string): IP del servidor DNS.
  - **Ejemplo:** `"192.168.2.1"`
- **ogproxy** (string): IP del servidor proxy.
  - **Ejemplo:** `"192.168.2.1"`
- **ogunit** (string): Directorio de unidad.
  - **Ejemplo:** `"unit"`
- **resolution** (string): Resolución de pantalla.
  - **Ejemplo:** `"788"`

#### Ejemplo de Solicitud
```json
{
    "mac": "00:50:56:22:11:12",
    "template_name": "mi_plantilla.ipxe",
    "server_ip": "192.168.2.1",
    "oglivedir": "ogLive",
    "lang": "es_ES.UTF-8",
    "ip": "192.168.2.11",
    "router": "192.168.2.1",
    "netmask": "255.255.255.0",
    "computer_name": "pc11",
    "netiface": "eth0",
    "group": "Aula_virtual",
    "ogrepo": "192.168.2.1",
    "oglive": "192.168.2.1",
    "oglog": "192.168.2.1",
    "ogshare": "192.168.2.1",
    "ogprof": "false",
    "hardprofile": "",
    "ogntp": "192.168.2.1",
    "ogdns": "192.168.2.1",
    "ogproxy": "192.168.2.1",
    "ogunit": "unit",
    "resolution": "788"
}
```

#### Respuesta Exitosa (200 OK)
- **Descripción:** Plantilla creada exitosamente.

- **Ejemplo de Respuesta:**
    ```json
    {
        "success": "PXE file created successfully",
        "message": "#!ipxe\n#Template: mi_plantilla.ipxe\nset kernelargs ro boot=oginit quiet splash irqpoll ..."
    }
    ```

#### Posibles Respuestas de Error

- **Código 400 Bad Request:** Entrada inválida o falta algún dato requerido (por ejemplo, `mac` o `template_name`).
    - **Ejemplo de Respuesta:**
      ```json
      {
          "error": "INVALID_INPUT",
          "message": "Missing required fields: mac and template_name"
      }
      ```

- **Código 404 Not Found:** No se encuentra la plantilla especificada.
    - **Ejemplo de Respuesta:**
      ```json
      {
          "error": "TEMPLATE_NOT_FOUND",
          "message": "No se encontró la plantilla especificada"
      }
      ```

- **Código 500 Internal Server Error:** Error interno al crear el archivo PXE.
    - **Ejemplo de Respuesta:**
      ```json
      {
          "error": "FAILED_TO_CREATE_PXE_FILE",
          "message": "Error al crear el archivo PXE"
      }
      ```


### Eliminar archivo PXE

Este endpoint permite eliminar un archivo de arranque PXE específico usando la dirección MAC del cliente.

**URL:** `/ogboot/v1/pxes/{mac}`  
**Método HTTP:** DELETE  

#### Parámetros de la URL
- **mac** (string, requerido): Dirección MAC del cliente cuyo archivo de arranque se va a eliminar.
  - **Ejemplo:** `"00:11:22:33:44:55"`

#### Ejemplo de Solicitud
```bash
curl -X 'DELETE' \
  'http://172.17.8.37/ogboot/v1/pxes/00:11:22:33:44:55' \
  -H 'accept: application/json'
```

#### Respuestas

- **Código 200 OK:** El archivo de arranque se eliminó exitosamente.
  - **Ejemplo de Respuesta:**
    ```json
    {
        "success": "Boot file deleted successfully",
        "message": "The boot file for MAC 00:11:22:33:44:55 has been deleted."
    }
    ```

- **Código 404 Not Found:** No se encontró un archivo de arranque para la dirección MAC especificada.
  - **Ejemplo de Respuesta:**
    ```json
    {
        "error": "NOT_FOUND",
        "message": "No boot file found for the specified MAC address."
    }
    ```

- **Código 500 Internal Server Error:** Error interno del servidor al intentar eliminar el archivo.
  - **Ejemplo de Respuesta:**
    ```json
    {
        "error": "SERVER_ERROR",
        "message": "Failed to delete the boot file due to server error."
    }
    ```


### Obtener todas las plantillas PXE

Este endpoint devuelve una lista de todas las plantillas de arranque PXE disponibles en el sistema.

**URL:** `/ogboot/v1/pxe-templates`  
**Método HTTP:** GET  

#### Ejemplo de Solicitud
```bash
curl -X 'GET' \
  'http://172.17.8.37/ogboot/v1/pxe-templates' \
  -H 'accept: application/json'
```

#### Respuestas

- **Código 200 OK:** Lista de plantillas de arranque PXE obtenida con éxito.
  - **Ejemplo de Respuesta:**
    ```json
    {
        "success": "Lista de plantillas obtenida con éxito",
        "message": [
            "mi_plantilla.ipxe",
            "otra_plantilla.ipxe"
        ]
    }
    ```

- **Código 500 Internal Server Error:** Error interno del servidor al intentar obtener las plantillas.
  - **Ejemplo de Respuesta:**
    ```json
    {
        "error": "SERVER_ERROR",
        "message": "Directorio de plantillas no encontrado"
    }
    ```


### Obtener contenido de una plantilla PXE

Este endpoint obtiene el contenido de una plantilla de arranque PXE específica por su nombre.

**URL:** `/ogboot/v1/pxe-templates/{templateName}`  
**Método HTTP:** GET  

#### Parámetros

- **templateName** (obligatorio): Nombre de la plantilla PXE a consultar.
  - **Ejemplo**: `"mi_plantilla.ipxe"`

#### Ejemplo de Solicitud
```bash
curl -X 'GET' \
  'http://172.17.8.37/ogboot/v1/pxe-templates/mi_plantilla.ipxe' \
  -H 'accept: application/json'
```

#### Respuestas

- **Código 200 OK:** Contenido de la plantilla de arranque PXE obtenido exitosamente.
  - **Ejemplo de Respuesta:**
    ```json
    {
        "success": "Plantilla obtenida con éxito",
        "template_name": "mi_plantilla.ipxe",
        "template_content": "#!ipxe\nset timeout 0\nset timeout-style hidden\n\nset ISODIR ogLive\nset default 0\nset kernelargs INFOHOST\nkernel tftp://SERVERIP/ogLive/ogvmlinuz ${kernelargs}\ninitrd tftp://SERVERIP/ogLive/oginitrd.img\nboot"
    }
    ```

- **Código 404 Not Found:** La plantilla especificada no fue encontrada.
  - **Ejemplo de Respuesta:**
    ```json
    {
        "error": "TEMPLATE_NOT_FOUND",
        "message": "No se encontró la plantilla especificada"
    }
    ```

- **Código 500 Internal Server Error:** Error al leer la plantilla especificada.
  - **Ejemplo de Respuesta:**
    ```json
    {
        "error": "FAILED_TO_READ_TEMPLATE",
        "message": "Error al leer la plantilla"
    }
    ```


### Crear Plantilla

Este endpoint crea una nueva plantilla de arranque PXE en el servidor utilizando el nombre y el contenido proporcionado.

**URL:** `/ogboot/v1/pxe-templates`  
**Método HTTP:** POST  

#### Parámetros de Solicitud

- **name_template** (obligatorio): Nombre de la nueva plantilla.
  - **Ejemplo**: `"mi_plantilla.ipxe"`
- **content_template** (obligatorio): Contenido de la plantilla, que debe incluir el script de arranque.
  - **Ejemplo**: 
    ```plaintext
    #!ipxe
    set timeout 0
    set timeout-style hidden
    set ISODIR __OGLIVE__
    set default 0
    set kernelargs __INFOHOST__
    :try_iso
    kernel http://__SERVERIP__/tftpboot/${ISODIR}/ogvmlinuz ${kernelargs} || goto fallback
    initrd http://__SERVERIP__/tftpboot/${ISODIR}/oginitrd.img
    boot

    :fallback
    set ISODIR ogLive
    kernel http://__SERVERIP__/tftpboot/${ISODIR}/ogvmlinuz ${kernelargs}
    initrd http://__SERVERIP__/tftpboot/${ISODIR}/oginitrd.img
    boot
    ```

#### Ejemplo de Solicitud
```bash
curl -X 'POST' \
  'http://172.17.8.37/ogboot/v1/pxe-templates' \
  -H 'Content-Type: application/json' \
  -d '{
        "name_template": "mi_plantilla.ipxe",
        "content_template": "#!ipxe\nset timeout 0\nset timeout-style hidden\nset ISODIR __OGLIVE__\nset default 0\nset kernelargs __INFOHOST__\n:try_iso\nkernel http://__SERVERIP__/tftpboot/${ISODIR}/ogvmlinuz ${kernelargs} || goto fallback\ninitrd http://__SERVERIP__/tftpboot/${ISODIR}/oginitrd.img\nboot\n\n:fallback\nset ISODIR ogLive\nkernel http://__SERVERIP__/tftpboot/${ISODIR}/ogvmlinuz ${kernelargs}\ninitrd http://__SERVERIP__/tftpboot/${ISODIR}/oginitrd.img\nboot\n"
      }'
```

#### Respuestas

- **Código 200 OK:** La plantilla de arranque se creó exitosamente.
  - **Ejemplo de Respuesta:**
    ```json
    {
        "success": "Plantilla creada con éxito",
        "message": {
            "template_name": "mi_plantilla.ipxe",
            "template_content": "#!ipxe\nset timeout 0\nset timeout-style hidden\nset ISODIR __OGLIVE__\nset default 0\nset kernelargs __INFOHOST__\n:try_iso\nkernel http://__SERVERIP__/tftpboot/${ISODIR}/ogvmlinuz ${kernelargs} || goto fallback\ninitrd http://__SERVERIP__/tftpboot/${ISODIR}/oginitrd.img\nboot\n\n:fallback\nset ISODIR ogLive\nkernel http://__SERVERIP__/tftpboot/${ISODIR}/ogvmlinuz ${kernelargs}\ninitrd http://__SERVERIP__/tftpboot/${ISODIR}/oginitrd.img\nboot\n"
        }
    }
    ```

- **Código 400 Bad Request:** Datos no válidos o faltan los parámetros `name_template` o `content_template`.
  - **Ejemplo de Respuesta:**
    ```json
    {
        "error": "INVALID_INPUT",
        "message": "Faltan datos requeridos: name_template y content_template son necesarios."
    }
    ```

- **Código 403 Forbidden:** Intento de acceso no autorizado fuera del directorio de plantillas.
  - **Ejemplo de Respuesta:**
    ```json
    {
        "error": "UNAUTHORIZED_ACCESS",
        "message": "Intento de acceso no autorizado fuera del directorio de plantillas."
    }
    ```

- **Código 500 Internal Server Error:** Ocurrió un error al crear la plantilla de arranque.
  - **Ejemplo de Respuesta:**
    ```json
    {
        "error": "FILE_CREATION_ERROR",
        "message": "Ocurrió un error al crear la plantilla de arranque."
    }
    ```


### Eliminar Plantilla

Este endpoint elimina una plantilla de arranque PXE en el servidor utilizando el nombre proporcionado.

**URL:** `/ogboot/v1/pxe-templates/{name}`  
**Método HTTP:** DELETE  

#### Parámetros de Solicitud

- **name** (obligatorio): Nombre de la plantilla de arranque que se desea eliminar.
  - **Ejemplo**: `"mi_plantilla.ipxe"`

#### Ejemplo de Solicitud
```bash
curl -X 'DELETE' \
  'http://172.17.8.37/ogboot/v1/pxe-templates/mi_plantilla.ipxe' \
  -H 'accept: application/json'
```

#### Respuestas

- **Código 200 OK:** La plantilla de arranque se eliminó correctamente.
  - **Ejemplo de Respuesta:**
    ```json
    {
        "success": "Plantilla eliminada",
        "message": "La plantilla mi_plantilla se ha borrado correctamente"
    }
    ```

- **Código 404 Not Found:** No se encontró ninguna plantilla de arranque con el nombre especificado.
  - **Ejemplo de Respuesta:**
    ```json
    {
        "error": "TEMPLATE_NOT_FOUND",
        "message": "No se encontró la plantilla especificada"
    }
    ```

- **Código 500 Internal Server Error:** Ocurrió un error al eliminar la plantilla de arranque.
  - **Ejemplo de Respuesta:**
    ```json
    {
        "error": "FAILED_TO_DELETE_TEMPLATE",
        "message": "Ocurrió un error al intentar eliminar la plantilla"
    }
    ```

