<?php
namespace App\Controller\Cronjob\Server\Hetzner;
use App\Entity\SAAS\Server\Hetzner\DataCenter;
use App\Entity\SAAS\Server\Hetzner\DataCenterSupportedServerTypes;
use App\Entity\SAAS\Server\Hetzner\Ip;
use App\Repository\SAAS\Server\Hetzner\ImageRepository;
use App\Repository\SAAS\Server\Hetzner\IpRepository;
use App\Repository\SAAS\Server\Hetzner\ServerRepository;
use App\Service\Server\Hetzner\ServerService;
use App\Service\Util\HetznerApi;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
class ServerController extends AbstractController
{
public EntityManagerInterface $em ;
public ServerService $service;
public function __construct(EntityManagerInterface $em , ServerService $service)
{
$this->em = $em;
$this->service = $service;
}
#[Route('/cronjobs/hetzner/server', name: 'app_cronjobs_hetzner_server')]
public function index(ServerRepository $serverRepository , ImageRepository $imageRepository , IpRepository $ipRepository): Response
{
$hetznerApi = new HetznerApi($_ENV['HETZNERAPITOKEN']);
$servers = $hetznerApi->getServers();
foreach ($servers as $server) {
if ($serverRepository->findOneBy(['systemId' => $server['id']])){
$serverObject = $serverRepository->findOneBy(['systemId' => $server['id']]);
if ($serverObject->isActive()){
$serverObject->setStatus($server['status']);
if ($serverObject->getStatus() == 'off'){
$serverObject->setIsPowerOn(false);
}else{
$serverObject->setIsPowerOn(true);
}
$serverObject->setRescueEnabled((bool)$server['rescue_enabled']);
$serverObject->setName($server['name']);
if (isset($server['included_traffic']) ){
$serverObject->setIncludedTraffic($server['included_traffic']);
}else{
$serverObject->setIncludedTraffic(21990232555520);
}
$serverObject->setOutgoingTraffic($server['outgoing_traffic']);
$serverObject->setIngoingTraffic($server['ingoing_traffic']);
$serverObject->setAnalytics(json_encode($this->service->getServerMetrics($serverObject)));
$serverObject->setActions(json_encode($this->service->getServerActions($serverObject)));
$imageObject = $imageRepository->findOneBy(['systemId' => $server['image']['id']]);
if ($imageObject) {
$serverObject->setimage($imageObject);
}
foreach ($server['public_net'] as $ipType => $ipArray) {
if ($ipType === 'ipv4' || $ipType === 'ipv6') {
$ipObject = $ipRepository->findOneBy(['ip' => $ipArray['ip'] , 'server' => $serverObject , 'active' => 1 , 'deletedAt' => null]);
if (!$ipObject) {
$ipObject = new Ip();
$ipObject->setIp($ipArray['ip']);
$ipObject->setType($ipType);
$ipObject->setOwner($this->getUser());
$ipObject->setServer($serverObject);
if (is_array($ipArray['dns_ptr'])){
$ipObject->setName($ipArray['ip']);
}else{
$ipObject->setName($ipArray['dns_ptr']);
}
$ipObject->setIsLocked((bool)$ipArray['blocked']);
$ipObject->setSystemId($ipArray['id']);
$this->em->persist($ipObject);
}
}
}
$this->em->flush();
}else{
$hetznerApi->deleteServer($serverObject);
}
}else{
$hetznerApi->deleteServer($server['id']);
}
}
$this->em->clear();
return $this->json([
'res' => true,
]);
}
}