refs #999 #943 standardize output in pxe endpoints, now creates pxe files in lower case

pull/5/head
Luis Gerardo Romero Garcia 2024-10-22 07:45:29 +00:00
parent ff4a18be08
commit 1e406be464
1 changed files with 151 additions and 88 deletions

View File

@ -737,7 +737,6 @@ public function uninstallOglive(string $checksum): Response
/**
* @Route("/ogboot/v1/pxes", name="get_boot_files", methods={"GET"})
* @OA\Get(
@ -749,7 +748,12 @@ public function uninstallOglive(string $checksum): Response
* @OA\JsonContent(
* type="object",
* @OA\Property(
* property="boot_files",
* property="success",
* type="string",
* example="Boot files retrieved successfully"
* ),
* @OA\Property(
* property="message",
* type="array",
* @OA\Items(
* type="string",
@ -766,24 +770,42 @@ public function uninstallOglive(string $checksum): Response
*/
public function getBootFiles(): JsonResponse
{
$directory = '/opt/ogboot/tftpboot/ipxe_scripts';
// Verificar si el directorio existe
if (!is_dir($directory)) {
return new JsonResponse(
['error' => 'SERVER_ERROR', 'message' => 'Failed to retrieve boot files: directory not found.'],
Response::HTTP_INTERNAL_SERVER_ERROR
);
}
// Obtener la lista de archivos
$files = scandir($directory);
// Filtrar los archivos que comiencen con '01-' y excluir directorios
$bootFiles = array_filter($files, function ($file) use ($directory) {
return !is_dir($directory . '/' . $file) && strpos($file, '01-') === 0;
});
// Si no se encuentran archivos
if (empty($bootFiles)) {
return new JsonResponse(
['error' => 'NOT_FOUND', 'message' => 'No boot files found.'],
Response::HTTP_NOT_FOUND
);
}
// Formatear la respuesta de éxito
$response = [
'boot_files' => array_values($bootFiles)
'success' => 'Boot files retrieved successfully',
'message' => array_values($bootFiles)
];
return new JsonResponse($response, Response::HTTP_OK);
}
/**
* @Route("/ogboot/v1/pxes/{mac}", name="ogboot_get_boot_file_with_params", methods={"GET"})
* @OA\Get(
@ -801,53 +823,72 @@ public function getBootFiles(): JsonResponse
* description="Successful operation",
* @OA\JsonContent(
* type="object",
* @OA\Property(property="template_name", type="string", description="Template name", example="pxe"),
* @OA\Property(property="mac", type="string", description="MAC address", example="00:50:56:22:11:12"),
* @OA\Property(property="lang", type="string", description="Language", example="es_ES.UTF-8"),
* @OA\Property(property="ip", type="string", description="IP address", example="192.168.2.11"),
* @OA\Property(property="server_ip", type="string", description="Server IP address", example="192.168.2.1"),
* @OA\Property(property="router", type="string", description="Router", example="192.168.2.1"),
* @OA\Property(property="netmask", type="string", description="Netmask", example="255.255.255.0"),
* @OA\Property(property="computer_name", type="string", description="Computer name", example="pc11"),
* @OA\Property(property="netiface", type="string", description="Network interface", example="eth0"),
* @OA\Property(property="group", type="string", description="Group", example="Aula_virtual"),
* @OA\Property(property="ogrepo", type="string", description="Repository IP", example="192.168.2.1"),
* @OA\Property(property="oglive", type="string", description="Live server IP", example="192.168.2.1"),
* @OA\Property(property="oglog", type="string", description="Log server IP", example="192.168.2.1"),
* @OA\Property(property="ogshare", type="string", description="Share server IP", example="192.168.2.1"),
* @OA\Property(property="oglivedir", type="string", description="Live directory", example="ogLive"),
* @OA\Property(property="ogprof", type="string", description="Is professor", example="false"),
* @OA\Property(property="hardprofile", type="string", description="Hardware profile", example=""),
* @OA\Property(property="ogntp", type="string", description="NTP server", example=""),
* @OA\Property(property="ogdns", type="string", description="DNS server", example=""),
* @OA\Property(property="ogproxy", type="string", description="Proxy server", example=""),
* @OA\Property(property="ogunit", type="string", description="Unit directory", example=""),
* @OA\Property(property="resolution", type="string", description="Screen resolution", example="788")
* @OA\Property(property="success", type="string", example="Boot file retrieved successfully"),
* @OA\Property(
* property="message",
* type="object",
* @OA\Property(property="template_name", type="string", description="Template name (required)", example="pxe"),
* @OA\Property(property="mac", type="string", description="MAC address (required)", example="00:50:56:22:11:12"),
* @OA\Property(property="lang", type="string", description="Language (optional)", example="es_ES.UTF-8"),
* @OA\Property(property="ip", type="string", description="IP address (optional)", example="192.168.2.11"),
* @OA\Property(property="server_ip", type="string", description="Server IP address (optional)", example="192.168.2.1"),
* @OA\Property(property="router", type="string", description="Router (optional)", example="192.168.2.1"),
* @OA\Property(property="netmask", type="string", description="Netmask (optional)", example="255.255.255.0"),
* @OA\Property(property="computer_name", type="string", description="Computer name (optional)", example="pc11"),
* @OA\Property(property="netiface", type="string", description="Network interface (optional)", example="eth0"),
* @OA\Property(property="group", type="string", description="Group (optional)", example="Aula_virtual"),
* @OA\Property(property="ogrepo", type="string", description="Repository IP (optional)", example="192.168.2.1"),
* @OA\Property(property="oglive", type="string", description="Live server IP (optional)", example="192.168.2.1"),
* @OA\Property(property="oglog", type="string", description="Log server IP (optional)", example="192.168.2.1"),
* @OA\Property(property="ogshare", type="string", description="Share server IP (optional)", example="192.168.2.1"),
* @OA\Property(property="oglivedir", type="string", description="Live directory (optional)", example="ogLive"),
* @OA\Property(property="ogprof", type="string", description="Is professor (optional)", example="false"),
* @OA\Property(property="hardprofile", type="string", description="Hardware profile (optional)", example=""),
* @OA\Property(property="ogntp", type="string", description="NTP server (optional)", example=""),
* @OA\Property(property="ogdns", type="string", description="DNS server (optional)", example=""),
* @OA\Property(property="ogproxy", type="string", description="Proxy server (optional)", example=""),
* @OA\Property(property="ogunit", type="string", description="Unit directory (optional)", example=""),
* @OA\Property(property="resolution", type="string", description="Screen resolution (optional)", example="788")
* )
* )
* ),
* @OA\Response(
* response=404,
* description="No boot file found for the specified MAC address",
* @OA\JsonContent(
* type="object",
* @OA\Property(property="error", type="string", example="NOT_FOUND"),
* @OA\Property(property="message", type="string", example="No boot file found for the specified MAC address.")
* )
* ),
* @OA\Response(
* response=500,
* description="Failed to retrieve boot file"
* description="Internal server error"
* )
* )
*/
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
// Generar el nombre del archivo basado en la dirección MAC
$mac = $this->validateAndFormatMac($mac ?? null);
$fileName = "01-" . $mac;
$filePath = "$directory/$fileName";
$this->logger->info('FilePath: ' . $filePath);
// Verificar si el archivo existe
if (!file_exists($filePath)) {
return new JsonResponse(['error' => 'No se encontró ningún archivo de arranque con la dirección MAC especificada'], Response::HTTP_NOT_FOUND);
return new JsonResponse(
['error' => 'NOT_FOUND', 'message' => 'No boot file found for the specified MAC address.'],
Response::HTTP_NOT_FOUND
);
}
$content = file_get_contents($filePath);
$templateName = 'desconocido'; // Valor por defecto si no se encuentra la plantilla
$templateName = 'unknown'; // Valor por defecto si no se encuentra la plantilla
$contentLines = explode("\n", $content);
// Buscar la plantilla utilizada
@ -861,19 +902,26 @@ public function getBootFile(string $mac): Response
// Extraer los parámetros del contenido del archivo iPXE
preg_match('/set kernelargs (.*)/', $content, $matches);
// Si no encontramos 'kernelargs', podría ser un archivo de arranque por disco
// Si no se encuentran 'kernelargs', podría ser un archivo de arranque por disco
if (!isset($matches[1])) {
return new JsonResponse([
return new JsonResponse(
[
'success' => 'Boot file retrieved successfully',
'message' => [
'template_name' => $templateName,
'mac' => $mac,
'message' => 'Archivo de arranque sin parámetros, posiblemente una plantilla de arranque por disco'
], Response::HTTP_OK);
'message' => 'Boot file without parameters, possibly a disk boot template.'
]
],
Response::HTTP_OK
);
}
// Parsear los argumentos del kernel
$kernelargs = $matches[1];
parse_str(str_replace(' ', '&', $kernelargs), $params);
// Crear la estructura del resultado, incluso si los parámetros son opcionales
// Crear la estructura del resultado
$result = [
'template_name' => $templateName,
'mac' => $mac,
@ -899,7 +947,11 @@ public function getBootFile(string $mac): Response
'resolution' => $params['vga'] ?? '',
];
return new JsonResponse($result, Response::HTTP_OK);
// Formatear la respuesta de éxito
return new JsonResponse(
['success' => 'Boot file retrieved successfully', 'message' => $result],
Response::HTTP_OK
);
}
@ -1081,87 +1133,98 @@ public function createBootFile(Request $request): JsonResponse
], Response::HTTP_OK);
}
function validateAndFormatMac($mac)
{
// Convertir a minúsculas para un formato uniforme
$mac = strtolower($mac);
function validateAndFormatMac($mac)
{
// Primero, convertir a mayúsculas para facilitar la comparación
$mac = strtoupper($mac);
// Comprobar si la MAC tiene el formato correcto con dos puntos (ej. FC:AA:14:21:55:B9)
if (preg_match('/^([0-9A-F]{2}:){5}[0-9A-F]{2}$/', $mac)) {
// Comprobar si la MAC tiene el formato correcto con dos puntos (ej. fc:aa:14:21:55:b9)
if (preg_match('/^([0-9a-f]{2}:){5}[0-9a-f]{2}$/', $mac)) {
return $mac; // MAC ya está en el formato correcto
}
// Comprobar si la MAC tiene el formato sin los dos puntos (ej. FCAA142155B9)
if (preg_match('/^[0-9A-F]{12}$/', $mac)) {
// Comprobar si la MAC tiene el formato sin los dos puntos (ej. fcaa142155b9)
if (preg_match('/^[0-9a-f]{12}$/', $mac)) {
// Insertar los dos puntos en la MAC y devolverla en el formato correcto
return strtoupper(implode(':', str_split($mac, 2)));
return strtolower(implode(':', str_split($mac, 2)));
}
// Si no cumple con ninguno de los formatos, devolver un error
return false; // MAC no válida
}
}
/**
* @Route("/ogboot/v1/pxes/{mac}", name="ogboot_delete_boot_file", methods={"DELETE"})
* @OA\Delete(
* path="/ogboot/v1/pxes/{mac}",
* summary="Eliminar archivo de arranque",
* description="Elimina un archivo de arranque específico utilizando su dirección MAC.",
* summary="Delete PXE boot file",
* description="Delete a specific PXE boot file using its MAC address.",
* @OA\Parameter(
* name="mac",
* in="path",
* description="La dirección MAC del cliente cuyo archivo de arranque se desea eliminar",
* description="MAC address of the client whose boot file is to be deleted",
* required=true,
* @OA\Schema(type="string", example="00:11:22:33:44:55")
* ),
* @OA\Response(
* response=200,
* description="El archivo de arranque se eliminó correctamente",
* description="Boot file deleted successfully",
* @OA\JsonContent(
* type="object",
* @OA\Property(property="message", type="string", example="El archivo de arranque se eliminó correctamente")
* @OA\Property(property="success", type="string", example="Boot file deleted successfully"),
* @OA\Property(property="message", type="string", example="The boot file for MAC 00:11:22:33:44:55 has been deleted.")
* )
* ),
* @OA\Response(
* response=404,
* description="No se encontró ningún archivo de arranque con la dirección MAC especificada",
* description="No boot file found for the specified MAC address",
* @OA\JsonContent(
* type="object",
* @OA\Property(property="error", type="string", example="No se encontró ningún archivo de arranque con la dirección MAC especificada")
* @OA\Property(property="error", type="string", example="No boot file found for the specified MAC address.")
* )
* ),
* @OA\Response(
* response=500,
* description="Error al eliminar el archivo de arranque",
* description="Failed to delete the boot file",
* @OA\JsonContent(
* type="object",
* @OA\Property(property="error", type="string", example="Error al eliminar el archivo de arranque")
* @OA\Property(property="error", type="string", example="Failed to delete the boot file due to server error.")
* )
* )
* )
*/
public function deleteBootFile(string $mac): Response
{
public function deleteBootFile(string $mac): Response
{
$directory = '/opt/ogboot/tftpboot/ipxe_scripts';
// Validar y formatear la dirección MAC
$mac = $this->validateAndFormatMac($mac ?? null);
$fileName = "01-" . $mac;
$filePath = "$directory/$fileName";
// Verificar si el archivo de arranque existe
if (!file_exists($filePath)) {
return new JsonResponse(['error' => 'No se encontró ningún archivo de arranque con la dirección MAC especificada'], Response::HTTP_NOT_FOUND);
return new JsonResponse(
['error' => 'NOT_FOUND', 'message' => 'No boot file found for the specified MAC address.'],
Response::HTTP_NOT_FOUND
);
}
// Intentar eliminar el archivo de arranque
if (!unlink($filePath)) {
return new JsonResponse(
['error' => 'SERVER_ERROR', 'message' => 'Failed to delete the boot file due to server error.'],
Response::HTTP_INTERNAL_SERVER_ERROR
);
}
return new JsonResponse(['error' => 'Error al eliminar el archivo de arranque'], Response::HTTP_INTERNAL_SERVER_ERROR);
}
return new JsonResponse(['message' => 'El archivo de arranque se eliminó correctamente'], Response::HTTP_OK);
}
// Respuesta exitosa con formato estándar
return new JsonResponse(
['success' => 'Boot file deleted successfully', 'message' => "The boot file for MAC $mac has been deleted."],
Response::HTTP_OK
);
}
/**
* @Route("/ogboot/v1/pxe-templates", methods={"GET"})