## API de DHCP

La API de DHCP proporciona una interfaz para interactuar con el servidor DHCP de Kea. Esta API permite realizar operaciones como obtener la configuración actual del servidor DHCP, actualizar la configuración y obtener información sobre las reservas de direcciones IP.

Los endpoints están agrupados en el recurso al que hace referencia. Actualmente se gestionan cuatro recursos:

- `/dhcp/conf/`: Gestiona todo lo relativo a la configuración de Kea DHCP.
- `/dhcp/subnet/`: CRUD de subredes de Kea DHCP. Las subredes serán donde se organizarán los hosts y hacen referencia a las subredes montadas por el aula.
- `/dhcp/subnet/host/`: CRUD de hosts en la configuración de Kea DHCP. Los hosts hacen referencia a los ordenadores dados de alta en las aulas. Esta sección en Kea DHCP se encarga de asignar, dada la MAC del dispositivo, la IP y el boot-file-name del ordenador. 
- `/dhcp/connection/`: CRUD de conexiones al API de Kea DHCP. Las conexiones provienen de una tabla guardada en Mysql y hacen referencia a las conexiones por IP y puerto a cualquier agente de Kea (local o remoto) que es el encargado de proporcionar una interfaz RESTful para la modificación de la configuración de los servidores DHCP4 de Kea.

El presente documento detalla los endpoints del API con sus respectivos parámetros de entrada así como los cambios que aplican sobre la configuración de Kea DHCP.

### Recurso `/dhcp/conf`

#### Restaurar configuración DHCP

Restaurar la última configuración de Kea DHCP que se haya guardado en el sistema. Cada modificación que se lleve a cabo en la configuración de Kea genera un respaldo en el directorio `/opt/opengnsys/etc/kea/backup`

**Método HTTP:** POST

**URL:** `/dhcp/conf/backup`

#### Obtener toda la configuración DHCP

Devuelve toda la configuración de Kea DHCP que se encuentra cargada en memoria en el sistema.

**Método HTTP:** GET

**URL:** `/dhcp/conf`

#### Guardar configuración completa DHCP

Guarda la configuración completa de Kea DHCP en el sistema.

**Método HTTP:** POST

**URL:** `/dhcp/conf/save`

**Parámetros de entrada:**

- `configurationText`: Texto de configuración de Kea DHCP en formato JSON.

#### Escribir en la configuración de Kea DHCP

Aplica los cambios cargados en memoria sobre el fichero de configuración final de Kea DHCP. 

El servicio de Kea DHCP utiliza la configuración cargada en memoria para llevar a cabo las operaciones pero al reiniciar el servicio carga la configuración guardada en su fichero de configuración que suele estar alojada en `/etc/kea/kea-dhcp4.conf` (puede variar dependiendo de la instalación de kea). Todos la configuración cargada en memoria es eliminada.

Con este endpoint sobreescribe la configuración que tiene el servicio cargado en memoria en el fichero de configuración final de Kea DHCP.

**Método HTTP:** POST

**URL:** `/dhcp/conf/apply`

#### Importar fichero DHCP

Importa un archivo de configuración de Kea DHCP en el sistema.

**Método HTTP:** POST

**URL:** `/dhcp/upload`

**Parámetros de entrada:**

- `file_input_name`: Nombre del archivo de configuración de Kea DHCP a importar.

### Recurso `/dhcp/subnet`

#### Obtener configuración de las subredes

Devuelve las subredes dadas de alta en la configuración de Kea DHCP. 


**Método HTTP:** GET

**URL:** `/dhcp/subnet`


#### Añadir subred

Añade un nueva subred a la configuración de Kea DHCP.

**Método HTTP:** POST

**URL:** `/dhcp/subnet/`

**Parámetros de entrada:**

- `name`: Nombre de la subred.
- `subnet`: DirecciónIP de la subred.
- `boot-file-name`: Archivo de arranque de la subred.
- `nextServer`: Dirección IP del next-server.

#### Borrar subred DHCP

Borrar una subred de la configuración de Kea DHCP.

**Método HTTP:** DELETE

**URL:** `/dhcp/subnet/{id_subnet}`


#### Modificar Host DHCP

