diff --git a/src/OgBootBundle/Controller/OgBootController.php b/src/OgBootBundle/Controller/OgBootController.php index 5ef16f5..c38d811 100644 --- a/src/OgBootBundle/Controller/OgBootController.php +++ b/src/OgBootBundle/Controller/OgBootController.php @@ -512,10 +512,10 @@ public function setOgliveDefault(Request $request): Response * @OA\JsonContent( * type="object", * @OA\Property( - * property="isoname", + * property="iso_url", * type="string", - * example="ogLive-focal-5.13.0-27-beta-amd64-r20210706.5b4bf5f.iso", - * description="Name of the ogLive ISO to install" + * example="https://ognproject.evlt.uma.es/trac/downloads/ogLive-focal-5.13.0-27-beta-amd64-r20210706.5b4bf5f.iso", + * description="Full URL of the ogLive ISO to install" * ) * ) * ), @@ -547,12 +547,12 @@ public function installOglive(Request $request): Response { $data = json_decode($request->getContent(), true); - if (!isset($data['isoname'])) { + if (!isset($data['iso_url'])) { return new JsonResponse(['error' => 'Invalid input data'], Response::HTTP_BAD_REQUEST); } - $isoname = $data['isoname']; - $result = $this->curlRequestService->callOgLive("download " . escapeshellarg($isoname)); + $isoUrl = $data['iso_url']; + $result = $this->curlRequestService->callOgLive("download " . escapeshellarg($isoUrl)); if (is_array($result) && isset($result['success']) && $result['success'] === false) { return new JsonResponse(['error' => 'Failed to install ogLive client', 'details' => $result['error']], Response::HTTP_INTERNAL_SERVER_ERROR); @@ -561,8 +561,7 @@ public function installOglive(Request $request): Response return new JsonResponse(['message' => 'ogLive client installed successfully', 'details' => $result], Response::HTTP_OK); } - - + /** * @Route("/ogboot/v1/oglives/{checksum}", name="uninstallOglive", methods={"DELETE"}) * @OA\Delete( @@ -1068,6 +1067,7 @@ public function getBootFile(string $mac): Response return new Response($content, Response::HTTP_OK, ['Content-Type' => 'text/plain']); } + /** * @Route("/ogboot/v1/pxe-templates", methods={"POST"}) * @@ -1080,7 +1080,7 @@ public function getBootFile(string $mac): Response * @OA\JsonContent( * type="object", * @OA\Property(property="name_template", type="string", example="pxe"), - * @OA\Property(property="content_template", type="string", example="#!ipxe\nset timeout 0\nset timeout-style hidden\n\nset ISODIR ogLive\nset default 0\nset kernelargs INFOHOST\nkernel tftp://SERVERIP/ogLive/ogvmlinuz ${kernelargs}\ninitrd tftp://SERVERIP/ogLive/oginitrd.img\nboot") + * @OA\Property(property="content_template", type="string", example="#!ipxe\nset timeout 0\nset timeout-style hidden\n\nset ISODIR __OGLIVE__\nset default 0\nset kernelargs __INFOHOST__\n# Menú de entrada para seleccionar OgLive\n:try_iso\nkernel tftp://__SERVERIP__/${ISODIR}/ogvmlinuz ${kernelargs} || goto fallback\ninitrd tftp://__SERVERIP__/${ISODIR}/oginitrd.img\nboot\n\n:fallback\necho \"OgLive default\"\nset ISODIR ogLive\nkernel tftp://__SERVERIP__/${ISODIR}/ogvmlinuz ${kernelargs}\ninitrd tftp://__SERVERIP__/${ISODIR}/oginitrd.img\nboot") * ) * ), * @OA\Response( @@ -1089,7 +1089,7 @@ public function getBootFile(string $mac): Response * @OA\JsonContent( * type="object", * @OA\Property(property="message", type="string", example="Plantilla creada exitosamente."), - * @OA\Property(property="template", type="string", example="#!ipxe\nset timeout 0\nset timeout-style hidden\n\nset ISODIR ogLive\nset default 0\nset kernelargs INFOHOST\nkernel tftp://SERVERIP/ogLive/ogvmlinuz ${kernelargs}\ninitrd tftp://SERVERIP/ogLive/oginitrd.img\nboot") + * @OA\Property(property="template", type="string", example="#!ipxe\nset timeout 0\nset timeout-style hidden\n\nset ISODIR __OGLIVE__\nset default 0\nset kernelargs __INFOHOST__\n# Menú de entrada para seleccionar OgLive\n:try_iso\nkernel tftp://__SERVERIP__/${ISODIR}/ogvmlinuz ${kernelargs} || goto fallback\ninitrd tftp://__SERVERIP__/${ISODIR}/oginitrd.img\nboot\n\n:fallback\necho \"OgLive default\"\nset ISODIR ogLive\nkernel tftp://__SERVERIP__/${ISODIR}/ogvmlinuz ${kernelargs}\ninitrd tftp://__SERVERIP__/${ISODIR}/oginitrd.img\nboot") * ) * ), * @OA\Response( diff --git a/src/OgBootBundle/Service/CurlRequestService.php b/src/OgBootBundle/Service/CurlRequestService.php index 570ae5d..4f077af 100644 --- a/src/OgBootBundle/Service/CurlRequestService.php +++ b/src/OgBootBundle/Service/CurlRequestService.php @@ -19,128 +19,24 @@ class CurlRequestService return $bits; } + // src/Service/CurlRequestService.php -public function installOglive($isoname) -{ - $socketPath = '/tmp/oglive_daemon.sock'; - $socket = socket_create(AF_UNIX, SOCK_STREAM, 0); - if ($socket === false) { - syslog(LOG_ERR, 'Error al crear el socket: ' . socket_strerror(socket_last_error())); - return ['success' => false, 'output' => 'Error al crear el socket']; - } - - $result = socket_connect($socket, $socketPath); - if ($result === false) { - syslog(LOG_ERR, 'Error al conectar con el socket: ' . socket_strerror(socket_last_error($socket))); - socket_close($socket); - return ['success' => false, 'output' => 'Error al conectar con el socket']; - } - - $command = [ - 'action' => 'download', - 'args' => [$isoname] - ]; - - socket_write($socket, json_encode($command), strlen(json_encode($command))); - - $response = ''; - $status = []; - - while ($buffer = socket_read($socket, 2048)) { - $response .= $buffer; - $status[] = json_decode($buffer, true); - } - - socket_close($socket); - - // Analiza el último estado recibido - $lastStatus = end($status); - if ($lastStatus && $lastStatus['status'] === 'completed') { - return ['success' => true, 'output' => $lastStatus]; - } else { - return ['success' => false, 'output' => $status]; - } -} - - - public function callOgLive($parameter) { - $socketPath = '/var/run/oglive/oglive_daemon.sock'; - - file_put_contents('/tmp/serviceOglive.log', 'callOgLive called with parameter: ' . $parameter . PHP_EOL, FILE_APPEND); - - $socket = socket_create(AF_UNIX, SOCK_STREAM, 0); - if ($socket === false) { - $error = 'Error al crear el socket: ' . socket_strerror(socket_last_error()); - file_put_contents('/tmp/serviceOglive.log', 'Socket creation error: ' . $error . PHP_EOL, FILE_APPEND); - return [ - 'success' => false, - 'error' => $error - ]; - } + // Ruta completa al script oglivecli + $ogLiveCliPath = sprintf("%s/bin/oglivecli", dirname(dirname(dirname(__DIR__)))); - $result = socket_connect($socket, $socketPath); - if ($result === false) { - $error = 'Error al conectar con el socket: ' . socket_strerror(socket_last_error($socket)); - file_put_contents('/tmp/serviceOglive.log', 'Socket connection error: ' . $error . PHP_EOL, FILE_APPEND); - socket_close($socket); - return [ - 'success' => false, - 'error' => $error - ]; - } + // Construir el comando sin sudo ni contraseña + $command = sprintf('%s %s', $ogLiveCliPath, escapeshellarg($parameter)); - $args = array_map('trim', explode(' ', $parameter)); - $action = array_shift($args); - $command = [ - 'action' => $action, - 'args' => $args - ]; + // Registrar el comando en syslog para depuración + syslog(LOG_INFO, 'command ' . $command); - socket_write($socket, json_encode($command), strlen(json_encode($command))); + // Ejecutar el comando + $output = shell_exec($command); - $response = ''; - while ($buffer = socket_read($socket, 2048)) { - $response .= $buffer; - } - - socket_close($socket); - - file_put_contents('/tmp/serviceOglive.log', 'Raw response: ' . $response . PHP_EOL, FILE_APPEND); - - if (empty($response)) { - $error = 'Respuesta vacía del demonio'; - file_put_contents('/tmp/serviceOglive.log', 'Empty response error: ' . $error . PHP_EOL, FILE_APPEND); - return [ - 'success' => false, - 'error' => $error - ]; - } - - $decodedResponse = json_decode($response, true); - - if (json_last_error() !== JSON_ERROR_NONE) { - $error = 'Error al decodificar JSON: ' . json_last_error_msg(); - file_put_contents('/tmp/serviceOglive.log', 'JSON decode error: ' . $error . PHP_EOL, FILE_APPEND); - return [ - 'success' => false, - 'error' => $error - ]; - } - - if (isset($decodedResponse['success']) && $decodedResponse['success']) { - file_put_contents('/tmp/serviceOglive.log', 'Decoded successful response: ' . json_encode($decodedResponse['output']) . PHP_EOL, FILE_APPEND); - return $decodedResponse['output']; - } else { - $error = $decodedResponse['error'] ?? 'Unknown error'; - file_put_contents('/tmp/serviceOglive.log', 'Error in response: ' . $error . PHP_EOL, FILE_APPEND); - return [ - 'success' => false, - 'error' => $error - ]; - } + return $output; }