ZoneCreator.php 12 KB

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