ZoneCreator.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408
  1. <?php
  2. namespace MGModule\DNSManager2\mgLibs\custom\manager;
  3. use Exception;
  4. use MGModule\DNSManager2 as main;
  5. use MGModule\DNSManager2\helpers\custom\ZoneLinked;
  6. use MGModule\DNSManager2\mgLibs\custom\helpers\DomainHelper;
  7. use MGModule\DNSManager2\mgLibs\custom\helpers\ZoneLogger\Manager as ZoneLoggerManager;
  8. use MGModule\DNSManager2\mgLibs\custom\helpers\IdnaHelper;
  9. use MGModule\DNSManager2\mgLibs\custom\helpers\AddonHelper;
  10. use MGModule\DNSManager2\mgLibs\MySQL\query;
  11. use MGModule\DNSManager2\models\custom\server;
  12. use MGModule\DNSManager2\models\custom\zone\Zone;
  13. use MGModule\DNSManager2\models\custom\zone\ZoneTypeEnum;
  14. use MGModule\DNSManager2\models\whmcs\servers\server as relatedServer;
  15. class ZoneCreator
  16. {
  17. private $zone;
  18. private $item = false;
  19. private $package = false;
  20. private $nameservers = false;
  21. private $zoneLinked;
  22. /**
  23. * @var ZoneLoggerManager
  24. */
  25. private $zoneLoggerManager;
  26. /**
  27. *
  28. * @var main\models\custom\server\Server
  29. */
  30. public $server = false;
  31. public function __construct($zone_name, $type, $relid, $ip = false, $clientid = false)
  32. {
  33. if($clientid)
  34. {
  35. $temp = explode("|",$clientid);
  36. $clientid = $temp[0];
  37. }
  38. $this->zone = new Zone();
  39. $this->zone->name = strtolower($zone_name);
  40. $this->zone->relid = $relid;
  41. $this->zone->type = $type;
  42. $this->zone->clientid = $clientid?:$this->zone->getRelatedItem()->clientID();
  43. $this->zone->is_locked = 0;
  44. $this->nameservers = $this->getNameServers($relid, $type);
  45. $item = $this->zone->getPackageItem();
  46. if($item === false)
  47. {
  48. return ;
  49. }
  50. $this->item = $item;
  51. $this->package = $item->getPackage();
  52. foreach ($this->package->getServers() as $packageServer){
  53. if($packageServer->isMaster())
  54. {
  55. if(!$packageServer->getServer()->isEnabled())
  56. {
  57. $serverName = $packageServer->getServer() ? $packageServer->getServer()->name : '';
  58. throw new \Exception(main\mgLibs\lang::T('master_server_disabled') . $serverName);
  59. }
  60. $this->server = $packageServer->getServer();
  61. }
  62. }
  63. if(!$this->server)
  64. {
  65. $this->server = $this->package->getFirstActiveServer();
  66. }
  67. if($this->server === false)
  68. {
  69. return ;
  70. }
  71. $dedicatedIp = false;
  72. $relatedServerIp = false;
  73. if($type == ZoneTypeEnum::HOSTING)
  74. {
  75. $dedicatedIp = $this->zone->getRelatedItem()->dedicatedIP;
  76. $relatedServerId = $this->zone->getRelatedItem()->serverID;
  77. if(!empty($relatedServerId)) {
  78. $relatedServer = new relatedServer($relatedServerId);
  79. $relatedServerIp = $relatedServer->ip;
  80. }
  81. }
  82. if(!empty($ip))
  83. {
  84. $this->zone->ip = $ip;
  85. }
  86. elseif(!empty($dedicatedIp))
  87. {
  88. $this->zone->ip = $dedicatedIp;
  89. }
  90. elseif(!empty($relatedServerIp))
  91. {
  92. $this->zone->ip = $relatedServerIp;
  93. }
  94. else
  95. {
  96. $this->zone->ip = $this->server->getModuleConfiguration('default_ip');
  97. }
  98. //$this->zone->ip = empty($ip)?$this->server->getModuleConfiguration('default_ip'):$ip;
  99. $this->zone->serverid = $this->server->id;
  100. $this->zoneLinked = new ZoneLinked($this->zone);
  101. }
  102. public function isZoneAlreadyExistInDB()
  103. {
  104. $rep = main\models\custom\zone\Repository::factory()->byName($this->zone->name)->byServerID($this->server->id);
  105. return $rep->count() > 0;
  106. }
  107. public function getPackage()
  108. {
  109. return $this->package;
  110. }
  111. private function isSubdomain()
  112. {
  113. $helper = new DomainHelper($this->zone->name);
  114. return $helper->isSubdamain();
  115. }
  116. private function isDomainValid()
  117. {
  118. $helper = new DomainHelper($this->zone->name);
  119. return $helper->isValid();
  120. }
  121. private function isAlreadyInWHMCSDatabase()
  122. {
  123. $checkTblHosting = main\mgLibs\MySQL\query::query("SELECT id FROM tblhosting WHERE BINARY domain = BINARY :domain AND userid <> :userid AND domainstatus NOT IN ('Cancelled', 'Terminated', 'Fraud')", array('domain' => $this->zone->name, 'userid' => $this->zone->clientid))->fetch();
  124. if($checkTblHosting !== false)
  125. {
  126. return true;
  127. }
  128. $checkTblDomains = main\mgLibs\MySQL\query::query("SELECT id FROM tbldomains WHERE BINARY domain = BINARY :domain AND userid <> :userid AND status NOT IN ('Cancelled', 'Transferred Away', 'Fraud')", array('domain' => $this->zone->name, 'userid' => $this->zone->clientid))->fetch();
  129. if($checkTblDomains !== false)
  130. {
  131. return true;
  132. }
  133. return false;
  134. }
  135. public function create( $recordSetId = false, $force = false )
  136. {
  137. try
  138. {
  139. if(AddonHelper::isAddonTurnedON('ResellersCenter') === false && AddonHelper::isAddonTurnedON('Multibrand') === false)
  140. {
  141. }
  142. }
  143. catch(Exception $e)
  144. {
  145. return 'Problem occured! Please contact administrator.';
  146. }
  147. if(!$this->isDomainValid())
  148. {
  149. return "Invalid zone name";
  150. }
  151. if($this->isSubdomain())
  152. {
  153. return "Subdomain is not allowed";
  154. }
  155. if($this->package === false)
  156. {
  157. return "No package found";
  158. }
  159. if($this->package->status == '0')
  160. {
  161. return "Package is disabled";
  162. }
  163. if($this->server == false) //LOG?
  164. {
  165. return "There is no active server";
  166. }
  167. if($this->zoneLinked->connectByNewZone())
  168. {
  169. LogHelper::addSuccessLog('Linked Zones', 'Linked zones from domain and hosting', $this->zone->name, $this->zone->clientid);
  170. return;
  171. }
  172. if ( !$force && ( $this->isZoneAlreadyExistInDB() || $this->isAlreadyInWHMCSDatabase() ) )
  173. {
  174. return main\mgLibs\lang::T('zone_already_taken');
  175. }
  176. $module = $this->server->getModule();
  177. $module->setDomain($this->zone->name);
  178. if($this->zone->ip)
  179. {
  180. $module->setIP($this->zone->ip);
  181. }
  182. $this->zone->created_at = date('Y-m-d H:i:s');
  183. try
  184. {
  185. if ( !$module->zoneExists() )
  186. {
  187. $module->activateZone();
  188. } elseif ( !$force )
  189. {
  190. return main\mgLibs\lang::T('zone_already_taken');
  191. }
  192. $this->getZoneLoggerManager()->logCreateZoneAction($this->zone);
  193. $setHelper = new main\mgLibs\custom\helpers\RecordSetHelper($this->zone, $this->getZoneLoggerManager());
  194. $set = $setHelper->addRecordSet($recordSetId);
  195. $this->zone->status = 1;
  196. $this->updateOrSave();
  197. $soaOverwrite = server\setting\ServerSetting::byServerAndKey($this->server->id, server\setting\ServerSettingEnum::OVERWRITE_SOA);
  198. $populateNS = server\setting\ServerSetting::byServerAndKey($this->server->id, server\setting\ServerSettingEnum::POPULATE_NS);
  199. if($soaOverwrite == 'on')
  200. {
  201. $this->overwriteSoa($module);
  202. }
  203. if($populateNS == 'on')
  204. {
  205. $this->populateNsRecords($module);
  206. }
  207. $clientID = explode("|", $this->zone->clientid)[0];
  208. // LogHelper::addSuccessLog('Add Zone', '', $this->zone->name, $clientID);
  209. EmailNotificationHelper::sendClientNotification(DefaultNotifications::GENERAL_ZONE_CREATED_NOTIFICATION, $clientID, $this->item->type, $this->item->relid, array(
  210. 'zone_name' => $this->zone->name,
  211. ));
  212. return true;
  213. }
  214. catch(Exception $exc)
  215. {
  216. $this->zone->status = 0;
  217. $this->zone->save();
  218. LogHelper::addFailLog('Add Zone', $exc->getMessage(), $this->zone->name, $this->zone->clientid);
  219. NotificationHelper::addProblemNotification('Zone creation failed ('. $this->zone->name .')');
  220. throw $exc;
  221. }
  222. }
  223. private function updateOrSave(){
  224. if($this->isZoneAlreadyExistInDB()){
  225. $rep = main\models\custom\zone\Repository::factory()->byName($this->zone->name)->byServerID($this->server->id)->one();
  226. $rep->relid = $this->zone->relid;
  227. $rep->updated_at = $this->zone->created_at;
  228. $rep->save();
  229. }else{
  230. $this->zone->save();
  231. }
  232. }
  233. private function overwriteSoa(main\mgLibs\custom\SubmoduleCap $module)
  234. {
  235. $serverNSconfig = server\nameserver\Repository::factory()->setFilter('serverid', $this->server->id)->get();
  236. if($serverNSconfig)
  237. {
  238. $soa = $module->getRecords('SOA');
  239. $soaRecord = $soaOldRecord = $soa[0];
  240. if($serverNSconfig[0]->name)
  241. {
  242. $soaRecord->rdata->mname = $serverNSconfig[0]->name;
  243. }
  244. }
  245. if($soaRecord instanceof main\mgLibs\custom\dns\record\Record)
  246. {
  247. $module->editRecord($soaRecord);
  248. $zoneEditRecord = new main\mgLibs\custom\helpers\ZoneLogger\Actions\EditRecord($soaRecord, $soaOldRecord);
  249. $this->getZoneLoggerManager()->logEditRecordsInZone($this->zone, $zoneEditRecord);
  250. }
  251. return;
  252. }
  253. private function populateNsRecords(main\mgLibs\custom\SubmoduleCap $module)
  254. {
  255. $nsAuth = [];
  256. $nsAnswer = dns_get_record(IdnaHelper::idnaEncode($this->zone->name),DNS_NS, $nsAuth);
  257. $domainNameserver = $nsAuth ?: $nsAnswer;
  258. $zoneNameserver = $module->getRecords('NS');
  259. foreach($domainNameserver as $domainNs)
  260. {
  261. try{
  262. foreach($zoneNameserver as $zoneNs)
  263. {
  264. if(trim($zoneNs->name, '.') === $domainNs['host'] && trim($zoneNs->rdata->nsdname, '.') === $domainNs['target'])
  265. {
  266. continue 2;
  267. }
  268. }
  269. $record = main\mgLibs\custom\dns\record\Record::tryToCreateFromArray($domainNs);
  270. $record->name = $domainNs['host'].'.';
  271. $record->rdata->nsdname = $domainNs['target'];
  272. $module->addRecord($record);
  273. $this->getZoneLoggerManager()->logAddRecordToZone($this->zone, $record);
  274. } catch (Exception $e) {
  275. LogHelper::addFailLog('Populate NS Records', $e->getMessage(), $this->zone->name, $this->zone->clientid);
  276. continue;
  277. }
  278. }
  279. }
  280. public function getZone()
  281. {
  282. return $this->zone;
  283. }
  284. /**
  285. * @return ZoneLoggerManager
  286. */
  287. public function getZoneLoggerManager()
  288. {
  289. if(!$this->zoneLoggerManager)
  290. {
  291. $this->zoneLoggerManager = new ZoneLoggerManager();
  292. }
  293. return $this->zoneLoggerManager;
  294. }
  295. /**
  296. * @param ZoneLoggerManager $zoneLoggerManager
  297. */
  298. public function setZoneLoggerManager($zoneLoggerManager)
  299. {
  300. $this->zoneLoggerManager = $zoneLoggerManager;
  301. }
  302. private function getNameServers( $relid, $type)
  303. {
  304. switch ( $type )
  305. {
  306. case 1:
  307. $type = 'tbldomains';
  308. break;
  309. case 2:
  310. $type = 'tblhosting';
  311. break;
  312. case 3:
  313. $type = 'tblhostingaddons';
  314. break;
  315. default :
  316. $type = false;
  317. break;
  318. }
  319. if ( $type )
  320. {
  321. $sql = "SELECT tblorders.id AS product_id,tblorders.nameservers
  322. FROM $type
  323. INNER JOIN tblorders ON $type.orderid = tblorders.id
  324. WHERE $type.id = :relid";
  325. $nameServers = query::query($sql, ['relid' => $relid])->fetch();
  326. $nameServers = explode(',', $nameServers['nameservers']);
  327. }
  328. else
  329. {
  330. $nameServers = false;
  331. }
  332. if ( !is_array($nameServers) || !count($nameServers) )
  333. {
  334. global $CONFIG;
  335. foreach ( range(1, 5) as $i )
  336. {
  337. if ( isset($CONFIG['DefaultNameserver' . $i]) )
  338. {
  339. $nameServers[] = $CONFIG['DefaultNameserver' . $i];
  340. }
  341. }
  342. }
  343. return $nameServers;
  344. }
  345. }