RecordSetHelper.php 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  1. <?php
  2. namespace MGModule\DNSManager2\mgLibs\custom\helpers;
  3. use MGModule\DNSManager2\mgLibs\custom\manager\LogHelper;
  4. use MGModule\DNSManager2\mgLibs\custom\manager\RecordHelper;
  5. use MGModule\DNSManager2 as main;
  6. use MGModule\DNSManager2\models\custom\set;
  7. use MGModule\DNSManager2\mgLibs\custom\helpers\ZoneLogger\Manager as ZoneLoggerManager;
  8. /**
  9. * Helps to manage record sets
  10. *
  11. * @author slawomir@modulesgarden.com
  12. */
  13. class RecordSetHelper
  14. {
  15. /**
  16. * @var main\models\custom\zone\Zone
  17. */
  18. protected $zone;
  19. protected $package;
  20. /**
  21. * @var ZoneLoggerManager
  22. */
  23. private $zoneLoggerManager;
  24. public function __construct(\MGModule\DNSManager2\models\custom\zone\Zone $zone, ZoneLoggerManager $zoneLoggerManager)
  25. {
  26. $this->zone = $zone;
  27. $this->zoneLoggerManager = $zoneLoggerManager;
  28. }
  29. function getPackage()
  30. {
  31. if(empty($this->package))
  32. {
  33. $this->package = $this->zone->getPackage();
  34. }
  35. return $this->package;
  36. }
  37. public function addRecordSet($setId = false,$force = false,$alreadyExists = false)
  38. {
  39. if($force)
  40. {
  41. $set = new main\models\custom\set\Set($setId);
  42. $this->addRecords($set,$alreadyExists);
  43. return true;
  44. }
  45. $package = $this->getPackage();
  46. if($setId == 'none')
  47. {
  48. return true;
  49. }
  50. if($this->zone->clientid)
  51. {
  52. $checkUserSet = $this->getSpecificSet($setId);
  53. if(!$checkUserSet )
  54. {
  55. $checkUserSet = $this->getDefaultUserSet();
  56. }
  57. if($checkUserSet && is_numeric($checkUserSet))
  58. {
  59. if($set = new main\models\custom\set\Set($checkUserSet))
  60. {
  61. $this->addRecords($set);
  62. return true;
  63. }
  64. }
  65. }
  66. if(!$package || is_null($package))
  67. {
  68. return true;
  69. }
  70. if($set = $package->getDefaultSet())
  71. {
  72. $this->addRecords($set);
  73. return true;
  74. }
  75. }
  76. private function getSpecificSet($setId)
  77. {
  78. if( is_null($setId) || $setId == 0)
  79. {
  80. return false;
  81. }
  82. $checkUserSet = main\mgLibs\MySQL\query::select(
  83. array('id','name','idu','default'),
  84. 'dns_manager2_set',
  85. array('id' => $setId)
  86. )->fetch();
  87. if($checkUserSet['idu'] && $checkUserSet['idu'] != $this->zone->clientid)
  88. {
  89. return false;
  90. }
  91. $defaultSets = $this->getPackage()->getAdminSets();
  92. if(empty($checkUserSet['idu']) && !in_array( $checkUserSet['id'], $defaultSets ))
  93. {
  94. return false;
  95. }
  96. return $checkUserSet['id'];
  97. }
  98. private function getDefaultUserSet()
  99. {
  100. $checkUserSet = main\mgLibs\MySQL\query::select(
  101. array('id','name','idu','default'),
  102. 'dns_manager2_set',
  103. array('idu' => $this->zone->clientid, 'default' => '1')
  104. )->fetchColumn('id');
  105. return $checkUserSet;
  106. }
  107. private function addRecords(main\models\custom\set\Set $set,$checkIfAlreadyExists = false)
  108. {
  109. $module = $this->zone->getModule();
  110. $rSet = array();
  111. foreach($set->getRecords() as $record)
  112. {
  113. try
  114. {
  115. $zoneRecords = $this->zone->getModule()->getRecords();
  116. $rec = new RecordHelper($record, $this->zone,$this->getNameServers());
  117. if(empty($this->zone->ip)){
  118. $this->zone->ip = $this->getDefaultIP();
  119. }
  120. $tempRec = $rec->toDNSRecord($this->zone->name, $this->zone->ip);
  121. if($tempRec->type == 'SOA')
  122. {
  123. $soaRecord = $this->getSOARecord($zoneRecords);
  124. if($soaRecord)
  125. {
  126. $tempRec->line = $soaRecord->line;
  127. $module->editRecord($tempRec);
  128. $editRecords = new main\mgLibs\custom\helpers\ZoneLogger\Actions\EditRecord($tempRec, $soaRecord);
  129. $this->zoneLoggerManager->logEditRecordsInZone($this->zone, $editRecords);
  130. continue;
  131. }
  132. }
  133. if($checkIfAlreadyExists)
  134. {
  135. $alreadyExists = $this->checkIfRecordAlreadyExists($zoneRecords, $tempRec);
  136. if($alreadyExists)
  137. {
  138. continue;
  139. }
  140. }
  141. $tempRec->nameToAbsolute($this->zone->name);
  142. $module->addRecord($tempRec);
  143. $this->zoneLoggerManager->logAddRecordToZone($this->zone, $tempRec);
  144. $rSet[] = $tempRec;
  145. }
  146. catch(\Exception $exc)
  147. {
  148. main\mgLibs\error\register::register($exc);
  149. LogHelper::addFailLogUsingZone('Add Record', $exc->getMessage(), $this->zone->id);
  150. }
  151. }
  152. if(count($rSet) > 0)
  153. {
  154. $module->removeDefaultServerRecords($rSet);
  155. }
  156. }
  157. private function getDefaultIP()
  158. {
  159. $server = new \MGModule\DNSManager2\models\custom\server\Server($this->zone->serverid);
  160. $configuration = $server->getModuleConfiguration();
  161. if (is_array($configuration))
  162. {
  163. return $configuration['default_ip'];
  164. }
  165. }
  166. private function getSOARecord(array $zoneRecords)
  167. {
  168. foreach($zoneRecords as $zoneRecord)
  169. {
  170. if($zoneRecord->type == 'SOA')
  171. {
  172. return $zoneRecord;
  173. }
  174. }
  175. return false;
  176. }
  177. private function checkIfRecordAlreadyExists(array $zoneRecords, main\mgLibs\custom\dns\record\Record $record)
  178. {
  179. foreach($zoneRecords as $zoneRecord)
  180. {
  181. if($zoneRecord->name == $record->name . '.' && $zoneRecord->type == $record->type)
  182. {
  183. $zoneRecordRDATA = get_object_vars($zoneRecord->rdata);
  184. $recordRDATA = get_object_vars($record->rdata);
  185. if($zoneRecordRDATA == $recordRDATA)
  186. {
  187. return true;
  188. }
  189. }
  190. }
  191. return false;
  192. }
  193. public static function checkAllowedRecordsLimits($packageID,$recordSetID,$currentRecords = NULL)
  194. {
  195. $packageSettings = main\models\custom\package\setting\PackageSetting::byPackageAndKey($packageID, 'allowed_record_types');
  196. $limits = unserialize($packageSettings->value);
  197. $rep = set\record\Repository::factory()->setFilter('setid',$recordSetID)->get();
  198. foreach($limits as $type => $value)
  199. {
  200. $count = 0;
  201. foreach($rep as $record)
  202. {
  203. if($record->type == $type)
  204. {
  205. $count++;
  206. }
  207. }
  208. if($currentRecords != NULL)
  209. {
  210. foreach($currentRecords as $currRecord)
  211. {
  212. if($currRecord->type == $type)
  213. {
  214. $count++;
  215. }
  216. }
  217. }
  218. if((int)$count > (int)$value && (int)$value !== -1)
  219. {
  220. return false;
  221. }
  222. }
  223. return true;
  224. }
  225. public static function formatRecordsToIndexById($records = [])
  226. {
  227. $out = [];
  228. foreach ($records as $record)
  229. {
  230. $out[$record->line] = $record;
  231. }
  232. return $out;
  233. }
  234. private function getNameServers()
  235. {
  236. global $CONFIG;
  237. foreach ( range(1, 5) as $i )
  238. {
  239. if ( isset($CONFIG['DefaultNameserver' . $i]) )
  240. {
  241. $nameServers[] = $CONFIG['DefaultNameserver' . $i];
  242. }
  243. }
  244. return $nameServers;
  245. }
  246. }