diff --git a/config/packages/monolog.yaml b/config/packages/monolog.yaml index 59cb0fb..c5b6aba 100644 --- a/config/packages/monolog.yaml +++ b/config/packages/monolog.yaml @@ -44,19 +44,16 @@ when@prod: level: error formatter: App\Formatter\CustomLineFormatter channels: ["!event"] - console: - type: console - process_psr_3_messages: false - channels: ["!event", "!doctrine"] syslog: type: syslog ident: "ogcore" - level: info + level: error formatter: App\Formatter\CustomLineFormatter channels: ["!event"] deprecation: type: stream channels: [deprecation] path: "%kernel.logs_dir%/%kernel.environment%.log" + level: error formatter: monolog.formatter.json diff --git a/src/Command/CheckClientAvailability.php b/src/Command/CheckClientAvailability.php index fb63a9f..da74d71 100644 --- a/src/Command/CheckClientAvailability.php +++ b/src/Command/CheckClientAvailability.php @@ -36,7 +36,7 @@ class CheckClientAvailability extends Command $threshold = (new \DateTime())->modify(' - '.self::THRESHOLD_MINUTES . ' minutes'); $startQueryTime = microtime(true); - $validStatuses = [ClientStatus::OG_LIVE, ClientStatus::WINDOWS, ClientStatus::LINUX, ClientStatus::MACOS]; + $validStatuses = [ClientStatus::OG_LIVE, ClientStatus::WINDOWS, ClientStatus::LINUX, ClientStatus::MACOS, ClientStatus::INITIALIZING, ClientStatus::LINUX_SESSION, ClientStatus::WINDOWS_SESSION]; $query = $this->entityManager->createQuery( 'UPDATE App\Entity\Client c diff --git a/src/Command/ExecutePendingTracesCommand.php b/src/Command/ExecutePendingTracesCommand.php new file mode 100644 index 0000000..71fbbd0 --- /dev/null +++ b/src/Command/ExecutePendingTracesCommand.php @@ -0,0 +1,49 @@ +entityManager->getRepository(Trace::class) + ->findBy(['status' => TraceStatus::PENDING]); + + $count = count($traces); + $io->info("Found $count pending traces"); + + foreach ($traces as $trace) { + $trace->setStatus(TraceStatus::IN_PROGRESS); + $this->entityManager->persist($trace); + } + + $this->entityManager->flush(); + + $executionTime = microtime(true) - $startTime; + $io->success("Updated $count traces to IN_PROGRESS status"); + $io->note("Execution time: " . round($executionTime, 3) . "s"); + + return Command::SUCCESS; + } +} \ No newline at end of file diff --git a/src/Controller/CancelMultipleTracesAction.php b/src/Controller/CancelMultipleTracesAction.php new file mode 100644 index 0000000..3fc55e1 --- /dev/null +++ b/src/Controller/CancelMultipleTracesAction.php @@ -0,0 +1,35 @@ +traces as $trace) { + /** @var Trace $trace */ + $trace = $trace->getEntity(); + + $trace->setStatus(TraceStatus::CANCELLED); + $this->entityManager->persist($trace); + } + + $this->entityManager->flush(); + + return new JsonResponse(data: 'Traces cancelled successfully', status: Response::HTTP_OK); + } +} \ No newline at end of file diff --git a/src/Controller/OgAgent/LoginAction.php b/src/Controller/OgAgent/LoginAction.php index 67d6058..7730767 100644 --- a/src/Controller/OgAgent/LoginAction.php +++ b/src/Controller/OgAgent/LoginAction.php @@ -53,7 +53,8 @@ class LoginAction extends AbstractOgAgentController } if ($client->getStatus() !== ClientStatus::OG_LIVE) { - throw new BadRequestHttpException('Client is not in OG_LIVE status'); + $this->createService->__invoke($client, CommandTypes::LOGIN, TraceStatus::PENDING, null, []); + continue; } $data = [ @@ -73,7 +74,8 @@ class LoginAction extends AbstractOgAgentController ); if (isset($response['error']) && $response['code'] === Response::HTTP_INTERNAL_SERVER_ERROR) { - throw new BadRequestHttpException('Error logging in: '.$response['error']); + $this->createService->__invoke($client, CommandTypes::LOGIN, TraceStatus::PENDING, null, []); + continue; } $this->logger->info('Login client', ['client' => $client->getId()]); diff --git a/src/Controller/OgAgent/PartitionAssistantAction.php b/src/Controller/OgAgent/PartitionAssistantAction.php index a443de1..8d54721 100644 --- a/src/Controller/OgAgent/PartitionAssistantAction.php +++ b/src/Controller/OgAgent/PartitionAssistantAction.php @@ -111,7 +111,12 @@ class PartitionAssistantAction extends AbstractOgAgentController $this->logger->info('Partition assistant', ['client' => $client->getId()]); if (isset($response['error']) && $response['code'] === Response::HTTP_INTERNAL_SERVER_ERROR) { - throw new BadRequestHttpException('Error occurred while partitioning'); + if ($input->queue) { + $this->createService->__invoke($client, CommandTypes::PARTITION_AND_FORMAT, TraceStatus::PENDING, null, $data); + continue; + } + + continue; } $jobId = $response['job_id']; diff --git a/src/Controller/OgAgent/PowerOffAction.php b/src/Controller/OgAgent/PowerOffAction.php index 19ac568..2be4269 100644 --- a/src/Controller/OgAgent/PowerOffAction.php +++ b/src/Controller/OgAgent/PowerOffAction.php @@ -47,12 +47,10 @@ class PowerOffAction extends AbstractOgAgentController throw new BadRequestHttpException('IP is required'); } - if ($client->getStatus() === ClientStatus::OFF) { + if ($client->getStatus() === ClientStatus::OFF || $client->getStatus() === ClientStatus::TURNING_OFF || $client->getStatus() === ClientStatus::DISCONNECTED) { continue; } - $endpoint = $client->getStatus() === ClientStatus::OG_LIVE ? 'opengnsys/Apagar' : 'opengnsys/poweroff'; - $data = [ 'nfn' => 'Apagar', 'ids' => '0' @@ -60,7 +58,7 @@ class PowerOffAction extends AbstractOgAgentController $response = $this->createRequest( method: 'POST', - url: 'https://'.$client->getIp().':8000/'.$endpoint, + url: 'https://'.$client->getIp().':8000/opengnsys/Apagar', params: [ 'json' => $data, ], @@ -68,7 +66,14 @@ class PowerOffAction extends AbstractOgAgentController ); if (isset($response['error']) && $response['code'] === Response::HTTP_INTERNAL_SERVER_ERROR) { - throw new BadRequestHttpException('Error deploying image'); + $this->logger->error('Error powering off client', ['client' => $client->getId(), 'error' => $response['error']]); + + if ($input->queue) { + $this->createService->__invoke($client, CommandTypes::SHUTDOWN, TraceStatus::PENDING, null, []); + continue; + } + + continue; } $this->logger->info('Powering off client', ['client' => $client->getId()]); diff --git a/src/Controller/OgAgent/RebootAction.php b/src/Controller/OgAgent/RebootAction.php index 411ff7e..60f18d5 100644 --- a/src/Controller/OgAgent/RebootAction.php +++ b/src/Controller/OgAgent/RebootAction.php @@ -47,8 +47,6 @@ class RebootAction extends AbstractOgAgentController throw new BadRequestHttpException('IP is required'); } - $endpoint = $client->getStatus() === ClientStatus::OG_LIVE ? 'opengnsys/Reiniciar' : '/opengnsys/reboot'; - $data = [ 'nfn' => 'Reiniciar', 'ids' => '0' @@ -56,7 +54,7 @@ class RebootAction extends AbstractOgAgentController $response = $this->createRequest( method: 'POST', - url: 'https://'.$client->getIp().':8000/'.$endpoint, + url: 'https://'.$client->getIp().':8000/opengnsys/Reiniciar', params: [ 'json' => $data, ], @@ -64,7 +62,12 @@ class RebootAction extends AbstractOgAgentController ); if (isset($response['error']) && $response['code'] === Response::HTTP_INTERNAL_SERVER_ERROR) { - throw new BadRequestHttpException('Error deploying image'); + if ($input->queue) { + $this->createService->__invoke($client, CommandTypes::REBOOT, TraceStatus::PENDING, null, []); + continue; + } + + continue; } $this->logger->info('Rebooting client', ['client' => $client->getId()]); diff --git a/src/Controller/OgAgent/RemoveCacheImageAction.php b/src/Controller/OgAgent/RemoveCacheImageAction.php index 8de9ff7..f7fa159 100644 --- a/src/Controller/OgAgent/RemoveCacheImageAction.php +++ b/src/Controller/OgAgent/RemoveCacheImageAction.php @@ -43,10 +43,11 @@ class RemoveCacheImageAction extends AbstractOgAgentController } if ($client->getStatus() !== ClientStatus::OG_LIVE) { - throw new BadRequestHttpException('Client is not in OG_LIVE status'); + $this->createService->__invoke($client, CommandTypes::REMOVE_CACHE_IMAGE, TraceStatus::PENDING, null, []); + continue; } - $script = `rm%20-r%20/opt/opengnsys/cache/opt/opengnsys/images/{$partition->getImage()->getName()}.*@'`; + $script = 'rm -r /opt/opengnsys/cache/opt/opengnsys/images/' . $partition->getImage()->getName() . '.*'; $data = [ 'nfn' => 'EjecutarScript', @@ -64,9 +65,13 @@ class RemoveCacheImageAction extends AbstractOgAgentController ); if (isset($response['error']) && $response['code'] === Response::HTTP_INTERNAL_SERVER_ERROR) { - throw new BadRequestHttpException('Error logging in: '.$response['error']); + if ($input->queue) { + $this->createService->__invoke($client, CommandTypes::REMOVE_CACHE_IMAGE, TraceStatus::PENDING, null, []); + continue; + } + + continue; } - $this->logger->info('Login client', ['client' => $client->getId()]); $jobId = $response['job_id']; diff --git a/src/Controller/OgAgent/RunScriptAction.php b/src/Controller/OgAgent/RunScriptAction.php index eb9112a..16d95ee 100644 --- a/src/Controller/OgAgent/RunScriptAction.php +++ b/src/Controller/OgAgent/RunScriptAction.php @@ -57,7 +57,17 @@ class RunScriptAction extends AbstractOgAgentController ); if (isset($response['error']) && $response['code'] === Response::HTTP_INTERNAL_SERVER_ERROR) { - throw new BadRequestHttpException('Error deploying image'); + $this->logger->error('Error running script', ['client' => $client->getId(), 'error' => $response['error']]); + + if ($input->queue) { + $inputData = [ + 'script' => $input->script, + ]; + $this->createService->__invoke($client, CommandTypes::RUN_SCRIPT, TraceStatus::PENDING, null, $inputData); + continue; + } + + continue; } $this->logger->info('Powering off client', ['client' => $client->getId()]); diff --git a/src/Controller/OgRepository/Image/DeployImageAction.php b/src/Controller/OgRepository/Image/DeployImageAction.php index 8b8eb8c..2ca149d 100644 --- a/src/Controller/OgRepository/Image/DeployImageAction.php +++ b/src/Controller/OgRepository/Image/DeployImageAction.php @@ -35,6 +35,7 @@ class DeployImageAction extends AbstractOgRepositoryController $params = [ 'json' => [ 'ID_img' => $data->getImageFullsum(), + //'image_name' => $data->getName(), 'bitrate' => (string) $input->mcastSpeed.'M', 'ip' => $input->mcastIp, 'port' => $input->mcastPort, @@ -54,6 +55,11 @@ class DeployImageAction extends AbstractOgRepositoryController $content = $this->createRequest('POST', 'http://'.$repository->getIp().':8006/ogrepository/v1/'.$type, $params); + // Verificar si la respuesta contiene un error HTTP 500 + if (isset($content['code']) && $content['code'] === Response::HTTP_INTERNAL_SERVER_ERROR) { + throw new \Exception('Error del servidor OgRepository: ' . ($content['error'] ?? 'Error desconocido') . ' - ' . ($content['details'] ?? '')); + } + return new JsonResponse(data: [], status: Response::HTTP_OK); } } \ No newline at end of file diff --git a/src/Controller/OgRepository/Image/TransferAction.php b/src/Controller/OgRepository/Image/TransferAction.php index 61e3088..badbfa7 100644 --- a/src/Controller/OgRepository/Image/TransferAction.php +++ b/src/Controller/OgRepository/Image/TransferAction.php @@ -62,6 +62,8 @@ class TransferAction extends AbstractOgRepositoryController $inputData = [ 'imageName' => $image->getName(), + 'imageVersion' => $imageImageRepository->getVersion(), + 'imageCompleteName' => $imageImageRepository->getName(), 'imageUuid' => $image->getUuid(), 'imageImageRepositoryUuid' => $imageImageRepository->getUuid(), 'repositoryUuid' => $repository->getUuid(), diff --git a/src/Controller/OgRepository/Webhook/ResponseController.php b/src/Controller/OgRepository/Webhook/ResponseController.php index 05535dd..66198fd 100644 --- a/src/Controller/OgRepository/Webhook/ResponseController.php +++ b/src/Controller/OgRepository/Webhook/ResponseController.php @@ -92,9 +92,9 @@ class ResponseController extends AbstractOgRepositoryController $latestImageRepo = $this->entityManager->getRepository(ImageImageRepository::class)->findLatestVersionByImageAndRepository($image, $repository); $newImageRepo = new ImageImageRepository(); - $newImageRepo->setName($image->getName().'_v'.($latestImageRepo ? $latestImageRepo->getVersion() + 1 : 1)); + $newImageRepo->setName($originImageImageRepository->getName()); $newImageRepo->setImage($image); - $newImageRepo->setVersion($latestImageRepo ? $latestImageRepo->getVersion() + 1 : 1); + $newImageRepo->setVersion($originImageImageRepository->getVersion()); $newImageRepo->setRepository($repository); $newImageRepo->setStatus(ImageStatus::SUCCESS); diff --git a/src/Dto/Input/CancelMultipleTracesInput.php b/src/Dto/Input/CancelMultipleTracesInput.php new file mode 100644 index 0000000..825d804 --- /dev/null +++ b/src/Dto/Input/CancelMultipleTracesInput.php @@ -0,0 +1,17 @@ +