From 2d6b058eaf50af42f4174f2911c85beb680022a1 Mon Sep 17 00:00:00 2001 From: Manuel Aranda Date: Tue, 1 Apr 2025 10:58:11 +0200 Subject: [PATCH] refs #1794. Updted assistants endpoints --- migrations/Version20250325075647.php | 31 +++++++ migrations/Version20250326061450.php | 31 +++++++ migrations/Version20250331144522.php | 31 +++++++ src/Controller/OgAgent/CreateImageAction.php | 2 +- src/Controller/OgAgent/DeployImageAction.php | 2 +- src/Controller/OgAgent/LoginAction.php | 93 +++++++++++++++++++ .../OgAgent/PartitionAssistantAction.php | 15 ++- src/Controller/OgAgent/PowerOffAction.php | 4 +- src/Controller/OgAgent/RebootAction.php | 6 +- src/Controller/OgAgent/StatusAction.php | 6 +- ...ntsController.php => StatusController.php} | 4 +- .../OgBoot/PxeBootFile/PostAction.php | 2 +- .../OgRepository/Image/DeployImageAction.php | 4 +- src/Dto/Input/CommandInput.php | 9 ++ src/Dto/Output/ClientOutput.php | 4 + src/Dto/Output/CommandOutput.php | 4 + src/Dto/Output/ImageImageRepositoryOutput.php | 4 + src/Dto/Output/TraceOutput.php | 2 +- 18 files changed, 234 insertions(+), 20 deletions(-) create mode 100644 migrations/Version20250325075647.php create mode 100644 migrations/Version20250326061450.php create mode 100644 migrations/Version20250331144522.php create mode 100644 src/Controller/OgAgent/LoginAction.php rename src/Controller/OgAgent/Webhook/{ClientsController.php => StatusController.php} (98%) diff --git a/migrations/Version20250325075647.php b/migrations/Version20250325075647.php new file mode 100644 index 0000000..6048e92 --- /dev/null +++ b/migrations/Version20250325075647.php @@ -0,0 +1,31 @@ +addSql('ALTER TABLE client ADD firmware_type VARCHAR(255) DEFAULT NULL'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('ALTER TABLE client DROP firmware_type'); + } +} diff --git a/migrations/Version20250326061450.php b/migrations/Version20250326061450.php new file mode 100644 index 0000000..2eebbef --- /dev/null +++ b/migrations/Version20250326061450.php @@ -0,0 +1,31 @@ +addSql('ALTER TABLE command ADD parameters TINYINT(1) DEFAULT NULL'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('ALTER TABLE command DROP parameters'); + } +} diff --git a/migrations/Version20250331144522.php b/migrations/Version20250331144522.php new file mode 100644 index 0000000..b5b2f71 --- /dev/null +++ b/migrations/Version20250331144522.php @@ -0,0 +1,31 @@ +addSql('ALTER TABLE image_image_repository ADD datasize VARCHAR(255) DEFAULT NULL'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('ALTER TABLE image_image_repository DROP datasize'); + } +} diff --git a/src/Controller/OgAgent/CreateImageAction.php b/src/Controller/OgAgent/CreateImageAction.php index 55c87a7..2a0d485 100644 --- a/src/Controller/OgAgent/CreateImageAction.php +++ b/src/Controller/OgAgent/CreateImageAction.php @@ -90,7 +90,7 @@ class CreateImageAction extends AbstractController try { $this->logger->info('Creating image', ['image' => $image->getId()]); - $response = $this->httpClient->request('POST', 'https://'.$image->getClient()->getIp().':8000/CloningEngine/CrearImagen', [ + $response = $this->httpClient->request('POST', 'https://'.$image->getClient()->getIp().':8000/opengnsys/CrearImagen', [ 'verify_peer' => false, 'verify_host' => false, 'headers' => [ diff --git a/src/Controller/OgAgent/DeployImageAction.php b/src/Controller/OgAgent/DeployImageAction.php index eaacd9b..6bf3c8d 100644 --- a/src/Controller/OgAgent/DeployImageAction.php +++ b/src/Controller/OgAgent/DeployImageAction.php @@ -92,7 +92,7 @@ class DeployImageAction extends AbstractController ]; try { - $response = $this->httpClient->request('POST', 'https://'.$client->getIp().':8000/CloningEngine/RestaurarImagen', [ + $response = $this->httpClient->request('POST', 'https://'.$client->getIp().':8000/opengnsys/RestaurarImagen', [ 'verify_peer' => false, 'verify_host' => false, 'headers' => [ diff --git a/src/Controller/OgAgent/LoginAction.php b/src/Controller/OgAgent/LoginAction.php new file mode 100644 index 0000000..42fd7e1 --- /dev/null +++ b/src/Controller/OgAgent/LoginAction.php @@ -0,0 +1,93 @@ +clients as $clientEntity) { + /** @var Client $client */ + $client = $clientEntity->getEntity(); + + + if (!$client->getIp()) { + throw new ValidatorException('IP is required'); + } + + if ($client->getStatus() !== ClientStatus::OG_LIVE) { + throw new ValidatorException('Client is not in OG_LIVE status'); + } + + $data = [ + 'nfn' => 'IniciarSesion', + 'dsk' => '1', + 'par' => '1', + 'ids' => '0' + ]; + + try { + $response = $this->httpClient->request('POST', 'https://' . $client->getIp() . ':8000/ogAdmClient/IniciarSesion', [ + 'verify_peer' => false, + 'verify_host' => false, + 'headers' => [ + 'Content-Type' => 'application/json', + ], + 'json' => $data, + ]); + $this->logger->info('Login client', ['client' => $client->getId()]); + + } catch (TransportExceptionInterface $e) { + $this->logger->error('Login rebooting client', ['client' => $client->getId(), 'error' => $e->getMessage()]); + return new JsonResponse( + data: ['error' => $e->getMessage()], + status: Response::HTTP_INTERNAL_SERVER_ERROR + ); + } + + $jobId = json_decode($response->getContent(), true)['job_id']; + + $client->setStatus(ClientStatus::INITIALIZING); + $this->entityManager->persist($client); + $this->entityManager->flush(); + + $this->createService->__invoke($client, CommandTypes::REBOOT, TraceStatus::SUCCESS, $jobId, []); + } + + return new JsonResponse(data: [], status: Response::HTTP_OK); + } +} diff --git a/src/Controller/OgAgent/PartitionAssistantAction.php b/src/Controller/OgAgent/PartitionAssistantAction.php index 7e8021d..5dfe433 100644 --- a/src/Controller/OgAgent/PartitionAssistantAction.php +++ b/src/Controller/OgAgent/PartitionAssistantAction.php @@ -48,6 +48,7 @@ class PartitionAssistantAction extends AbstractController } foreach ($input->clients as $clientInput) { + /** @var Client $client */ $client = $clientInput->getEntity(); $disks = []; @@ -72,13 +73,10 @@ class PartitionAssistantAction extends AbstractController ]; } - if ($partition->filesystem === 'CACHE') { - $disks[$diskNumber]['diskData'] = [ - 'dis' => (string) $diskNumber, - 'che' => "0", - 'tch' => (string) ($partition->size * 1024), - ]; - } + $disks[$diskNumber]['diskData'] = [ + 'dis' => (string) $diskNumber, + 'tch' => (string) ($partition->size * 1024), + ]; $disks[$diskNumber]['partitionData'][] = [ 'par' => (string) $partition->partitionNumber, @@ -104,7 +102,7 @@ class PartitionAssistantAction extends AbstractController ]; try { - $response = $this->httpClient->request('POST', 'https://' . $client->getIp() . ':8000/CloningEngine/Configurar', [ + $response = $this->httpClient->request('POST', 'https://' . $client->getIp() . ':8000/opengnsys/Configurar', [ 'verify_peer' => false, 'verify_host' => false, 'headers' => [ @@ -130,5 +128,4 @@ class PartitionAssistantAction extends AbstractController return new JsonResponse(data: [], status: Response::HTTP_OK); } - } diff --git a/src/Controller/OgAgent/PowerOffAction.php b/src/Controller/OgAgent/PowerOffAction.php index 39f2e5b..8cde198 100644 --- a/src/Controller/OgAgent/PowerOffAction.php +++ b/src/Controller/OgAgent/PowerOffAction.php @@ -53,13 +53,15 @@ class PowerOffAction extends AbstractController continue; } + $endpoint = $client->getStatus() === ClientStatus::OG_LIVE ? 'opengnsys/Apagar' : 'opengnsys/poweroff'; + $data = [ 'nfn' => 'Apagar', 'ids' => '0' ]; try { - $response = $this->httpClient->request('POST', 'https://'.$client->getIp().':8000/ogAdmClient/Apagar', [ + $response = $this->httpClient->request('POST', 'https://' . $client->getIp() . ':8000/'.$endpoint, [ 'verify_peer' => false, 'verify_host' => false, 'headers' => [ diff --git a/src/Controller/OgAgent/RebootAction.php b/src/Controller/OgAgent/RebootAction.php index 72d9a43..0be2163 100644 --- a/src/Controller/OgAgent/RebootAction.php +++ b/src/Controller/OgAgent/RebootAction.php @@ -41,6 +41,7 @@ class RebootAction extends AbstractController public function __invoke(MultipleClientsInput $input): JsonResponse { foreach ($input->clients as $clientEntity) { + /** @var Client $client */ $client = $clientEntity->getEntity(); @@ -48,13 +49,15 @@ class RebootAction extends AbstractController throw new ValidatorException('IP is required'); } + $endpoint = $client->getStatus() === ClientStatus::OG_LIVE ? 'opengnsys/Reiniciar' : '/opengnsys/reboot'; + $data = [ 'nfn' => 'Reiniciar', 'ids' => '0' ]; try { - $response = $this->httpClient->request('POST', 'https://' . $client->getIp() . ':8000/ogAdmClient/Reiniciar', [ + $response = $this->httpClient->request('POST', 'https://' . $client->getIp() . ':8000/'.$endpoint, [ 'verify_peer' => false, 'verify_host' => false, 'headers' => [ @@ -62,6 +65,7 @@ class RebootAction extends AbstractController ], 'json' => $data, ]); + $this->logger->info('Rebooting client', ['client' => $client->getId()]); } catch (TransportExceptionInterface $e) { diff --git a/src/Controller/OgAgent/StatusAction.php b/src/Controller/OgAgent/StatusAction.php index 77b5699..d41b4b2 100644 --- a/src/Controller/OgAgent/StatusAction.php +++ b/src/Controller/OgAgent/StatusAction.php @@ -70,6 +70,10 @@ class StatusAction extends AbstractController { $this->logger->info('Checking client status', ['client' => $client->getId()]); + $params = [ + 'full-config' => true, + ]; + try { $response = $this->httpClient->request('POST', 'https://' . $client->getIp() . ':8000/ogAdmClient/status', [ 'verify_peer' => false, @@ -78,7 +82,7 @@ class StatusAction extends AbstractController 'headers' => [ 'Content-Type' => 'application/json', ], - 'json' => [], + 'json' => $params, ]); $statusCode = $response->getStatusCode(); $client->setStatus($statusCode === Response::HTTP_OK ? ClientStatus::OG_LIVE : ClientStatus::OFF); diff --git a/src/Controller/OgAgent/Webhook/ClientsController.php b/src/Controller/OgAgent/Webhook/StatusController.php similarity index 98% rename from src/Controller/OgAgent/Webhook/ClientsController.php rename to src/Controller/OgAgent/Webhook/StatusController.php index b5970e3..7973748 100644 --- a/src/Controller/OgAgent/Webhook/ClientsController.php +++ b/src/Controller/OgAgent/Webhook/StatusController.php @@ -32,7 +32,7 @@ use Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface; use Symfony\Contracts\HttpClient\HttpClientInterface; #[AsController] -class ClientsController extends AbstractController +class StatusController extends AbstractController { const string CREATE_IMAGE = 'RESPUESTA_CrearImagen'; const string RESTORE_IMAGE = 'RESPUESTA_RestaurarImagen'; @@ -72,7 +72,7 @@ class ClientsController extends AbstractController if (isset($data['progress'])){ $trace = $this->entityManager->getRepository(Trace::class)->findOneBy(['jobId' => $data['job_id']]); if ($trace){ - $trace->setProgress($data['progress'] * 1000); + $trace->setProgress($data['progress'] * 100); $this->entityManager->persist($trace); $this->entityManager->flush(); } diff --git a/src/Controller/OgBoot/PxeBootFile/PostAction.php b/src/Controller/OgBoot/PxeBootFile/PostAction.php index b2245b8..75a30c3 100644 --- a/src/Controller/OgBoot/PxeBootFile/PostAction.php +++ b/src/Controller/OgBoot/PxeBootFile/PostAction.php @@ -40,7 +40,7 @@ class PostAction extends AbstractOgBootController 'json' => [ 'template_name' => $pxeTemplate->getName(), 'mac' => strtolower($client->getMac()), - 'lang' => 'es_ES.UTF_8', + 'lang' => 'es_ES.UTF-8', 'ip' => $client->getIp(), 'server_ip' => $this->ogBootApiUrl, 'router' => $client->getOrganizationalUnit()->getNetworkSettings()->getRouter(), diff --git a/src/Controller/OgRepository/Image/DeployImageAction.php b/src/Controller/OgRepository/Image/DeployImageAction.php index 600163f..64b0099 100644 --- a/src/Controller/OgRepository/Image/DeployImageAction.php +++ b/src/Controller/OgRepository/Image/DeployImageAction.php @@ -45,9 +45,9 @@ class DeployImageAction extends AbstractOgRepositoryController ]; $type = match ($input->method) { - 'udpcast', 'udpcast_direct' => DeployMethodTypes::MULTICAST_UDPCAST, + 'udpcast', 'udpcast-direct' => DeployMethodTypes::MULTICAST_UDPCAST, 'p2p' => DeployMethodTypes::TORRENT, - default => DeployMethodTypes::MULTICAST_UFTP, + default => null, }; $repository = $client->getRepository(); diff --git a/src/Dto/Input/CommandInput.php b/src/Dto/Input/CommandInput.php index 10697d8..d381efc 100644 --- a/src/Dto/Input/CommandInput.php +++ b/src/Dto/Input/CommandInput.php @@ -40,6 +40,13 @@ final class CommandInput )] public ?bool $enabled = true; + #[Groups(['command:write'])] + #[ApiProperty( + description: 'Tiene parĂ¡metros?', + example: 'true', + )] + public ?bool $parameters = true; + #[Groups(['command:write'])] #[ApiProperty( description: 'Los comentarios del comando', @@ -57,6 +64,7 @@ final class CommandInput $this->script = $command->getScript(); $this->enabled = $command->isEnabled(); $this->readOnly = $command->isReadOnly(); + $this->parameters = $command->isParameters(); $this->comments = $command->getComments(); } @@ -70,6 +78,7 @@ final class CommandInput $command->setScript($this->script); $command->setEnabled($this->enabled); $command->setReadOnly($this->readOnly); + $command->setParameters($this->parameters); $command->setComments($this->comments); return $command; diff --git a/src/Dto/Output/ClientOutput.php b/src/Dto/Output/ClientOutput.php index f625812..7e7e8ec 100644 --- a/src/Dto/Output/ClientOutput.php +++ b/src/Dto/Output/ClientOutput.php @@ -25,6 +25,9 @@ final class ClientOutput extends AbstractOutput #[Groups(['client:read', 'organizational-unit:read', 'pxe-template:read', 'trace:read', 'subnet:read'])] public ?string $mac = ''; + #[Groups(['client:read'])] + public ?string $firmwareType = ''; + #[Groups(['client:read', 'organizational-unit:read', 'trace:read'])] public ?string $serialNumber = ''; @@ -91,6 +94,7 @@ final class ClientOutput extends AbstractOutput $this->ip = $client->getIp(); $this->netiface = $client->getNetiface(); $this->netDriver = $client->getNetDriver(); + $this->firmwareType = $client->getFirmwareType(); if ($client->getOrganizationalUnit()) { $this->organizationalUnit = new OrganizationalUnitOutput($client->getOrganizationalUnit()); diff --git a/src/Dto/Output/CommandOutput.php b/src/Dto/Output/CommandOutput.php index 394a5d1..0622b70 100644 --- a/src/Dto/Output/CommandOutput.php +++ b/src/Dto/Output/CommandOutput.php @@ -21,6 +21,9 @@ final class CommandOutput extends AbstractOutput #[Groups(['command:read'])] public ?bool $enabled = true; + #[Groups(['command:read'])] + public ?bool $parameters = true; + #[Groups(['command:read'])] public ?string $comments = ''; @@ -37,6 +40,7 @@ final class CommandOutput extends AbstractOutput $this->name = $command->getName(); $this->script = $command->getScript(); $this->readOnly = $command->isReadOnly(); + $this->parameters = $command->isParameters(); $this->enabled = $command->isEnabled(); $this->comments = $command->getComments(); $this->createdAt = $command->getCreatedAt(); diff --git a/src/Dto/Output/ImageImageRepositoryOutput.php b/src/Dto/Output/ImageImageRepositoryOutput.php index a7b3830..665b565 100644 --- a/src/Dto/Output/ImageImageRepositoryOutput.php +++ b/src/Dto/Output/ImageImageRepositoryOutput.php @@ -21,6 +21,9 @@ class ImageImageRepositoryOutput extends AbstractOutput #[Groups(['image-image-repository:read', 'image:read'])] public ?string $imageFullsum = null; + #[Groups(['image-image-repository:read', 'image:read'])] + public ?string $datasize = null; + #[Groups(['image-image-repository:read', 'image:read'])] public \DateTime $createdAt; @@ -43,6 +46,7 @@ class ImageImageRepositoryOutput extends AbstractOutput $this->status = $imageImageRepository->getStatus(); $this->imageFullsum = $imageImageRepository->getImageFullsum(); + $this->datasize = $imageImageRepository->getDatasize(); $this->createdAt = $imageImageRepository->getCreatedAt(); $this->createdBy = $imageImageRepository->getCreatedBy(); } diff --git a/src/Dto/Output/TraceOutput.php b/src/Dto/Output/TraceOutput.php index 14ea96b..94bd188 100644 --- a/src/Dto/Output/TraceOutput.php +++ b/src/Dto/Output/TraceOutput.php @@ -59,7 +59,7 @@ final class TraceOutput extends AbstractOutput $this->output = $trace->getOutput(); $this->input = $trace->getInput(); $this->finishedAt = $trace->getFinishedAt(); - $this->progress = $trace->getProgress() / 100; + $this->progress = $trace->getProgress(); $this->createdAt = $trace->getCreatedAt(); $this->createdBy = $trace->getCreatedBy(); }