# Sistema de Arranque (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.04
- **Python 3**: La instalación ha sido probada 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. 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"
}
```

Donde:

| Parámetro | Descripción |
| --- | --- |
| `ogCore_ServerIP` | IP del servidor ogcore |
| `ogBoot_ServerIP` | IP del servidor ogboot |
| `ogBoot_Dir` | Directorio de instalación de ogboot |
| `ogBootSambaUser` | Usuario de Samba |
| `ogBootSambaPass` | 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.

A continuación se detallan los endpoints disponibles, sus parámetros de entrada y las acciones que llevan a cabo.

---

## Estado del Servidor

### 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:** `GET`

#### Ejemplo de Solicitud

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

#### Respuestas

##### Éxito (200 OK)

```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"
        }
    }
}
```

##### Error (404 Not Found)

```json
{
    "error": "NOT_FOUND",
    "message": "No default or installed ogLives found."
}
```

##### Error (500 Internal Server Error)

```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"
}
```

---

## Gestión de ogLives

### Obtener Menú de Descargas de ogLive

Devuelve la lista de ISOs de ogLive disponibles para descargar.

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

#### Ejemplo de Solicitud

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

#### Respuestas

##### Éxito (200 OK)

```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
        }
    ]
}
```

##### Error (500 Internal Server Error)

```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:** `GET`

#### Ejemplo de Solicitud

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

#### Respuestas

##### Éxito (200 OK)

```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"
            }
        ]
    }
}
```

##### Error (404 Not Found)

```json
{
    "error": "NOT_FOUND",
    "message": "No ogLive clients found."
}
```

##### Error (500 Internal Server Error)

```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:** `GET`

#### Parámetros de Ruta

| Parámetro | Tipo | Descripción | Ejemplo |
|-----------|------|-------------|---------|
| `checksum` | string | Checksum del cliente `ogLive` instalado | `9e49a085ba74f97a81bdf9b3d0785094` |

#### Ejemplo de Solicitud

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

#### Respuestas

##### Éxito (200 OK)

```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"
    }
}
```

##### Error (404 Not Found)

```json
{
    "error": "NOT_FOUND",
    "message": "ogLive client with checksum 9e49a085ba74f97a81bdf9b3d0785094 not found."
}
```

##### Error (500 Internal Server Error)

```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:** `GET`

#### Ejemplo de Solicitud

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

#### Respuestas

##### Éxito (200 OK)

```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"
    }
}
```

##### Error (500 Internal Server Error)

```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:** `PUT`

#### Cuerpo de la Solicitud

```json
{
    "checksum": "9e49a085ba74f97a81bdf9b3d0785094"
}
```

| Parámetro | Tipo | Descripción | Requerido |
|-----------|------|-------------|-----------|
| `checksum` | string | Checksum del cliente `ogLive` a establecer como predeterminado | Sí |

#### 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

##### Éxito (200 OK)

```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"
    }
}
```

##### Error (400 Bad Request)

```json
{
    "error": "INVALID_INPUT",
    "message": "Invalid input data: checksum is required."
}
```

##### Error (500 Internal Server Error)

```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:** `POST`

#### Cuerpo de la Solicitud

```json
{
    "url": "https://ognproject.evlt.uma.es/trac/downloads/ogLive-focal-5.11.0-22-generic-amd64-r20210413.992ebb9.iso",
    "id": "12345"
}
```

| Parámetro | Tipo | Descripción | Requerido |
|-----------|------|-------------|-----------|
| `url` | string | URL del archivo ISO de `ogLive` a descargar e instalar | Sí |
| `id` | string | ID único de transacción para rastrear el proceso de instalación | Sí |

#### 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

##### Éxito (202 Accepted)

```json
{
    "success": "ogLive client installation started",
    "transaction_id": "12345"
}
```

##### Error (400 Bad Request)

```json
{
    "error": "Invalid input data",
    "details": "URL and transaction ID are required."
}
```

##### Error (500 Internal Server Error)

```json
{
    "error": "Failed to initiate ogLive installation",
    "details": "Detalles del error específico"
}
```

!!! note "Proceso asíncrono"
    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:** `DELETE`

#### Parámetros de Ruta

| Parámetro | Tipo | Descripción | Ejemplo |
|-----------|------|-------------|---------|
| `checksum` | string | Checksum del cliente `ogLive` a desinstalar | `9e49a085ba74f97a81bdf9b3d0785094` |

