From 0b6e6f789392242959404003c40649a0eb1d200d Mon Sep 17 00:00:00 2001 From: lgromero Date: Wed, 23 Oct 2024 13:38:37 +0200 Subject: [PATCH] refs #1030 Adds to reservations bootfilename and next server when is modified the subnet to fix priority problem that allows to use global configuration when bootfilename and next server is defined in subnet --- src/DhcpBundle/Controller/DhcpController.php | 58 ++++++++++++++++++-- 1 file changed, 54 insertions(+), 4 deletions(-) diff --git a/src/DhcpBundle/Controller/DhcpController.php b/src/DhcpBundle/Controller/DhcpController.php index 320c824..5e66345 100644 --- a/src/DhcpBundle/Controller/DhcpController.php +++ b/src/DhcpBundle/Controller/DhcpController.php @@ -707,11 +707,14 @@ public function modifyDhcpSubnet(Request $request): JsonResponse // Calcular el gateway añadiendo .1 al final de la subred $gateway = preg_replace('/\d+$/', '1', $address); + // Obtener la subred actual para mantener las reservas existentes + $existingSubnet = $response[0]['arguments']['Dhcp4']['subnet4'][$subnetIndex]; + // Modificar la subred existente $newSubnet = [ "id" => $subnetId, "subnet" => $subnetName, - "reservations" => [], + "reservations" => $existingSubnet['reservations'], // Mantener las reservas existentes "option-data" => [ [ "name" => "routers", @@ -721,16 +724,37 @@ public function modifyDhcpSubnet(Request $request): JsonResponse ] ]; - // Añadir next-server si está presente + // Añadir next-server si está presente, o eliminarlo de las reservas si no está if ($nextServer) { $newSubnet["next-server"] = $nextServer; + } else { + // Eliminar next-server de las reservas si no está presente + foreach ($newSubnet['reservations'] as &$reservation) { + unset($reservation['next-server']); + } } - // Añadir boot-file-name si está presente + // Añadir boot-file-name si está presente, o eliminarlo de las reservas si no está if ($bootFileName) { $newSubnet["boot-file-name"] = $bootFileName; + } else { + // Eliminar boot-file-name de las reservas si no está presente + foreach ($newSubnet['reservations'] as &$reservation) { + unset($reservation['boot-file-name']); + } } + // Actualizar las reservas con los nuevos valores de next-server y boot-file-name + foreach ($newSubnet['reservations'] as &$reservation) { + if ($nextServer) { + $reservation['next-server'] = $nextServer; // Actualizar el next-server del host + } + if ($bootFileName) { + $reservation['boot-file-name'] = $bootFileName; // Actualizar el boot-file-name del host + } + } + + // Reemplazar la subred en la configuración $response[0]['arguments']['Dhcp4']['subnet4'][$subnetIndex] = $newSubnet; // Eliminar el campo 'hash' si existe @@ -770,6 +794,8 @@ public function modifyDhcpSubnet(Request $request): JsonResponse return new JsonResponse(['error' => "Error al obtener la configuración de Kea DHCP: " . $e->getMessage()], 500); } } + + /** * @OA\Get( @@ -978,6 +1004,15 @@ public function addDhcpHost(Request $request, $subnetId): JsonResponse foreach ($response[0]['arguments']['Dhcp4']['subnet4'] as &$subnet) { if ($subnet['id'] == $subnetId) { $subnetFound = true; + + // Añadir boot-file-name y next-server de la subred si están definidos + if (isset($subnet['boot-file-name'])) { + $newHost['boot-file-name'] = $subnet['boot-file-name']; + } + if (isset($subnet['next-server'])) { + $newHost['next-server'] = $subnet['next-server']; + } + if (!isset($subnet['reservations'])) { $subnet['reservations'] = []; } @@ -1049,6 +1084,7 @@ public function addDhcpHost(Request $request, $subnetId): JsonResponse } + /** * @OA\Delete( * path="/ogdhcp/v1/subnets/{subnetId}/hosts", @@ -1309,9 +1345,24 @@ public function updateDhcpHost(Request $request, $subnetId): JsonResponse foreach ($subnet['reservations'] as &$reservation) { if ($reservation['hw-address'] == $oldMacAddress) { $hostFound = true; + + // Conservar boot-file-name y next-server si existen en el host original + $bootFileName = $reservation['boot-file-name'] ?? $subnet['boot-file-name'] ?? null; + $nextServer = $reservation['next-server'] ?? $subnet['next-server'] ?? null; + + // Actualizar los valores del host $reservation['hw-address'] = $macAddress; $reservation['ip-address'] = $address; $reservation['hostname'] = $host; + + // Restaurar boot-file-name y next-server si estaban definidos + if ($bootFileName !== null) { + $reservation['boot-file-name'] = $bootFileName; + } + if ($nextServer !== null) { + $reservation['next-server'] = $nextServer; + } + $updatedHost = $reservation; break; } @@ -1360,7 +1411,6 @@ public function updateDhcpHost(Request $request, $subnetId): JsonResponse } } - /** * @OA\Get( * path="/ogdhcp/v1/backup",