Import.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. <?php
  2. namespace MGModule\DNSManager2\mgLibs\custom\task;
  3. use \Exception;
  4. use MGModule\DNSManager2\mgLibs\custom\helpers\IdnaHelper;
  5. use \MGModule\DNSManager2\mgLibs\custom\manager;
  6. use \MGModule\DNSManager2\mgLibs\custom\TaskManager;
  7. use \MGModule\DNSManager2\models\custom\globalsetting\GlobalSettingEnum;
  8. use \MGModule\DNSManager2\models\custom\server;
  9. use \MGModule\DNSManager2\models\custom\task;
  10. use \MGModule\DNSManager2\models\custom\zone\Zone;
  11. use \MGModule\DNSManager2\models\custom\zone\Repository as ZoneRepo;
  12. use \MGModule\DNSManager2\mgLibs\custom\manager\LogHelper;
  13. use \MGModule\DNSManager2\mgLibs\custom\task\TaskTypeCodesCodes;
  14. use \MGModule\DNSManager2\mgLibs\custom\dns\utils\ReverseDNSHelper;
  15. use \MGModule\DNSManager2\models\custom\reverse\Reverse;
  16. use \MGModule\DNSManager2\models\custom\reverse\Repository as ReverseRepo;
  17. use MGModule\DNSManager2\mgLibs\custom\manager\GlobalSettingHelper;
  18. use MGModule\DNSManager2\mgLibs\custom\helpers\datatable\Import as Importer;
  19. class Import extends TaskAbstract
  20. {
  21. protected $abort_after_repeats = array('main' => 0);
  22. protected $taskTypeCode = TaskTypeCodesCodes::IMPORT;
  23. public function mainDescription()
  24. {
  25. $server_from = new server\Server($this->getParams('from'));
  26. return 'Import from: ' . $server_from->name;
  27. }
  28. public function main($params)
  29. {
  30. $cron_import_run_each = manager\GlobalSettingHelper::getSetting(GlobalSettingEnum::CRON_IMPORT_RUN_EACH?:5);
  31. if(!$this->isReadyToRun( $cron_import_run_each ))
  32. {
  33. return true;
  34. }
  35. LogHelper::addSuccessLog('Cron Importer', 'Cron Importer Started');
  36. if($this->getStatus() == task\TaskStatusEnum::START)
  37. {
  38. $this->addChild('fetchZonesList')->run();
  39. $this->setStatus(task\TaskStatusEnum::IN_PROGRESS);
  40. }
  41. elseif($this->getStatus() == task\TaskStatusEnum::IN_PROGRESS)
  42. {
  43. $zones_per_run = manager\GlobalSettingHelper::getSetting(GlobalSettingEnum::CRON_IMPORT_ZONES_PER_RUN);
  44. $childs = $this->getXChilds($zones_per_run, 'import', task\TaskStatusEnum::START);
  45. if(count($childs) < $zones_per_run)
  46. {
  47. $childs += $this->getXChilds($zones_per_run - count($childs), 'import');
  48. }
  49. foreach($childs as $child)
  50. {
  51. LogHelper::addSuccessLog('Cron Importer', 'Child task ran ' . get_class($child));
  52. $child->run();
  53. }
  54. $this->setFinishedStatusOnCronRun('import', $zones_per_run);
  55. }
  56. LogHelper::addSuccessLog('Cron Importer', 'End Of Cron Importer Run');
  57. }
  58. public function fetchZonesList($params)
  59. {
  60. if($this->isInCliMode())
  61. {
  62. LogHelper::addSuccessLog('Cron Importer', 'Fetching Zones List For Server Id: '.$this->parent->getParams('from').' Started.');
  63. }
  64. $server_from = new server\Server($this->parent->getParams('from'));
  65. $importHelper = new Importer();
  66. $rep = $importHelper->getNeeded($server_from->getModule()->getZones());
  67. foreach($rep as $domain => $ip)
  68. {
  69. if(ZoneRepo::factory()->byServerID($server_from->id)->byName(IdnaHelper::idnaDecode($domain))->one() === FALSE)
  70. {
  71. $this->addResult(array(
  72. 'domain' => IdnaHelper::idnaDecode($domain),
  73. 'ip' => $ip,
  74. ));
  75. }
  76. }
  77. $this->setStatus(task\TaskStatusEnum::FINISHED);
  78. if($this->isInCliMode())
  79. {
  80. LogHelper::addSuccessLog('Cron Importer', 'Fetching Zones List For Server Id: '.$this->parent->getParams('from').' Completed.');
  81. }
  82. }
  83. public function import($params)
  84. {
  85. if(strpos($params['domain'], '.arpa') !== FALSE)
  86. {
  87. $this->importRDNS($params);
  88. return;
  89. }
  90. try
  91. {
  92. $server_from = new server\Server($this->parent->getParams('from'));
  93. $module_from = $server_from->getModule();
  94. $module_from->setDomain(IdnaHelper::idnaDecode($params['domain']));
  95. if($module_from->isIPRequired())
  96. {
  97. $module_from->setIP($params['ip']);
  98. }
  99. $zone = new Zone();
  100. $zone->clientid = $this->getParams('clientid');
  101. $zone->type = $this->getParams('type');
  102. $zone->relid = $this->getParams('relid');
  103. $zone->name = IdnaHelper::idnaDecode($this->getParams('domain'));
  104. $zone->ip = $this->getParams('ip');
  105. $zone->serverid = $server_from->id;
  106. $zone->status = 1;
  107. if(!$module_from->zoneExists())
  108. {
  109. $zone->status = 0;
  110. }
  111. $zone->save();
  112. $this->setStatus(task\TaskStatusEnum::FINISHED);
  113. $result = TaskManager::getTaskResultByID($this->getParams('resultid'));
  114. $result->data['status'] = 'imported';
  115. $result->save();
  116. LogHelper::addSuccessLogUsingZone('Cron Importer - Import Zone', 'Zone Imported', $zone);
  117. }
  118. catch(Exception $exc)
  119. {
  120. $result = TaskManager::getTaskResultByID($this->getParams('resultid'));
  121. $result->data['status'] = 'error';
  122. $result->save();
  123. LogHelper::addFailLog('Cron Importer - Import Failed', $exc->getMessage());
  124. }
  125. }
  126. public function importRDNS($params)
  127. {
  128. try
  129. {
  130. $server = new server\Server($this->parent->getParams('from'));
  131. $module = $server->getModule();
  132. $module->setDomain($params['domain']);
  133. $ptrs = [];
  134. foreach($module->getRecords() as $record)
  135. {
  136. if($record->type == 'PTR')
  137. {
  138. $ptrs[] = $record;
  139. }
  140. }
  141. if(!$ptrs)
  142. {
  143. throw new \MGModule\DNSManager2\mgLibs\custom\dns\exceptions\DNSException(sprintf('%s : Cannot find any ptr record.', $params['domain']));
  144. }
  145. if(strpos($params['domain'], 'ip6') !== false)
  146. {
  147. $this->importRDNSv6($params,$ptrs);
  148. return;
  149. }
  150. foreach($ptrs as $ptr)
  151. {
  152. $reverseHelper = ReverseDNSHelper::buildReverseFromARPA($ptr,$params['domain']);
  153. $zone = ZoneRepo::factory()->setFilter('name', $reverseHelper['from'])->setFilter('clientid', $params['clientid'])->get();
  154. if(!$zone && ((int)$params['type'] != 0 && (int)$params['relid'] != 0))
  155. {
  156. throw new \MGModule\DNSManager2\mgLibs\custom\dns\exceptions\DNSException($reverseHelper['from'] . ' : Cannot be imported');
  157. }
  158. if(ReverseRepo::factory()->byServerID($server->id)->byIP($reverseHelper['ip'])->get())
  159. {
  160. LogHelper::addFailLog('Cron Importer - Import Failed', $params['domain'] . ' - ' . $reverseHelper['ip'] . ' already exists.');
  161. continue;
  162. }
  163. $reverse = new Reverse;
  164. $reverse->serverid = $server->id;
  165. $reverse->clientid = $params['clientid'];
  166. $reverse->from = $reverseHelper['from'];
  167. $reverse->sub = '';
  168. //$reverse->name = $params['domain'];
  169. $reverse->name = ReverseDNSHelper::reverseZoneName($reverseHelper['ip']);
  170. $reverse->ip = $reverseHelper['ip'];
  171. $reverse->ttl = $reverseHelper['ttl'];
  172. $reverse->created_at= date('Y-m-d H:i:s');
  173. $reverse->save();
  174. }
  175. $this->setStatus(task\TaskStatusEnum::FINISHED);
  176. $result = TaskManager::getTaskResultByID($this->getParams('resultid'));
  177. $result->data['status'] = 'imported';
  178. $result->save();
  179. LogHelper::addSuccessLogUsingZone('Cron Importer - Import Zone', 'Zone Imported', $zone);
  180. }
  181. catch (Exception $ex)
  182. {
  183. $result = TaskManager::getTaskResultByID($this->getParams('resultid'));
  184. $result->data['status'] = 'error';
  185. $result->save();
  186. LogHelper::addFailLog('Cron Importer - Import Failed', $ex->getMessage());
  187. }
  188. }
  189. public function importRDNSv6($params,$ptrs)
  190. {
  191. try
  192. {
  193. $server = new server\Server($this->parent->getParams('from'));
  194. foreach($ptrs as $ptr)
  195. {
  196. $zone = ZoneRepo::factory()->setFilter('name', $ptr->rdata->ptrdname)->setFilter('clientid', $params['clientid'])->get();
  197. if(!$zone && ((int)$params['type'] != 0 && (int)$params['relid'] != 0))
  198. {
  199. throw new \MGModule\DNSManager2\mgLibs\custom\dns\exceptions\DNSException($ptr->rdata->ptrdname . ' : Cannot be imported');
  200. }
  201. $ipv6 = ReverseDNSHelper::fromIP6Arpa($params['domain'],$ptr->name);
  202. if(ReverseRepo::factory()->byServerID($server->id)->byIP($ipv6)->get())
  203. {
  204. LogHelper::addFailLog('Cron Importer - Import Failed', $params['domain'] . ' - ' . $ipv6 . ' already exists.');
  205. continue;
  206. }
  207. $reverse = new Reverse;
  208. $reverse->serverid = $server->id;
  209. $reverse->clientid = $params['clientid'];
  210. $reverse->from = $ptr->rdata->ptrdname;
  211. $reverse->sub = '';
  212. $reverse->name = IdnaHelper::idnaDecode($params['domain']);
  213. $reverse->ip = $ipv6;
  214. $reverse->ttl = $ptr->ttl;
  215. $reverse->created_at= date('Y-m-d H:i:s');
  216. $reverse->save();
  217. }
  218. $this->setStatus(task\TaskStatusEnum::FINISHED);
  219. $result = TaskManager::getTaskResultByID($this->getParams('resultid'));
  220. $result->data['status'] = 'imported';
  221. $result->save();
  222. }
  223. catch (Exception $ex)
  224. {
  225. $result = TaskManager::getTaskResultByID($this->getParams('resultid'));
  226. $result->data['status'] = 'error';
  227. $result->save();
  228. LogHelper::addFailLog('Cron Importer - Import Failed', $ex->getMessage());
  229. }
  230. }
  231. }