refs #668 adds status endpoint to dhcp controller
testing/og-dhcp-API/pipeline/head There was a failure building this commit Details

nginx_conf
Luis Gerardo Romero Garcia 2024-10-02 13:59:32 +02:00
parent 2d391cdd34
commit aaa06152d1
1 changed files with 91 additions and 61 deletions

View File

@ -71,87 +71,117 @@ class DhcpController
*/ */
public function getDhcpStatus(): Response public function getDhcpStatus(): Response
{ {
// Obtener el uso de disco try {
$diskUsageResult = $this->getDiskUsage(); // Obtener el uso de disco
if (!$diskUsageResult) { $diskUsageResult = $this->getDiskUsage();
return new JsonResponse(['error' => 'Failed to retrieve disk usage'], Response::HTTP_INTERNAL_SERVER_ERROR); if (!$diskUsageResult) {
throw new \Exception('Failed to retrieve disk usage');
}
// Obtener el estado de los servicios de ogDHCP
$servicesStatusResult = $this->getServicesStatus();
if (!$servicesStatusResult) {
throw new \Exception('Failed to retrieve services status');
}
// Intentar obtener las subredes, pero si falla devolver un array vacío
$subnetsResult = [];
try {
$subnetsResult = $this->getSubnetsService();
} catch (\Exception $e) {
// Si ocurre un error, simplemente dejar $subnetsResult vacío
$subnetsResult = [];
}
// Componer la respuesta
$response = [
'disk_usage' => $diskUsageResult,
'subnets' => $subnetsResult,
'services_status' => $servicesStatusResult
];
return new JsonResponse(['success' => "Información obtenida con éxito", 'message' => $response], Response::HTTP_OK);
} catch (\Exception $e) {
// Capturar la excepción y devolver el mensaje de error
return new JsonResponse(['error' => $e->getMessage()], Response::HTTP_INTERNAL_SERVER_ERROR);
} }
// Obtener el estado de los servicios de ogDHCP (similar a check_services_status en ogboot)
$servicesStatusResult = $this->getServicesStatus();
if (!$servicesStatusResult) {
return new JsonResponse(['error' => 'Failed to retrieve services status'], Response::HTTP_INTERNAL_SERVER_ERROR);
}
// Obtener las subredes y las reservas asociadas
$subnetsResult = $this->getSubnetsService();
if (!$subnetsResult) {
return new JsonResponse(['error' => 'Failed to retrieve subnets'], Response::HTTP_INTERNAL_SERVER_ERROR);
}
// Componer la respuesta
$response = [
'disk_usage' => $diskUsageResult,
'subnets' => $subnetsResult,
'services_status' => $servicesStatusResult
];
return new JsonResponse($response, Response::HTTP_OK);
} }
private function getDiskUsage(): array private function getDiskUsage(): array
{ {
// Simular la salida del comando df para obtener el uso del disco // Simular la salida del comando df para obtener el uso del disco
$output = shell_exec("df -h /opt/ogdhcp | tail -1 | awk '{print $2, $3, $4, $5}'"); $output = shell_exec("df -h /opt/ogdhcp | tail -1 | awk '{print $2, $3, $4, $5}'");
if (!$output) { if (!$output) {
$this->logger->error("Failed to execute disk usage command"); $this->logger->error("Failed to execute disk usage command");
return null; return null;
}
list($total, $used, $available, $percentage) = explode(' ', $output);
return [
'total' => trim($total),
'used' => trim($used),
'available' => trim($available),
'percentage' => trim($percentage),
];
} }
list($total, $used, $available, $percentage) = explode(' ', $output);
return [
'total' => trim($total),
'used' => trim($used),
'available' => trim($available),
'percentage' => trim($percentage),
];
}
private function getServicesStatus(): array private function getServicesStatus(): array
{ {
$services = [ $services = [
'tftpboot' => 'active', 'kea-dhcp4-server' => $this->getServiceStatus('kea-dhcp4-server.service'),
'nginx' => 'active', 'kea-ctrl-agent' => $this->getServiceStatus('kea-ctrl-agent.service'),
'nginx' => $this->getServiceStatus('nginx.service')
]; ];
return $services; return $services;
} }
private function getServiceStatus(string $service): string
{
// Ejecutar el comando systemctl para verificar el estado del servicio
$output = shell_exec("systemctl is-active " . escapeshellarg($service));
// Si el comando retorna "active", el servicio está corriendo
if (trim($output) === 'active') {
return 'active';
} else {
return 'inactive';
}
}
private function getSubnetsService(): ?array private function getSubnetsService(): ?array
{ {
try { try {
// Ejecutar el comando para obtener la configuración
$response = $this->curlKeaService->executeCurlCommand('config-get'); $response = $this->curlKeaService->executeCurlCommand('config-get');
// Verificar si la respuesta es nula
if (!$response) { if (!$response) {
$this->logger->error('Error: No se pudo acceder al archivo de configuración Kea.'); throw new \Exception('Error: No se pudo acceder a la configuración de Kea. Respuesta nula.');
return null;
} }
// Verificar el código de resultado
$result_code = $response[0]["result"]; $result_code = $response[0]["result"];
if ($result_code == 0) { if ($result_code != 0) {
if (!isset($response[0]['arguments']['Dhcp4']['subnet4'])) { throw new \Exception("Error en la configuración de Kea: " . $response[0]["text"]);
$this->logger->error("El campo 'subnet4' no está inicializado");
return null;
} else {
return $response[0]['arguments']['Dhcp4']['subnet4']; // Subredes y sus reservas
}
} else {
$this->logger->error("Error en la configuración Kea: " . $response[0]["text"]);
return null;
} }
// Verificar si el campo 'subnet4' está presente en la respuesta
if (!isset($response[0]['arguments']['Dhcp4']['subnet4'])) {
throw new \Exception("El campo 'subnet4' no está inicializado. Respuesta: " . json_encode($response[0]['arguments']));
}
// Subredes encontradas, devolver resultado
return $response[0]['arguments']['Dhcp4']['subnet4'];
} catch (\Exception $e) { } catch (\Exception $e) {
$this->logger->error("Error al obtener la configuración de Kea DHCP: " . $e->getMessage()); // Escalar la excepción para que sea gestionada por la función que llama
return null; throw new \Exception("Error al obtener las subredes: " . $e->getMessage());
} }
} }
/** /**
* @OA\Schema( * @OA\Schema(