diff --git a/app/Check/ChecksRepository.php b/app/Check/ChecksRepository.php index 5e45d1c1..a939a10c 100644 --- a/app/Check/ChecksRepository.php +++ b/app/Check/ChecksRepository.php @@ -21,6 +21,7 @@ public static function getEntityClassNames() AliveCheck::class, TermCheck::class, DnsCheck::class, + DnsCnameCheck::class, CertificateCheck::class, FeedCheck::class, RabbitConsumerCheck::class, @@ -39,6 +40,8 @@ public function getEntityClassName(array $data) return TermCheck::class; case ICheck::TYPE_DNS: return DnsCheck::class; + case ICheck::TYPE_DNS_CNAME: + return DnsCnameCheck::class; case ICheck::TYPE_CERTIFICATE: return CertificateCheck::class; case ICheck::TYPE_FEED: diff --git a/app/Check/Commands/Publish/DnsCnameChecksCommand.php b/app/Check/Commands/Publish/DnsCnameChecksCommand.php new file mode 100644 index 00000000..80179827 --- /dev/null +++ b/app/Check/Commands/Publish/DnsCnameChecksCommand.php @@ -0,0 +1,18 @@ + \Pd\Monitoring\Check\ICheck::TYPE_DNS_CNAME, + ]; + } + +} diff --git a/app/Check/Consumers/DnsCnameCheck.php b/app/Check/Consumers/DnsCnameCheck.php new file mode 100644 index 00000000..6fd1ae8e --- /dev/null +++ b/app/Check/Consumers/DnsCnameCheck.php @@ -0,0 +1,31 @@ +lastTarget = NULL; + + $entries = dns_get_record($check->url, DNS_CNAME); + if (!$entries) { + return FALSE; + } + + $entry = array_shift($entries); + $check->lastTarget = $entry['target']; + return TRUE; + } + + + protected function getCheckType(): int + { + return \Pd\Monitoring\Check\ICheck::TYPE_DNS_CNAME; + } +} diff --git a/app/Check/DnsCnameCheck.php b/app/Check/DnsCnameCheck.php new file mode 100644 index 00000000..29f47e72 --- /dev/null +++ b/app/Check/DnsCnameCheck.php @@ -0,0 +1,40 @@ +type = ICheck::TYPE_DNS_CNAME; + } + + + protected function getStatus(): int + { + if ($this->lastTarget === $this->target) { + return ICheck::STATUS_OK; + } else { + return ICheck::STATUS_ERROR; + } + } + + + public function getTitle(): string + { + return 'Nastavení DNS CNAME'; + } + + + public function getterStatusMessage(): string + { + return $this->lastTarget !== $this->target ? sprintf('Očekávaná CNAME adresa "%s" neodpovídá zjištěné "%s"', $this->target, $this->lastTarget) : ''; + } +} diff --git a/app/DashBoard/Controls/AddEditCheck/DnsCnameCheckProcessor.php b/app/DashBoard/Controls/AddEditCheck/DnsCnameCheckProcessor.php new file mode 100644 index 00000000..2ed18ab0 --- /dev/null +++ b/app/DashBoard/Controls/AddEditCheck/DnsCnameCheckProcessor.php @@ -0,0 +1,37 @@ +url = $data['url']; + $check->target = $data['target']; + } + + + public function getCheck(): \Pd\Monitoring\Check\Check + { + return new \Pd\Monitoring\Check\DnsCnameCheck(); + } + + + public function createForm(\Pd\Monitoring\Check\Check $check, \Nette\Application\UI\Form $form) + { + $form->addGroup($check->getTitle()); + $form + ->addText('url', 'Adresa') + ->setRequired(TRUE) + ; + $form + ->addText('target', 'Cíl') + ->setRequired(TRUE) + ->addFilter(function($value) { + return rtrim($value, '.'); + }); + ; + } + +} diff --git a/app/DashBoard/Controls/AddEditCheck/Factory.php b/app/DashBoard/Controls/AddEditCheck/Factory.php index 8e03fb10..7dbc1a22 100644 --- a/app/DashBoard/Controls/AddEditCheck/Factory.php +++ b/app/DashBoard/Controls/AddEditCheck/Factory.php @@ -40,6 +40,10 @@ public function create(\Pd\Monitoring\Project\Project $project, int $type, \Pd\M $control = new Control($project, $check, new DnsCheckProcessor(), $this->formFactory, $this->checksRepository); break; + case \Pd\Monitoring\Check\ICheck::TYPE_DNS_CNAME: + $control = new Control($project, $check, new DnsCnameCheckProcessor(), $this->formFactory, $this->checksRepository); + break; + case \Pd\Monitoring\Check\ICheck::TYPE_CERTIFICATE: $control = new Control($project, $check, new CertificateCheckProcessor(), $this->formFactory, $this->checksRepository); break; diff --git a/app/DashBoard/Controls/Check/Control.latte b/app/DashBoard/Controls/Check/Control.latte index 7ee0fe7b..528f30c6 100644 --- a/app/DashBoard/Controls/Check/Control.latte +++ b/app/DashBoard/Controls/Check/Control.latte @@ -17,6 +17,11 @@

Očekávaná IP: {$check->ip}

Zjištěná IP: {if $check->lastIp}{$check->lastIp}{else}není{/if}

Poslední kontrola: {if $check->lastCheck}{$check->lastCheck|dateTime}{else}neproběhla{/if}

+ {elseif $check instanceof Pd\Monitoring\Check\DnsCnameCheck} +

Testovaná adresa: {$check->url}

+

Očekávaný cíl: {$check->target}

+

Zjištěný cíl: {if $check->lastTarget}{$check->lastTarget}{else}není{/if}

+

Poslední kontrola: {if $check->lastCheck}{$check->lastCheck|dateTime}{else}neproběhla{/if}

{elseif $check instanceof Pd\Monitoring\Check\CertificateCheck}

Testovaná adresa: {$check->url}

Varování předem: {$check->daysBeforeWarning} dní

diff --git a/app/DashBoard/Presenters/ProjectPresenter.php b/app/DashBoard/Presenters/ProjectPresenter.php index 50c3d946..5bf7f377 100644 --- a/app/DashBoard/Presenters/ProjectPresenter.php +++ b/app/DashBoard/Presenters/ProjectPresenter.php @@ -141,6 +141,7 @@ public function renderDefault() new \Pd\Monitoring\Check\AliveCheck(), new \Pd\Monitoring\Check\TermCheck(), new \Pd\Monitoring\Check\DnsCheck(), + new \Pd\Monitoring\Check\DnsCnameCheck(), new \Pd\Monitoring\Check\CertificateCheck(), new \Pd\Monitoring\Check\FeedCheck(), new \Pd\Monitoring\Check\RabbitConsumerCheck(), diff --git a/app/config/config.neon b/app/config/config.neon index 7126d09d..bf01ec2a 100644 --- a/app/config/config.neon +++ b/app/config/config.neon @@ -72,6 +72,9 @@ rabbitmq: dnsCheck: exchange: {name: 'dnsCheck', type: direct} contentType: text/plain + dnsCnameCheck: + exchange: {name: 'dnsCnameCheck', type: direct} + contentType: text/plain certificateCheck: exchange: {name: 'certificateCheck', type: direct} contentType: text/plain @@ -91,6 +94,10 @@ rabbitmq: exchange: {name: 'dnsCheck', type: direct} queue: {name: 'dnsCheck'} callback: [@Pd\Monitoring\Check\Consumers\DnsCheck, process] + dnsCnameCheck: + exchange: {name: 'dnsCnameCheck', type: direct} + queue: {name: 'dnsCnameCheck'} + callback: [@Pd\Monitoring\Check\Consumers\DnsCnameCheck, process] certificateCheck: exchange: {name: 'certificateCheck', type: direct} queue: {name: 'certificateCheck'} @@ -134,6 +141,9 @@ services: - class: Pd\Monitoring\Check\Consumers\DnsCheck + - + class: Pd\Monitoring\Check\Consumers\DnsCnameCheck + - class: Pd\Monitoring\Check\Consumers\CertificateCheck @@ -168,6 +178,13 @@ services: arguments: - @Kdyby\RabbitMq\Connection::getProducer('dnsCheck') + - + class: Pd\Monitoring\Check\Commands\Publish\DnsCnameChecksCommand + tags: + - kdyby.console.command + arguments: + - @Kdyby\RabbitMq\Connection::getProducer('dnsCnameCheck') + - class: Pd\Monitoring\Check\Commands\Publish\CertificateChecksCommand tags: diff --git a/migrations/structures/2017-04-13-174952-dns-cname-check.sql b/migrations/structures/2017-04-13-174952-dns-cname-check.sql new file mode 100644 index 00000000..b0175150 --- /dev/null +++ b/migrations/structures/2017-04-13-174952-dns-cname-check.sql @@ -0,0 +1,2 @@ +ALTER TABLE `checks` ADD `target` VARCHAR(250) NULL DEFAULT NULL; +ALTER TABLE `checks` ADD `last_target` VARCHAR(250) NULL DEFAULT NULL AFTER `target`;