#### Ejemplo de Solicitud

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

#### Respuestas

##### Éxito (200 OK)

```json
{
    "message": "ogLive client uninstalled successfully",
    "details": "Detalles adicionales de la desinstalación."
}
```

##### Error (404 Not Found)

```json
{
    "error": "NOT_FOUND",
    "message": "ogLive client not found."
}
```

##### Error (403 Forbidden)

```json
{
    "error": "FORBIDDEN",
    "message": "Cannot uninstall the default ogLive client."
}
```

##### Error (500 Internal Server Error)

```json
{
    "error": "SERVER_ERROR",
    "message": "Failed to uninstall ogLive client."
}
```

o

```json
{
    "error": "UNKNOWN_ERROR",
    "message": "An unknown error occurred."
}
```

---

## Gestión de Archivos PXE

### Obtener todos los ficheros de arranque

Devuelve la lista de archivos de arranque PXE disponibles.

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

#### Ejemplo de Solicitud

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

#### Respuestas

##### Éxito (200 OK)

```json
{
    "success": "Boot files retrieved successfully",
    "message": [
        "01-00-50-56-aa-bb-cc",
        "01-00-50-56-dd-ee-ff"
    ]
}
```

##### Error (404 Not Found)

```json
{
    "error": "NOT_FOUND",
    "message": "No boot files found."
}
```

##### Error (500 Internal Server Error)

```json
{
    "error": "SERVER_ERROR",
    "message": "Failed to retrieve boot files: directory not found."
}
```

### Obtener fichero de arranque

Devuelve el archivo de arranque para una dirección MAC específica, incluyendo los parámetros de configuración.

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

#### Parámetros de Ruta

| Parámetro | Tipo | Descripción | Ejemplo |
|-----------|------|-------------|---------|
| `mac` | string | Dirección MAC para la cual se recuperará el archivo de arranque | `00:50:56:22:11:12` |

#### Ejemplo de Solicitud

```bash
curl -X GET \
  'http://172.17.8.37/ogboot/v1/pxes/00:50:56:22:11:12' \
  -H 'accept: application/json'
```

#### Respuestas

##### Éxito (200 OK) - Caso 1: Archivo de arranque con parámetros

```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"
    }
}
```

##### Éxito (200 OK) - Caso 2: Archivo de arranque por disco (sin parámetros)

```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."
    }
}
```

##### Error (404 Not Found)

```json
{
    "error": "NOT_FOUND",
    "message": "No boot file found for the specified MAC address."
}
```

##### Error (500 Internal Server Error)

```json
{
    "error": "SERVER_ERROR",
    "message": "An error occurred while retrieving the boot file."
}
```

### 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:** `POST`

#### Cuerpo de la 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"
}
```

| Parámetro | Tipo | Descripción | Requerido |
|-----------|------|-------------|-----------|
| `mac` | string | Dirección MAC para el archivo de arranque | Sí |
| `template_name` | string | Nombre de la plantilla a utilizar | Sí |
| `server_ip` | string | Dirección IP del servidor | No |
| `oglivedir` | string | Directorio ogLive a utilizar en el arranque | No |
| `lang` | string | Idioma de la configuración regional | No |
| `ip` | string | Dirección IP | No |
| `router` | string | Dirección IP gateway | No |
| `netmask` | string | Máscara de red | No |
| `computer_name` | string | Nombre del equipo | No |
| `netiface` | string | Interfaz de red | No |
| `group` | string | Grupo de la máquina | No |
| `ogrepo` | string | IP del servidor de ogrepositorio | No |
| `oglive` | string | IP del servidor tftpboot | No |
| `oglog` | string | IP del servidor de logs | No |
| `ogshare` | string | IP del servidor ogclient | No |
| `ogprof` | string | Indica si es profesor | No |
| `hardprofile` | string | Perfil de hardware | No |
| `ogntp` | string | IP del servidor NTP | No |
| `ogdns` | string | IP del servidor DNS | No |
| `ogproxy` | string | IP del servidor proxy | No |
| `ogunit` | string | Directorio de unidad | No |
| `resolution` | string | Resolución de pantalla | No |

#### Ejemplo de Solicitud

```bash
curl -X POST \
  'http://172.17.8.37/ogboot/v1/pxes' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
        "mac": "00:50:56:22:11:12",
        "template_name": "mi_plantilla.ipxe",
        "server_ip": "192.168.2.1",
        "oglivedir": "ogLive"
      }'
