getZone($params); $this->setStatus(TaskStatusEnum::IN_PROGRESS); $this->loopThroughServers($zone, $params['submodule'], false, function ($module, $masterRecords) use ($params) { $module->addRecord($params['values'][0]); }); $this->setStatus(TaskStatusEnum::FINISHED); } /** * @param $params */ public function syncDelete($params) { $zone = $this->getZone($params); $this->setStatus(TaskStatusEnum::IN_PROGRESS); $this->loopThroughServers($zone, $params['submodule'], true, function ($module, $masterRecords) { $this->syncRecords($module, $masterRecords); }); $this->setStatus(TaskStatusEnum::FINISHED); } /** * @param $params */ public function syncEdit($params) { $zone = $this->getZone($params); $this->setStatus(TaskStatusEnum::IN_PROGRESS); $this->loopThroughServers($zone, $params['submodule'], true, function ($module, $masterRecords) { $this->syncRecords($module, $masterRecords); }); $this->setStatus(TaskStatusEnum::FINISHED); } public function syncActivateZone($params) { $this->setStatus(TaskStatusEnum::IN_PROGRESS); $zone = $this->getZone($params); $this->loopThroughServers($zone, $params['submodule'], true, function ($module, $masterRecords) { $module->activateZone(); $module->wipeRecords(); $this->syncRecords($module, $masterRecords); }); $this->setStatus(TaskStatusEnum::FINISHED); } public function syncTerminateZone($params) { $this->setStatus(TaskStatusEnum::IN_PROGRESS); $this->loopThroughServers($params['zone'], $params['submodule'], false, function ($module, $masterRecords) { $module->terminateZone(); }); $this->setStatus(TaskStatusEnum::FINISHED); } public function syncUpdateRDNS($params) { $this->setStatus(TaskStatusEnum::IN_PROGRESS); $this->loopThroughServers($params['zone'], $params['submodule'], true, function ($module, $masterRecords) { $this->syncRecords($module, $masterRecords); }); $this->setStatus(TaskStatusEnum::FINISHED); } public function syncRemoveRDNS($params) { $this->setStatus(TaskStatusEnum::IN_PROGRESS); $this->loopThroughServers($params['zone'], $params['submodule'], true, function ($module, $masterRecords) { $this->syncRecords($module, $masterRecords); }); $this->setStatus(TaskStatusEnum::FINISHED); } protected function getZone($params) { $submodule = $params['submodule']; $zoneRepository = Repository::factory(); return $zoneRepository->byServerID($submodule->getServer()->id)->byName($submodule->getDomain())->get()[0]; } /** * @param $zone * @param $submodule * @param $withRecords * @param callable $callable */ private function loopThroughServers($zone, $submodule, $withRecords, callable $callable) { [$master, $slaves] = $this->getServers($zone); $masterRecords = []; if ($withRecords) { $masterModule = $master->getServer()->getModule(); $masterModule->setDomain($submodule->getDomain()); $masterRecords = $masterModule->getRecords(); } foreach ($slaves as $slaveServer) { try { $module = $slaveServer->getServer()->getModule(); $module->setDomain($submodule->getDomain()); $callable($module, $masterRecords); } catch (\Exception $ex) { // var_dump($ex->getMessage()); LogHelper::addFailLogUsingZone('record_sync_on_' . $submodule->getDomain(), $ex->getMessage(), $zone); } } } /** * @param $zone * @return array */ private function getServers($zone) { $package = $zone->getPackage(); $master = null; $slaves = []; foreach ($package->getServers() as $server) { if ($server->isMaster()) { $master = $server; } else { $slaves[] = $server; } } return [ $master, $slaves ]; } /** * @param $module * @param array $masterRecords */ protected function syncRecords($module, $masterRecords = []) { $slaveRecords = $module->getRecords(); $domain = $module->getSubmodule()->getModule()->getDomain(); /** * Add record which does not exist in slave */ foreach ($masterRecords as $masterRecord) { if (in_array($masterRecord->type, ['SOA'])) { continue; } $found = false; foreach ($slaveRecords as $slaveRecord) { if ($masterRecord->compare($slaveRecord, $domain)) { $found = true; continue; } } if (!$found) { $masterRecord->ttl = $masterRecord->ttl ?: 3600; // echo "\n================ ADD RECORD ===================\n"; // print_r($masterRecord); try { $module->addRecord($masterRecord); } catch (\Exception $e) { echo $e->getMessage() . "\n"; } } } /** * Delete record from slave which does not exist in master */ foreach ($slaveRecords as $slaveRecord) { if (in_array($slaveRecord->type, ['SOA'])) { continue; } $found = false; foreach ($masterRecords as $masterRecord) { if ($slaveRecord->compare($masterRecord, $domain)) { $found = true; continue; } } if (!$found) { // echo "\n================ DELETE RECORD ===================\n"; // print_r($slaveRecord); try { $module->deleteRecord($slaveRecord); } catch (\Exception $e) { echo $e->getMessage() . "\n"; } } } } }