Modificar la subred en la configuración de Kea DHCP.

**Método HTTP:** PUT

**URL:** `/dhcp/subnet/{id_subnet}`

**Parámetros de entrada:**

- `name`: Nombre de la subred.
- `subnet`: DirecciónIP de la subred.
- `boot-file-name`: Archivo de arranque de la subred.
- `nextServer`: Dirección IP del next-server.


### Recurso `/dhcp/subnet/host`

#### Obtener configuración de los hosts

Devuelve la configuración de los hosts que se encuentran bajo una subred en la configuración de Kea DHCP. 


**Método HTTP:** GET

**URL:** `/dhcp/subnet/{id_subnet}/host`


#### Añadir Host DHCP

Añade un nuevo host a la subnet especificada.

**Método HTTP:** POST

**URL:** `/dhcp/subnet/{id_subnet}/host`

**Parámetros de entrada:**

- `host`: Nombre del host.
- `macAddress`: Dirección MAC del host.
- `address`: Dirección IP del host.
- `nextServer`: Dirección IP del next-server.

#### Borrar Host DHCP

Borrar un host de la subnet especificada.

**Método HTTP:** DELETE

**URL:** `/dhcp/subnet/{id_subnet}/host`

**Parámetros de entrada:**

- `host`: Nombre del host.

#### Modificar Host DHCP

Modificar la configuración de un host en la subnet especificada.

**Método HTTP:** PUT

**URL:** `/dhcp/subnet/{id_subnet}/subnet/host`

**Parámetros de entrada:**

- `host`: Nombre del host.
- `oldMacAddress`: Dirección MAC antigua del host.
- `oldAddress`: Dirección IP antigua del host.
- `macAddress`: Nueva dirección MAC del host.
- `address`: Nueva dirección IP del host.
- `nextServer`: Nueva dirección IP del servidor siguiente.

### Recurso `/dhcp/connection`

#### Obtener configuración de las conexiones

Devuelve la configuración de las conexiones que se encuentran almacenadas en la tabla SQL correspondiente en MySQL. 

**Método HTTP:** GET

**URL:** `/dhcp/connection`


#### Obtener status de las conexion

Realiza una solicitud al servicio Kea DHCP y devuelve el estado de la conexión basada en la respuesta.

**Método HTTP:** GET

**URL:** `/dhcp/connection/status`


#### Añadir Conexión

Añade una nueva conexión a la tabla de conexiones en MySQL.

**Método HTTP:** POST

**URL:** `/dhcp/connection`

**Parámetros de entrada:**

- `ip`: Dirección IP de la conexión.
- `puerto`: Puerto de la conexión.
- `idCentro`: Identificador del centro.

### Borrar Conexión

Borra una conexión de la tabla de conexiones en MySQL.

**Método HTTP:** DELETE

**URL:** `/dhcp/connection`

**Parámetros de entrada:**

- `ip`: Dirección IP de la conexión.

### Modificar Conexión

Modifica la configuración de una conexión en la tabla de conexiones en MySQL.

**Método HTTP:** PUT

**URL:** `/dhcp/connection`

**Parámetros de entrada:**

- `idConnection`: Identificador de la conexión.
- `ip`: Nueva dirección IP de la conexión.
- `puerto`: Nuevo puerto de la conexión.
- `idCentro`: Nuevo identificador del centro.

### Establecer Conexión

Aplica una conexión de tal forma que todas las llamadas al API DHCP de Opengnsys utilizarán esa conexión para comunicarse con el servicio de Kea DHCP.

**Método HTTP:** POST

**URL:** `/dhcp/connection/apply`

**Parámetros de entrada:**

- `idConnection`: Identificador de la conexión.


## Flujo de trabajo

Con esta construcción del API establecemos un flujo de trabajo habitual que consistirá de la siguiente forma:

1- Consulta de todas las conexiones DHCP `GET /dhcp/connection`
2- Aplicar conexión DHCP `POST /dhcp/connection/apply`.
3- Cambios en la configuración DHCP utilizando la conexión previamente establecida.
4- Validar cambios y reescribirla configuración del servidor de Kea DHCP con los nuevos cambios `POST /dhcp/apply`.