```

#### Respuestas

##### Éxito (200 OK)

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

##### Error (400 Bad Request)

```json
{
    "error": "INVALID_INPUT",
    "message": "Missing required fields: mac and template_name"
}
```

##### Error (404 Not Found)

```json
{
    "error": "TEMPLATE_NOT_FOUND",
    "message": "No se encontró la plantilla especificada"
}
```

##### Error (500 Internal Server Error)

```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:** `DELETE`

#### Parámetros de Ruta

| Parámetro | Tipo | Descripción | Ejemplo |
|-----------|------|-------------|---------|
| `mac` | string | Dirección MAC del cliente cuyo archivo de arranque se va a eliminar | `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

##### Éxito (200 OK)

```json
{
    "success": "Boot file deleted successfully",
    "message": "The boot file for MAC 00:11:22:33:44:55 has been deleted."
}
```

##### Error (404 Not Found)

```json
{
    "error": "NOT_FOUND",
    "message": "No boot file found for the specified MAC address."
}
```

##### Error (500 Internal Server Error)

```json
{
    "error": "SERVER_ERROR",
    "message": "Failed to delete the boot file due to server error."
}
```

---

## Gestión de Plantillas PXE

### 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:** `GET`

#### Ejemplo de Solicitud

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

#### Respuestas

##### Éxito (200 OK)

```json
{
    "success": "Lista de plantillas obtenida con éxito",
    "message": [
        "mi_plantilla.ipxe",
        "otra_plantilla.ipxe"
    ]
}
```

##### Error (500 Internal Server Error)

```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:** `GET`

#### Parámetros de Ruta

| Parámetro | Tipo | Descripción | Ejemplo |
|-----------|------|-------------|---------|
| `templateName` | string | Nombre de la plantilla PXE a consultar | `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

##### Éxito (200 OK)

```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"
}
```

##### Error (404 Not Found)

```json
{
    "error": "TEMPLATE_NOT_FOUND",
    "message": "No se encontró la plantilla especificada"
}
```

##### Error (500 Internal Server Error)

```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:** `POST`

#### Cuerpo de la Solicitud

```json
{
    "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"
}
```

| Parámetro | Tipo | Descripción | Requerido |
|-----------|------|-------------|-----------|
| `name_template` | string | Nombre de la nueva plantilla | Sí |
| `content_template` | string | Contenido de la plantilla, que debe incluir el script de arranque | Sí |

#### 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

##### Éxito (200 OK)

```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"
    }
}
```

##### Error (400 Bad Request)

```json
{
    "error": "INVALID_INPUT",
    "message": "Faltan datos requeridos: name_template y content_template son necesarios."
}
```

##### Error (403 Forbidden)

```json
{
    "error": "UNAUTHORIZED_ACCESS",
    "message": "Intento de acceso no autorizado fuera del directorio de plantillas."
}
```

##### Error (500 Internal Server Error)

```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:** `DELETE`

#### Parámetros de Ruta

| Parámetro | Tipo | Descripción | Ejemplo |
|-----------|------|-------------|---------|
| `name` | string | Nombre de la plantilla de arranque que se desea eliminar | `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

##### Éxito (200 OK)

```json
{
    "success": "Plantilla eliminada",
    "message": "La plantilla mi_plantilla se ha borrado correctamente"
}
```

##### Error (404 Not Found)

```json
{
    "error": "TEMPLATE_NOT_FOUND",
    "message": "No se encontró la plantilla especificada"
}
```

##### Error (500 Internal Server Error)

```json
{
    "error": "FAILED_TO_DELETE_TEMPLATE",
    "message": "Ocurrió un error al intentar eliminar la plantilla"
}
```

## Glosario de términos

| Término | Descripción |
|---------|-------------|
| **PXE** | Preboot Execution Environment - Entorno de arranque que permite iniciar un ordenador a través de la red |
| **ogLive** | Cliente de arranque remoto utilizado por OpenGnsys |
| **ogBoot** | Componente de OpenGnsys que facilita la funcionalidad de arranque remoto |
| **ogCore** | Servidor principal de OpenGnsys que gestiona la operación del sistema |
| **Checksum** | Valor hash que identifica de manera única a un cliente ogLive instalado |
| **ISO** | Archivo de imagen que contiene un cliente ogLive |
| **TFTP** | Trivial File Transfer Protocol - Protocolo utilizado para transferir los archivos durante el arranque remoto |
