From 2fe1e64ef9d6012542d0593776b988bbe4d65119 Mon Sep 17 00:00:00 2001 From: lgromero Date: Wed, 15 May 2024 14:58:47 +0200 Subject: [PATCH] refs #311 adds pxe CRUD endpoints --- .../Controller/OgBootController.php | 165 ++++++++++++++++++ 1 file changed, 165 insertions(+) diff --git a/src/OgBootBundle/Controller/OgBootController.php b/src/OgBootBundle/Controller/OgBootController.php index 79cfa0f..57367ee 100644 --- a/src/OgBootBundle/Controller/OgBootController.php +++ b/src/OgBootBundle/Controller/OgBootController.php @@ -561,6 +561,171 @@ Regenerar plantilla - PUT /ogboot/pxe-templates } } + +/** + * @Route("/ogboot/v1/pxes", name="config", methods={"GET"}) + * @OA\Get( + * path="/ogboot/v1/pxes", + * summary="Get ogboot configuration", + * @OA\Response( + * response=200, + * description="Successful operation", + * @OA\JsonContent( + * type="object", + * @OA\Property( + * property="config-file", + * type="string", + * description="Configuration file path" + * ), + * @OA\Property( + * property="download-url", + * type="string", + * description="ogLive download URL" + * ), + * @OA\Property( + * property="download-dir", + * type="string", + * description="ogLive download directory" + * ), + * @OA\Property( + * property="install-dir", + * type="string", + * description="ogLive installation directory" + * ), + * @OA\Property( + * property="default-name", + * type="string", + * description="Default ogLive name" + * ), + * @OA\Property( + * property="min-release", + * type="string", + * description="Minimum compatibility release" + * ) + * ) + * ), + * @OA\Response( + * response=500, + * description="Failed to retrieve configuration" + * ) + * ) + */ +public function getBootFiles(): JsonResponse +{ + // Ruta donde están alojados los archivos de arranque + $directory = '/opt/ogboot/tftpboot/ipxe_scripts'; + + // Escanea el directorio y obtiene la lista de archivos de arranque + $files = scandir($directory); + + // Filtra los archivos que no son directorios ni archivos ocultos + $bootFiles = array_filter($files, function ($file) { + return !in_array($file, ['.', '..', '.gitkeep']) && !is_dir($file); + }); + + // Construye la respuesta JSON con la lista de archivos de arranque + $response = [ + 'boot_files' => array_values($bootFiles) + ]; + + // Devuelve la respuesta JSON + return new JsonResponse($response, Response::HTTP_OK); +} + + /** + * @Route("/ogboot/v1/pxes/{mac}", name="ogboot_boot_file", methods={"GET"}) + */ + public function getBootFile(string $mac): Response + { + // Ruta donde están alojados los archivos de arranque + $directory = '/opt/ogboot/tftpboot/ipxe_scripts'; + + // Genera el nombre del archivo basado en la dirección MAC + $fileName = "01-" . $mac; + + // Path completo del archivo + $filePath = "$directory/$fileName"; + + // Verifica si el archivo existe + if (!file_exists($filePath)) { + // Devuelve una respuesta 404 si no se encuentra el archivo de arranque + return new Response(null, Response::HTTP_NOT_FOUND); + } + + // Lee el contenido del archivo + $content = file_get_contents($filePath); + + // Devuelve el contenido del archivo como texto plano + return new Response($content, Response::HTTP_OK, ['Content-Type' => 'text/plain']); + } + + + /** + * @Route("/ogboot/v1/pxes", name="ogboot_create_boot_file", methods={"POST"}) + */ + public function createBootFile(Request $request): Response + { + // Obtener los datos del cuerpo de la solicitud + $requestData = json_decode($request->getContent(), true); + + // Verificar si los datos necesarios están presentes en la solicitud + if (!isset($requestData['mac']) || !isset($requestData['config'])) { + return new JsonResponse(['error' => 'Los datos de la solicitud son incorrectos'], Response::HTTP_BAD_REQUEST); + } + + // Directorio donde se almacenarán los archivos de arranque + $directory = '/opt/ogboot/tftpboot/ipxe_scripts'; + + // Generar el nombre del archivo basado en la dirección MAC + $fileName = "01-" . str_replace(':', '-', $requestData['mac']); + + // Ruta completa del archivo + $filePath = "$directory/$fileName"; + + // Contenido del archivo de arranque + $fileContent = $requestData['config']; + + // Intentar crear el archivo de arranque + if (file_put_contents($filePath, $fileContent) === false) { + // Devolver un error si no se puede crear el archivo + return new JsonResponse(['error' => 'Error al crear el archivo de arranque'], Response::HTTP_INTERNAL_SERVER_ERROR); + } + + // Devolver una respuesta de éxito si el archivo se creó correctamente + return new JsonResponse(['message' => 'El archivo de arranque se creó exitosamente'], Response::HTTP_OK); + } + + /** + * @Route("/ogboot/v1/pxes/{mac}", name="ogboot_delete_boot_file", methods={"DELETE"}) + */ + public function deleteBootFile(string $mac): Response + { + // Directorio donde están almacenados los archivos de arranque + $directory = '/opt/ogboot/tftpboot/ipxe_scripts'; + + // Generar el nombre del archivo basado en la dirección MAC + $fileName = "01-" . str_replace(':', '-', $mac); + + // Ruta completa del archivo + $filePath = "$directory/$fileName"; + + // Verificar si el archivo existe + if (!file_exists($filePath)) { + // Devolver un error 404 si el archivo no se encuentra + return new JsonResponse(['error' => 'No se encontró ningún archivo de arranque con la dirección MAC especificada'], Response::HTTP_NOT_FOUND); + } + + // Intentar eliminar el archivo de arranque + if (!unlink($filePath)) { + // Devolver un error 500 si no se puede eliminar el archivo + return new JsonResponse(['error' => 'Error al eliminar el archivo de arranque'], Response::HTTP_INTERNAL_SERVER_ERROR); + } + + // Devolver una respuesta de éxito si el archivo se eliminó correctamente + return new JsonResponse(['message' => 'El archivo de arranque se eliminó correctamente'], Response::HTTP_OK); + } + + /** * @OA\Post( * path="/poweroff",