From 394a71134c144ae3aa7be53935053a1ff9f8e0f6 Mon Sep 17 00:00:00 2001 From: lgromero Date: Mon, 13 Jan 2025 11:32:31 +0100 Subject: [PATCH] refs #1204 Fix missing comprobations in update subnet --- src/DhcpBundle/Controller/DhcpController.php | 63 +++++++++++++++----- 1 file changed, 48 insertions(+), 15 deletions(-) diff --git a/src/DhcpBundle/Controller/DhcpController.php b/src/DhcpBundle/Controller/DhcpController.php index 3805f61..4156ea8 100644 --- a/src/DhcpBundle/Controller/DhcpController.php +++ b/src/DhcpBundle/Controller/DhcpController.php @@ -904,14 +904,15 @@ public function addDhcpSubnet(Request $request): JsonResponse * ) * ) */ + public function modifyDhcpSubnet(Request $request): JsonResponse { + $subnetId = (int) $request->get('subnetId'); $operation = 'modifyDhcpSubnet'; $component = 'ogdhcp'; - $subnetId = (int) $request->get('subnetId'); try { - $input = json_decode($request->getContent(), false); + $input = json_decode($request->getContent()); $mask = htmlspecialchars($input->mask); $address = htmlspecialchars($input->address); @@ -935,7 +936,6 @@ public function modifyDhcpSubnet(Request $request): JsonResponse ], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)); return new JsonResponse(['error' => "Falta un parámetro requerido: $paramFaltante"], Response::HTTP_BAD_REQUEST); } - $this->logger->error(json_encode([ 'severity' => 'ERROR', 'operation' => $operation, @@ -983,7 +983,7 @@ public function modifyDhcpSubnet(Request $request): JsonResponse $newSubnet = [ "id" => $subnetId, "subnet" => $subnetName, - "reservations" => $existingSubnet['reservations'], + "reservations" => $existingSubnet['reservations'], // Mantener las reservas existentes "option-data" => [ [ "name" => "routers", @@ -993,15 +993,38 @@ public function modifyDhcpSubnet(Request $request): JsonResponse ] ]; + // Añadir next-server si está presente, o eliminarlo de las reservas si no está if ($nextServer) { $newSubnet["next-server"] = $nextServer; + } else { + foreach ($newSubnet['reservations'] as &$reservation) { + unset($reservation['next-server']); + } } + + // Añadir boot-file-name si está presente, o eliminarlo de las reservas si no está if ($bootFileName) { $newSubnet["boot-file-name"] = $bootFileName; + } else { + 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; + } + if ($bootFileName) { + $reservation['boot-file-name'] = $bootFileName; + } + } + + // Reemplazar la subred en la configuración $response[0]['arguments']['Dhcp4']['subnet4'][$subnetIndex] = $newSubnet; + // Eliminar el campo 'hash' si existe if (isset($response[0]['arguments']['hash'])) { unset($response[0]['arguments']['hash']); } @@ -1025,16 +1048,27 @@ public function modifyDhcpSubnet(Request $request): JsonResponse ], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)); return new JsonResponse(['error' => $errorText], Response::HTTP_BAD_REQUEST); } else { - $responseSuccess = "Subred modificada correctamente"; - $this->logger->info(json_encode([ - 'severity' => 'INFO', - 'operation' => $operation, - 'component' => $component, - 'http_code' => Response::HTTP_OK, - 'desc' => $responseSuccess, - 'params' => ['subnet_id' => $subnetId] - ], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)); - return new JsonResponse(['success' => $responseSuccess], Response::HTTP_OK); + $responseWrite = $this->curlKeaService->executeCurlCommand('config-write', $configuration); + if ($responseWrite == false || $responseWrite[0]["result"] != 0) { + return new JsonResponse(['error' => "Error al escribir en la configuración en Kea DHCP: " . $responseWrite[0]["text"]], 400); + } else { + // Volvemos a consultar la configuración para devolver la subred modificada + $updatedResponse = $this->curlKeaService->executeCurlCommand('config-get'); + $updatedSubnet = array_filter($updatedResponse[0]['arguments']['Dhcp4']['subnet4'], function ($subnet) use ($subnetId) { + return $subnet['id'] == $subnetId; + }); + + $responseSuccess = "Subred modificada correctamente"; + $this->logger->info(json_encode([ + 'severity' => 'INFO', + 'operation' => $operation, + 'component' => $component, + 'http_code' => Response::HTTP_OK, + 'desc' => $responseSuccess, + 'params' => ['subnet_id' => $subnetId] + ], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)); + return new JsonResponse(['success' => $responseSuccess], Response::HTTP_OK); + } } } else { $errorText = "Error configuración de Kea inválida: " . $responseTest[0]["text"]; @@ -1062,7 +1096,6 @@ public function modifyDhcpSubnet(Request $request): JsonResponse - /** * @OA\Get(