ZoneUpdateHelper.php 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. <?php
  2. namespace MGModule\DNSManager2\mgLibs\custom\helpers;
  3. use MGModule\DNSManager2 as main;
  4. use MGModule\DNSManager2\mgLibs\custom\dns as dns;
  5. use MGModule\DNSManager2\mgLibs\custom\helpers\ZoneLogger\Manager as ZoneLoggerManager;
  6. /**
  7. * Upadting zone record sets
  8. *
  9. * @author
  10. */
  11. class ZoneUpdateHelper
  12. {
  13. private $zone;
  14. private $backup;
  15. private $module;
  16. private $backupRecords = array();
  17. /**
  18. * @var ZoneLoggerManager
  19. */
  20. private $zoneLoggerManager;
  21. public function __construct($sourceZone, $backup, ZoneLoggerManager $zoneLoggerManager)
  22. {
  23. $this->zone = $sourceZone;
  24. $this->backup = $backup;
  25. $this->module = $this->zone->getModule();
  26. $this->bulidBackupRecords();
  27. $this->zoneLoggerManager = $zoneLoggerManager;
  28. }
  29. public function update()
  30. {
  31. $currentRecords = $this->module->getRecords();
  32. $tmpBackupRecords = $this->backupRecords;
  33. $curCname = false;
  34. $soaLine = '';
  35. $soaSerial = '';
  36. foreach($currentRecords as $rKey => $cRecord)
  37. {
  38. foreach($tmpBackupRecords as $brKey => $bRecord)
  39. {
  40. if($cRecord === null || $bRecord === null)
  41. {
  42. continue;
  43. }
  44. if($cRecord->type === 'SOA')
  45. {
  46. $curCname = true;
  47. $soaLine = $cRecord->line;
  48. $soaSerial = $cRecord->$soaSerial->serial;
  49. }
  50. if($this->compareRecords($cRecord, $bRecord) === true)
  51. {
  52. unset($currentRecords[$rKey]);
  53. unset($cRecord);
  54. unset($tmpBackupRecords[$brKey]); unset($bRecord);
  55. }
  56. }
  57. }
  58. $errorMessage = '';
  59. foreach($tmpBackupRecords as $bdRecord)
  60. {
  61. try {
  62. if($bdRecord->type === 'SOA' && $curCname)
  63. {
  64. $bdRecord->line = $soaLine;
  65. $bdRecord->rdata->serial = $soaSerial;
  66. $this->module->editRecord($bdRecord);
  67. continue;
  68. }
  69. $this->module->addRecord($bdRecord);
  70. $this->zoneLoggerManager->logAddRecordToZone($this->zone, $bdRecord, 'Export: ');
  71. } catch (\Exception $e) {
  72. $errorMessage .= "<b>Record: " . $bdRecord->name . " - " . $bdRecord->type . " - " . $bdRecord->rdata->toString() . ": </b>" . $e->getMessage() . "\n";
  73. }
  74. }
  75. if($errorMessage)
  76. throw new \Exception($errorMessage);
  77. foreach($currentRecords as $cdRecord)
  78. {
  79. $cRecords = $this->module->getRecords();
  80. foreach($cRecords as $cValue)
  81. {
  82. if($cValue->type === 'SOA' && $curCname)
  83. {
  84. continue;
  85. }
  86. if($this->compareRecords($cdRecord, $cValue))
  87. {
  88. $this->module->deleteRecord($cValue);
  89. $this->zoneLoggerManager->logRemoveRecordFromZone($this->zone, $cValue, 'Export: ');
  90. }
  91. }
  92. }
  93. }
  94. protected function bulidBackupRecords()
  95. {
  96. $recordList = array();
  97. $backupRecords = $this->backup->zoneRecords;
  98. foreach($backupRecords as $bRecord)
  99. {
  100. $recordList[] = $this->buildRecordFromStd($bRecord);
  101. }
  102. $this->backupRecords = $recordList;
  103. }
  104. protected function buildRecordFromStd($stdOb)
  105. {
  106. $record = new main\mgLibs\custom\dns\record\Record();
  107. $record->name = $stdOb->name;
  108. $record->type = $stdOb->type;
  109. $record->ttl = $stdOb->ttl;
  110. $record->createRDATAObject();
  111. $record->rdata->setDataFromArray($this->buildRdataFromStd($stdOb->type, $stdOb->rdata));
  112. return $record;
  113. }
  114. protected function buildRdataFromStd($rType, $stdRdataOb)
  115. {
  116. $rDataValues = array();
  117. $className = "\\MGModule\\DNSManager2\\mgLibs\\custom\\dns\\record\\type\\".$rType;
  118. if(class_exists($className))
  119. {
  120. $rec = new $className;
  121. $obVars = get_object_vars($rec);
  122. foreach($obVars as $key => $var)
  123. {
  124. $rDataValues[$key] = $stdRdataOb->$key;
  125. }
  126. }
  127. return $rDataValues;
  128. }
  129. protected function compareRecords(dns\record\Record $rec1, dns\record\Record $rec2)
  130. {
  131. if($rec1->name === $rec2->name && (int)$rec1->ttl === (int)$rec2->ttl && $rec1->type === $rec2->type
  132. && $rec1->rdata->toString() === $rec2->rdata->toString())
  133. {
  134. return true;
  135. }
  136. return false;
  137. }
  138. }