diff --git a/src/Controller/RequestController.php b/src/Controller/RequestController.php index 706389c..646b632 100644 --- a/src/Controller/RequestController.php +++ b/src/Controller/RequestController.php @@ -5,8 +5,10 @@ namespace App\Controller; error_reporting(error_level: E_ALL); use App\Entity\Domain; +use App\Entity\DynDNS; use App\Repository\ApikeyRepository; use App\Repository\DomainRepository; +use App\Repository\DynDNSRepository; use App\Repository\PanelRepository; use DI\Container; use DI\ContainerBuilder; @@ -55,6 +57,7 @@ class RequestController private DomainController $domainController; private DomainRepository $domainRepository; private PanelRepository $panelRepository; + private DynDNSRepository $DynDNSRepository; private Container $container; private string $header; private array $result; @@ -73,7 +76,6 @@ class RequestController { $this->requestMethod = strtoupper(string: $requestMethod); - $dateFormat = "Y:m:d H:i:s"; $output = "%datetime% %channel%.%level_name% %message%\n"; // %context% %extra% $formatter = new LineFormatter(format: $output, dateFormat: $dateFormat); @@ -84,6 +86,10 @@ class RequestController $this->log = new Logger(name: 'bindAPI'); $this->log->pushHandler(handler: $stream); + if ($this->config['debug']) { + $this->log->debug(message: 'RequestController::__construct'); + } + $containerBuilder = new ContainerBuilder(); $containerBuilder->addDefinitions([ @@ -94,6 +100,9 @@ class RequestController DomainRepository::class => autowire() ->constructorParameter(parameter: 'config', value: $this->config) ->constructorParameter(parameter: 'log', value: $this->log), + DynDNSRepository::class => autowire() + ->constructorParameter(parameter: 'config', value: $this->config) + ->constructorParameter(parameter: 'log', value: $this->log), ]); $this->container = $containerBuilder->build(); @@ -103,6 +112,7 @@ class RequestController $this->domainController = $this->container->get(name: DomainController::class); $this->domainRepository = $this->container->get(name: DomainRepository::class); $this->panelRepository = $this->container->get(name: PanelRepository::class); + $this->dynDNSRepository = $this->container->get(name: DynDNSRepository::class); } /** @@ -288,7 +298,6 @@ class RequestController echo $this->status; } else { echo json_encode(value: [ - 'status' => $this->status ?? "Error: No status", 'message' => $this->message ?? "Error: No message." ]); } @@ -516,6 +525,10 @@ class RequestController private function handleDynDNS() { + if ($this->config['debug']) { + $this->log->debug(message: 'handleDynDNS()'); + } + if ($this->checkPassword()) { $host = $this->uri[3] ?? ''; @@ -536,109 +549,159 @@ class RequestController } } + if ($this->config['debug']) { + $this->log->debug(message: 'a: ' . $a); + $this->log->debug(message: 'aaaa: ' . $aaaa); + } + + $domainName = $this->getDomain(host: $host); $hostName = str_replace(search: '.' . $domainName, replace: '', subject: $host); - $domain = $this->domainRepository->findByName(name: $domainName); - $panel = $this->panelRepository->findByName(name: $domain->getPanel()); - - if (!empty($panel->getAaaa())) { - $domainData = $this->apiController->sendCommand( - requestType: 'GET', - serverName : $panel->getName(), - versionIP : 6, - apiKey : $panel->getApikey(), - command : 'domains/name/' . $domainName, - serverType : 'panel'); + if (!$domain = $this->domainRepository->findByName(name: $domainName)) { + $this->header = '404 Not Found'; + $this->message = 'Domain ' . $domainName . ' not found'; } else { - $domainData = $this->apiController->sendCommand( - requestType: 'GET', - serverName : $panel->getName(), - versionIP : 4, - apiKey : $panel->getApikey(), - command : 'domains/name/' . $domainName, - serverType : 'panel'); - } - - $domainDecodedData = json_decode(json: $domainData['data']); - $domainID = $domainDecodedData->id; - - if (!empty($panel->getAaaa())) { - $dnsData = $this->apiController->sendCommand( - requestType: 'GET', - serverName : $panel->getName(), - versionIP : 6, - apiKey : $panel->getApikey(), - command : 'dns/' . $domainID, - serverType : 'panel'); - } else { - $dnsData = $this->apiController->sendCommand( - requestType: 'GET', - serverName : $panel->getName(), - versionIP : 4, - apiKey : $panel->getApikey(), - command : 'dns/' . $domainID, - serverType : 'panel'); - } - - $dnsDataDecoded = json_decode(json: $dnsData['data']); - $soa = $dnsDataDecoded->records->soa; - $others = $dnsDataDecoded->records->other; - - $hostFound = false; - - $updateHost = function (object $host) use ($hostName, $a, $aaaa, &$hostFound) { - if ($host->host == $hostName) { - $hostFound = true; - if ($host->type == 'A') { - if (!empty($a)) { - $host->value = $a; - } - } else { - if (!empty($aaaa)) { - $host->value = $aaaa; + + // check if address has changed + if ($dynDNS = $this->dynDNSRepository->findByName(name: $host)) { + echo 'found host'; + print_r($dynDNS); + + print("a: $a"); + print("aaaa: $aaaa"); + + $ipChanged = false; + + if (!empty($a)) { + if ($a != $dynDNS->getA()) { + echo $a . '!=' . $dynDNS->getA(); + $dynDNS->setA(a: $a); + $ipChanged = true; } } + + if (!empty($aaaa)) { + if ($aaaa != $dynDNS->getAaaa()) { + $dynDNS->setAaaa(aaaa: $aaaa); + + $ipChanged = true; + } + } + + if (!$ipChanged) { + $this->header = '304 Not Modified'; + $this->message = 'Not modified'; + + } else { + $this->dynDNSRepository->update(dynDNS: $dynDNS); + } + } else { + $dynDNS = new DynDNS(name: $host, a: $a, aaaa: $aaaa); + $this->dynDNSRepository->insert(dynDNS: $dynDNS); } - }; - - array_map(callback: $updateHost, array: $others); - - if ($hostFound) { - $newDnsData = json_encode(value: [ - 'records' => [ - 'soa' => $soa, - 'other' => $others - ] - ]); + + + $panel = $this->panelRepository->findByName(name: $domain->getPanel()); if (!empty($panel->getAaaa())) { - $result = $this->apiController->sendCommand( - requestType: 'PUT', + $domainData = $this->apiController->sendCommand( + requestType: 'GET', + serverName : $panel->getName(), + versionIP : 6, + apiKey : $panel->getApikey(), + command : 'domains/name/' . $domainName, + serverType : 'panel'); + } else { + $domainData = $this->apiController->sendCommand( + requestType: 'GET', + serverName : $panel->getName(), + versionIP : 4, + apiKey : $panel->getApikey(), + command : 'domains/name/' . $domainName, + serverType : 'panel'); + } + + $domainDecodedData = json_decode(json: $domainData['data']); + $domainID = $domainDecodedData->id; + + if (!empty($panel->getAaaa())) { + $dnsData = $this->apiController->sendCommand( + requestType: 'GET', serverName : $panel->getName(), versionIP : 6, apiKey : $panel->getApikey(), command : 'dns/' . $domainID, - serverType : 'panel', - body : json_decode(json: $newDnsData, associative: true) - ); + serverType : 'panel'); } else { - $result = $this->apiController->sendCommand( - requestType: 'PUT', + $dnsData = $this->apiController->sendCommand( + requestType: 'GET', serverName : $panel->getName(), versionIP : 4, apiKey : $panel->getApikey(), command : 'dns/' . $domainID, - serverType : 'panel', - body : json_decode(json: $newDnsData, associative: true) - ); + serverType : 'panel'); } - if ($result['header'] == 200) { - $this->header = '200 OK'; - $this->status = json_encode(value: ['message' => 'DynDNS host successfully updated']); + + $dnsDataDecoded = json_decode(json: $dnsData['data']); + $soa = $dnsDataDecoded->records->soa; + $others = $dnsDataDecoded->records->other; + + $hostFound = false; + + $updateHost = function (object $host) use ($hostName, $a, $aaaa, &$hostFound) { + if ($host->host == $hostName) { + $hostFound = true; + if ($host->type == 'A') { + if (!empty($a)) { + $host->value = $a; + } + } else { + if (!empty($aaaa)) { + $host->value = $aaaa; + } + } + } + }; + + array_map(callback: $updateHost, array: $others); + + if ($hostFound) { + $newDnsData = json_encode(value: [ + 'records' => [ + 'soa' => $soa, + 'other' => $others + ] + ]); + + if (!empty($panel->getAaaa())) { + $result = $this->apiController->sendCommand( + requestType: 'PUT', + serverName : $panel->getName(), + versionIP : 6, + apiKey : $panel->getApikey(), + command : 'dns/' . $domainID, + serverType : 'panel', + body : json_decode(json: $newDnsData, associative: true) + ); + } else { + $result = $this->apiController->sendCommand( + requestType: 'PUT', + serverName : $panel->getName(), + versionIP : 4, + apiKey : $panel->getApikey(), + command : 'dns/' . $domainID, + serverType : 'panel', + body : json_decode(json: $newDnsData, associative: true) + ); + } + if ($result['header'] == 200) { + $this->header = '200 OK'; + $this->message = 'DynDNS host successfully updated'; + } + } else { + $this->header = '404 Not Found'; + $this->message = 'Host ' . $hostName . ' not found'; } - } else { - $this->header = '404 Not Found'; - $this->status = 'Host ' . COLOR_YELLOW . $hostName . ' not found'; } } }