refs #1205 adds gateway paremeter in subnet
testing/og-dhcp-API/pipeline/head There was a failure building this commit Details

ogdhcp-log opengnsys_devel-0.0.18
Luis Gerardo Romero Garcia 2024-12-05 11:53:05 +01:00
parent d58744c595
commit 27f8babdf7
1 changed files with 134 additions and 134 deletions

View File

@ -28,7 +28,6 @@ class DhcpController
$this->backup_dir = $params->get('backup_dir'); $this->backup_dir = $params->get('backup_dir');
} }
/** /**
* @Route("/ogdhcp/v1/status", name="getDhcpStatus", methods={"GET"}) * @Route("/ogdhcp/v1/status", name="getDhcpStatus", methods={"GET"})
* @OA\Get( * @OA\Get(
@ -300,7 +299,8 @@ public function getSubnets(): JsonResponse
* @OA\Property(property="mask", type="string", example="255.255.255.0"), * @OA\Property(property="mask", type="string", example="255.255.255.0"),
* @OA\Property(property="address", type="string", example="192.168.1.0"), * @OA\Property(property="address", type="string", example="192.168.1.0"),
* @OA\Property(property="nextServer", type="string", example="192.168.1.1"), * @OA\Property(property="nextServer", type="string", example="192.168.1.1"),
* @OA\Property(property="bootFileName", type="string", example="pxelinux.0") * @OA\Property(property="bootFileName", type="string", example="pxelinux.0"),
* @OA\Property(property="router", type="string", example="192.168.1.254")
* ) * )
* ), * ),
* @OA\Response( * @OA\Response(
@ -357,127 +357,126 @@ public function getSubnets(): JsonResponse
* ) * )
* @Route("/ogdhcp/v1/subnets", methods={"POST"}) * @Route("/ogdhcp/v1/subnets", methods={"POST"})
*/ */
public function addDhcpSubnet(Request $request): JsonResponse
{
try {
$input = json_decode($request->getContent());
$subnetId = (int) htmlspecialchars($input->subnetId);
$mask = htmlspecialchars($input->mask);
$address = htmlspecialchars($input->address);
// Verificar si next-server, boot-file-name y router están presentes
$nextServer = isset($input->nextServer) ? htmlspecialchars($input->nextServer) : null;
$bootFileName = isset($input->bootFileName) ? htmlspecialchars($input->bootFileName) : null;
$router = isset($input->router) ? htmlspecialchars($input->router) : null;
public function addDhcpSubnet(Request $request): JsonResponse // Calcular el gatewayIP si no se proporciona el router
{ $gatewayIP = $router ?: substr($address, 0, strrpos($address, '.')) . '.1';
try { } catch (Exception $e) {
$input = json_decode($request->getContent()); $response["message"] = $e->getMessage();
$subnetId = (int) htmlspecialchars($input->subnetId); if (strpos($e->getMessage(), 'Undefined property') !== false) {
$mask = htmlspecialchars($input->mask); preg_match('/Undefined property: stdClass::\$(\w+)/', $e->getMessage(), $matches);
$address = htmlspecialchars($input->address); $paramFaltante = $matches[1] ?? 'desconocido';
return new JsonResponse(['error' => "Falta un parámetro requerido: $paramFaltante"], 400);
}
}
// Verificar si next-server y boot-file-name están presentes try {
$nextServer = isset($input->nextServer) ? htmlspecialchars($input->nextServer) : null; $response = $this->curlKeaService->executeCurlCommand('config-get');
$bootFileName = isset($input->bootFileName) ? htmlspecialchars($input->bootFileName) : null; $subnetName = $address . '/' . $this->curlKeaService->convertMaskToCIDR($mask);
} catch (Exception $e) {
$response["message"] = $e->getMessage();
if (strpos($e->getMessage(), 'Undefined property') !== false) {
preg_match('/Undefined property: stdClass::\$(\w+)/', $e->getMessage(), $matches);
$paramFaltante = $matches[1] ?? 'desconocido';
return new JsonResponse(['error' => "Falta un parámetro requerido: $paramFaltante"], 400);
}
}
try { // Crear el array newSubnet con los valores obligatorios
$response = $this->curlKeaService->executeCurlCommand('config-get'); $newSubnet = [
$subnetName = $address . '/' . $this->curlKeaService->convertMaskToCIDR($mask); "id" => $subnetId,
"subnet" => $subnetName,
"reservations" => [],
"option-data" => [
[
"name" => "routers",
"code" => 3,
"data" => $gatewayIP
]
]
];
// Crear el campo option-data para la puerta de enlace (gateway) // Añadir next-server si está presente
$gatewayIP = substr($address, 0, strrpos($address, '.')) . '.1'; if ($nextServer) {
$newSubnet["next-server"] = $nextServer;
}
// Crear el array newSubnet con los valores obligatorios // Añadir boot-file-name si está presente
$newSubnet = [ if ($bootFileName) {
"id" => $subnetId, $newSubnet["boot-file-name"] = $bootFileName;
"subnet" => $subnetName, }
"reservations" => [],
"option-data" => [
[
"name" => "routers",
"code" => 3,
"data" => $gatewayIP
]
]
];
// Añadir next-server si está presente if (!isset($response[0]['arguments']['Dhcp4']['subnet4'])) {
if ($nextServer) { $response[0]['arguments']['Dhcp4']['subnet4'] = [];
$newSubnet["next-server"] = $nextServer; }
}
// Añadir boot-file-name si está presente $subnets = $response[0]['arguments']['Dhcp4']['subnet4'];
if ($bootFileName) {
$newSubnet["boot-file-name"] = $bootFileName;
}
if (!isset($response[0]['arguments']['Dhcp4']['subnet4'])) { // Verificar si el nombre de la subred o el ID ya existe
$response[0]['arguments']['Dhcp4']['subnet4'] = []; $subnetNameExists = array_reduce($subnets, function ($exists, $subnetElement) use ($subnetName) {
} return $exists || ($subnetElement['subnet'] === $subnetName);
}, false);
$subnets = $response[0]['arguments']['Dhcp4']['subnet4']; $subnetIdExists = array_reduce($subnets, function ($exists, $subnetElement) use ($subnetId) {
return $exists || ($subnetElement['id'] === $subnetId);
}, false);
// Verificar si el nombre de la subred o el ID ya existe if ($subnetNameExists) {
$subnetNameExists = array_reduce($subnets, function ($exists, $subnetElement) use ($subnetName) { return new JsonResponse(['error' => "La subred con la ip '$subnetName' ya existe."], 400);
return $exists || ($subnetElement['subnet'] === $subnetName); } elseif ($subnetIdExists) {
}, false); return new JsonResponse(['error' => "La subred con el ID '$subnetId' ya existe."], 400);
} else {
$response[0]['arguments']['Dhcp4']['subnet4'][] = $newSubnet;
$subnetIdExists = array_reduce($subnets, function ($exists, $subnetElement) use ($subnetId) { // Eliminar el campo 'hash' si existe
return $exists || ($subnetElement['id'] === $subnetId); if (isset($response[0]['arguments']['hash'])) {
}, false); unset($response[0]['arguments']['hash']);
}
if ($subnetNameExists) { $array_encoded = json_encode($response[0]['arguments']);
return new JsonResponse(['error' => "La subred con la ip '$subnetName' ya existe."], 400); $configurationParsed = str_replace('\\', '', $array_encoded);
} elseif ($subnetIdExists) { $configuration = json_decode($configurationParsed);
return new JsonResponse(['error' => "La subred con el ID '$subnetId' ya existe."], 400); $responseTest = $this->curlKeaService->executeCurlCommand('config-test', $configuration);
} else {
$response[0]['arguments']['Dhcp4']['subnet4'][] = $newSubnet;
// Eliminar el campo 'hash' si existe if ($responseTest[0]["result"] == 0) {
if (isset($response[0]['arguments']['hash'])) { $responseSet = $this->curlKeaService->executeCurlCommand('config-set', $configuration);
unset($response[0]['arguments']['hash']); if ($responseSet == false || $responseSet[0]["result"] != 0) {
} return new JsonResponse(['error' => "Error al guardar la configuración en Kea DHCP: " . $responseSet[0]["text"]], 400);
} else {
$responseWrite = $this->curlKeaService->executeCurlCommand('config-write', $configuration);
if ($responseWrite == false || $responseWrite[0]["result"] != 0) {
return new JsonResponse(['error' => "Error al guardar la configuración en Kea DHCP: " . $responseWrite[0]["text"]], 400);
} else {
// Realizar una nueva consulta a Kea para obtener la subred recién creada
$configGetResponse = $this->curlKeaService->executeCurlCommand('config-get');
$array_encoded = json_encode($response[0]['arguments']); // Buscar la subred creada
$configurationParsed = str_replace('\\', '', $array_encoded); $createdSubnet = null;
$configuration = json_decode($configurationParsed); foreach ($configGetResponse[0]['arguments']['Dhcp4']['subnet4'] as $subnet) {
$responseTest = $this->curlKeaService->executeCurlCommand('config-test', $configuration); if ($subnet['id'] == $subnetId) {
$createdSubnet = $subnet;
break;
}
}
if ($responseTest[0]["result"] == 0) { if ($createdSubnet === null) {
$responseSet = $this->curlKeaService->executeCurlCommand('config-set', $configuration); return new JsonResponse(['error' => "No se pudo encontrar la subred creada"], 400);
if ($responseSet == false || $responseSet[0]["result"] != 0) { }
return new JsonResponse(['error' => "Error al guardar la configuración en Kea DHCP: " . $responseSet[0]["text"]], 400);
} else {
$responseWrite = $this->curlKeaService->executeCurlCommand('config-write', $configuration);
if ($responseWrite == false || $responseWrite[0]["result"] != 0) {
return new JsonResponse(['error' => "Error al guardar la configuración en Kea DHCP: " . $responseWrite[0]["text"]], 400);
} else {
// Realizar una nueva consulta a Kea para obtener la subred recién creada
$configGetResponse = $this->curlKeaService->executeCurlCommand('config-get');
// Buscar la subred creada return new JsonResponse(['success' => "Subred agregada correctamente", 'message' => $createdSubnet], 200);
$createdSubnet = null; }
foreach ($configGetResponse[0]['arguments']['Dhcp4']['subnet4'] as $subnet) { }
if ($subnet['id'] == $subnetId) { } else {
$createdSubnet = $subnet; return new JsonResponse(['error' => "Error en la configuración de Kea: " . $responseTest[0]["text"]], 400);
break; }
} }
} } catch (Exception $e) {
return new JsonResponse(['error' => "Error al obtener la configuración de Kea DHCP: " . $e->getMessage()], 500);
if ($createdSubnet === null) { }
return new JsonResponse(['error' => "No se pudo encontrar la subred creada"], 400); }
}
return new JsonResponse(['success' => "Subred agregada correctamente", 'message' => $createdSubnet], 200);
}
}
} else {
return new JsonResponse(['error' => "Error en la configuración de Kea: " . $responseTest[0]["text"]], 400);
}
}
} catch (Exception $e) {
return new JsonResponse(['error' => "Error al obtener la configuración de Kea DHCP: " . $e->getMessage()], 500);
}
}
@ -617,7 +616,7 @@ public function getSubnets(): JsonResponse
} }
} }
/** /**
* @Route("/ogdhcp/v1/subnets/{subnetId}", methods={"PUT"}) * @Route("/ogdhcp/v1/subnets/{subnetId}", methods={"PUT"})
* @OA\Put( * @OA\Put(
* path="/ogdhcp/v1/subnets/{subnetId}", * path="/ogdhcp/v1/subnets/{subnetId}",
@ -636,6 +635,7 @@ public function getSubnets(): JsonResponse
* type="object", * type="object",
* @OA\Property(property="mask", type="string"), * @OA\Property(property="mask", type="string"),
* @OA\Property(property="address", type="string"), * @OA\Property(property="address", type="string"),
* @OA\Property(property="router", type="string", example="192.168.1.254"),
* @OA\Property(property="nextServer", type="string"), * @OA\Property(property="nextServer", type="string"),
* @OA\Property(property="bootFileName", type="string") * @OA\Property(property="bootFileName", type="string")
* ) * )
@ -650,12 +650,12 @@ public function getSubnets(): JsonResponse
* ), * ),
* @OA\Response( * @OA\Response(
* response=400, * response=400,
* description="Error occurred while deleting the subnet", * description="Error occurred while modifying the subnet",
* @OA\JsonContent( * @OA\JsonContent(
* oneOf={ * oneOf={
* @OA\Schema(@OA\Property(property="error", type="string", example="Falta un parámetro requerido: $paramFaltante")), * @OA\Schema(@OA\Property(property="error", type="string", example="Falta un parámetro requerido: $paramFaltante")),
* @OA\Schema(@OA\Property(property="error", type="string", example="No hay subredes definidas")), * @OA\Schema(@OA\Property(property="error", type="string", example="No hay subredes definidas")),
* @OA\Schema(@OA\Property(property="error", type="string", example="Error configuracion de kea invalido")), * @OA\Schema(@OA\Property(property="error", type="string", example="Error configuración de Kea inválido")),
* @OA\Schema(@OA\Property(property="error", type="string", example="Error al guardar la configuración en Kea DHCP")), * @OA\Schema(@OA\Property(property="error", type="string", example="Error al guardar la configuración en Kea DHCP")),
* @OA\Schema(@OA\Property(property="error", type="string", example="Error al escribir en la configuración en Kea DHCP")) * @OA\Schema(@OA\Property(property="error", type="string", example="Error al escribir en la configuración en Kea DHCP"))
* } * }
@ -682,9 +682,13 @@ public function modifyDhcpSubnet(Request $request): JsonResponse
$mask = htmlspecialchars($input->mask); $mask = htmlspecialchars($input->mask);
$address = htmlspecialchars($input->address); $address = htmlspecialchars($input->address);
// Verificar si next-server y boot-file-name están presentes // Verificar si next-server, boot-file-name y router están presentes
$nextServer = isset($input->nextServer) ? htmlspecialchars($input->nextServer) : null; $nextServer = isset($input->nextServer) ? htmlspecialchars($input->nextServer) : null;
$bootFileName = isset($input->bootFileName) ? htmlspecialchars($input->bootFileName) : null; $bootFileName = isset($input->bootFileName) ? htmlspecialchars($input->bootFileName) : null;
$router = isset($input->router) ? htmlspecialchars($input->router) : null;
// Calcular el gateway añadiendo .1 al final de la subred si no se proporciona el router
$gateway = $router ?: preg_replace('/\d+$/', '1', $address);
} catch (Exception $e) { } catch (Exception $e) {
if (strpos($e->getMessage(), 'Undefined property') !== false) { if (strpos($e->getMessage(), 'Undefined property') !== false) {
preg_match('/Undefined property: stdClass::\$(\w+)/', $e->getMessage(), $matches); preg_match('/Undefined property: stdClass::\$(\w+)/', $e->getMessage(), $matches);
@ -707,9 +711,6 @@ public function modifyDhcpSubnet(Request $request): JsonResponse
if ($subnetIndex === false) { if ($subnetIndex === false) {
return new JsonResponse(['error' => "La subred con el id '$subnetId' no existe"], 400); return new JsonResponse(['error' => "La subred con el id '$subnetId' no existe"], 400);
} else { } else {
// 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 // Obtener la subred actual para mantener las reservas existentes
$existingSubnet = $response[0]['arguments']['Dhcp4']['subnet4'][$subnetIndex]; $existingSubnet = $response[0]['arguments']['Dhcp4']['subnet4'][$subnetIndex];
@ -731,7 +732,6 @@ public function modifyDhcpSubnet(Request $request): JsonResponse
if ($nextServer) { if ($nextServer) {
$newSubnet["next-server"] = $nextServer; $newSubnet["next-server"] = $nextServer;
} else { } else {
// Eliminar next-server de las reservas si no está presente
foreach ($newSubnet['reservations'] as &$reservation) { foreach ($newSubnet['reservations'] as &$reservation) {
unset($reservation['next-server']); unset($reservation['next-server']);
} }
@ -741,7 +741,6 @@ public function modifyDhcpSubnet(Request $request): JsonResponse
if ($bootFileName) { if ($bootFileName) {
$newSubnet["boot-file-name"] = $bootFileName; $newSubnet["boot-file-name"] = $bootFileName;
} else { } else {
// Eliminar boot-file-name de las reservas si no está presente
foreach ($newSubnet['reservations'] as &$reservation) { foreach ($newSubnet['reservations'] as &$reservation) {
unset($reservation['boot-file-name']); unset($reservation['boot-file-name']);
} }
@ -750,10 +749,10 @@ public function modifyDhcpSubnet(Request $request): JsonResponse
// Actualizar las reservas con los nuevos valores de next-server y boot-file-name // Actualizar las reservas con los nuevos valores de next-server y boot-file-name
foreach ($newSubnet['reservations'] as &$reservation) { foreach ($newSubnet['reservations'] as &$reservation) {
if ($nextServer) { if ($nextServer) {
$reservation['next-server'] = $nextServer; // Actualizar el next-server del host $reservation['next-server'] = $nextServer;
} }
if ($bootFileName) { if ($bootFileName) {
$reservation['boot-file-name'] = $bootFileName; // Actualizar el boot-file-name del host $reservation['boot-file-name'] = $bootFileName;
} }
} }
@ -790,7 +789,7 @@ public function modifyDhcpSubnet(Request $request): JsonResponse
} }
} }
} else { } else {
return new JsonResponse(['error' => "Error configuracion de kea invalido: " . $responseTest[0]["text"]], 400); return new JsonResponse(['error' => "Error configuración de Kea inválida: " . $responseTest[0]["text"]], 400);
} }
} }
} catch (Exception $e) { } catch (Exception $e) {
@ -800,6 +799,7 @@ public function modifyDhcpSubnet(Request $request): JsonResponse
/** /**
* @OA\Get( * @OA\Get(
* path="/ogdhcp/v1/subnets/{subnetId}/hosts", * path="/ogdhcp/v1/subnets/{subnetId}/hosts",