From aaa06152d1406f48686a3332cc44de201be9798d Mon Sep 17 00:00:00 2001 From: lgromero Date: Wed, 2 Oct 2024 13:59:32 +0200 Subject: [PATCH] refs #668 adds status endpoint to dhcp controller --- src/DhcpBundle/Controller/DhcpController.php | 152 +++++++++++-------- 1 file changed, 91 insertions(+), 61 deletions(-) diff --git a/src/DhcpBundle/Controller/DhcpController.php b/src/DhcpBundle/Controller/DhcpController.php index 9d4af1a..42246a9 100644 --- a/src/DhcpBundle/Controller/DhcpController.php +++ b/src/DhcpBundle/Controller/DhcpController.php @@ -71,87 +71,117 @@ class DhcpController */ public function getDhcpStatus(): Response { - // Obtener el uso de disco - $diskUsageResult = $this->getDiskUsage(); - if (!$diskUsageResult) { - return new JsonResponse(['error' => 'Failed to retrieve disk usage'], Response::HTTP_INTERNAL_SERVER_ERROR); + try { + // Obtener el uso de disco + $diskUsageResult = $this->getDiskUsage(); + 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 - { - // 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}'"); - if (!$output) { - $this->logger->error("Failed to execute disk usage command"); - return null; + + private function getDiskUsage(): array + { + // 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}'"); + if (!$output) { + $this->logger->error("Failed to execute disk usage command"); + 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 { $services = [ - 'tftpboot' => 'active', - 'nginx' => 'active', + 'kea-dhcp4-server' => $this->getServiceStatus('kea-dhcp4-server.service'), + 'kea-ctrl-agent' => $this->getServiceStatus('kea-ctrl-agent.service'), + 'nginx' => $this->getServiceStatus('nginx.service') ]; - + 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 { try { + // Ejecutar el comando para obtener la configuración $response = $this->curlKeaService->executeCurlCommand('config-get'); - + + // Verificar si la respuesta es nula if (!$response) { - $this->logger->error('Error: No se pudo acceder al archivo de configuración Kea.'); - return null; + throw new \Exception('Error: No se pudo acceder a la configuración de Kea. Respuesta nula.'); } - + + // Verificar el código de resultado $result_code = $response[0]["result"]; - if ($result_code == 0) { - if (!isset($response[0]['arguments']['Dhcp4']['subnet4'])) { - $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; + if ($result_code != 0) { + throw new \Exception("Error en la configuración de Kea: " . $response[0]["text"]); } + + // 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) { - $this->logger->error("Error al obtener la configuración de Kea DHCP: " . $e->getMessage()); - return null; + // Escalar la excepción para que sea gestionada por la función que llama + throw new \Exception("Error al obtener las subredes: " . $e->getMessage()); } } + /** * @OA\Schema(