Zone.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365
  1. <?php
  2. /**
  3. * Description of Zone
  4. *
  5. * @author Vitalii Aloksa
  6. */
  7. namespace MGModule\DNSManager2\mgLibs\ModuleAPI;
  8. use MGModule\DNSManager2\mgLibs\custom\helpers\RecordSetHelper;
  9. use MGModule\DNSManager2\mgLibs\custom\helpers\ZoneLogger\Actions\EditRecord;
  10. use MGModule\DNSManager2\mgLibs\custom\helpers\ZoneLogger\Manager as ZoneLoggerManager;
  11. use \MGModule\DNSManager2\models\custom\dns;
  12. use \MGModule\DNSManager2\models\custom\zone\Zone as ZoneModel;
  13. use \MGModule\DNSManager2\mgLibs\custom\manager\ZoneCreator;
  14. use \MGModule\DNSManager2\mgLibs\custom\manager\ZoneRemover;
  15. use \MGModule\DNSManager2\mgLibs\custom\dns\record\Record;
  16. use \MGModule\DNSManager2\mgLibs\custom\manager\LogHelper;
  17. class Zone extends Api
  18. {
  19. //put your code here
  20. public $data;
  21. protected $module;
  22. protected $zone;
  23. /*
  24. * !IMPORTANT
  25. *
  26. * this array is used to declare the variables, that will be used in API.
  27. * You may declare several api versions, that could have differnet names of api data values.
  28. * DO NOT change the keys, it is used in the code, and should not be changed,
  29. * only the values are the names, that will be looked for in the INPUT DATA (POST/GET)
  30. */
  31. public $dataFields = array(
  32. 'api1' => array(
  33. 'userid' => 'userid',
  34. 'zone_id' => 'zone_id',
  35. 'zone_name' => 'zone_name',
  36. 'zone_ip' => 'zone_ip',
  37. 'type' => 'type',
  38. 'modulename' => 'modulename',
  39. 'config' => 'config',
  40. 'recordSet' => 'recordSet',
  41. )
  42. );
  43. function __construct( $data )
  44. {
  45. parent::__construct($data);
  46. $this->processZoneID();
  47. if(!isset($data['internal_use']) && $data['dnsaction'] != 'createZone')
  48. {
  49. $this->loadModule();
  50. }
  51. }
  52. /*
  53. * PREPARE METHODS
  54. */
  55. public function loadModule( )
  56. {
  57. $this->laodSubmoduleFromZone();
  58. $this->loadSubmodule();
  59. if(!is_object($this->module))
  60. {
  61. throw new \Exception(Response::errorSubmodule('notfound'));
  62. }
  63. }
  64. public function laodSubmoduleFromZone()
  65. {
  66. if ( $this->module )
  67. {
  68. return $this->module;
  69. }
  70. if(!isset($this->data['zone_id']))
  71. {
  72. return false;
  73. }
  74. $zoneid = $this->data['zone_id'];
  75. Validator::isValidZoneID( $zoneid );
  76. $ZoneModel = new ZoneModel( $zoneid );
  77. $this->zone = $ZoneModel;
  78. $this->module = $ZoneModel->getModule();
  79. return $this->module;
  80. }
  81. public function loadSubmodule( )
  82. {
  83. try {
  84. if($this->module)
  85. {
  86. return $this->module;
  87. }
  88. $modulename = $this->data['modulename'];
  89. $config = $this->data['config'];
  90. Validator::isValidModuleConfig($modulename, $config);
  91. $this->module = dns\Core::getModule($modulename);
  92. $configuration = $this->getConfiguration();
  93. $this->module->setConfiguration($configuration);
  94. } catch (\Exception $ex) {
  95. Response::proccessExceptionResponse($this->errors, $ex);
  96. }
  97. return $this->module;
  98. }
  99. public function processZoneID( )
  100. {
  101. if(isset($this->data['zone_id']))
  102. {
  103. $this->data['zone_id'] = (int) $this->data['zone_id'];
  104. }
  105. }
  106. /*
  107. * API METHODS
  108. */
  109. public function get( )
  110. {
  111. $zone = $this->module->getZone();
  112. $zone->records = $this->module->getRecords();
  113. if($this->module->moduleHasMethod('getSignKeys'))
  114. {
  115. try
  116. {
  117. $zone->dnssec = $this->module->getSignKeys();
  118. }
  119. catch (\Exception $exception)
  120. {
  121. //do Nothing
  122. }
  123. }
  124. LogHelper::addSuccessLogUsingZone('api_getZone', 'Get Zone: ' . $this->zone->name , $this->zone);
  125. /*
  126. * @TODO: make response
  127. */
  128. return $zone;
  129. }
  130. public function create()
  131. {
  132. try {
  133. Validator::isValidZoneCreateData( $this->data );
  134. $ZoneCreator = new ZoneCreator( $this->data['zone_name'], $this->data['type'], $this->data['relid'], $this->data['zone_ip'], $this->data['userid'] );
  135. $result = $ZoneCreator->create( (int) $this->data['recordSet'] );
  136. LogHelper::addSuccessLogUsingZone('api_createZone', 'Zone: ' . $this->data['zone_name'] . ' created', $this->zone);
  137. if($result != true)
  138. {
  139. throw new \Exception($result);
  140. }
  141. return Response::successZoneCreate();
  142. } catch (\Exception $ex) {
  143. LogHelper::addFailLogUsingZone('api_createZone', $ex->getMessage(), $this->zone);
  144. Response::proccessExceptionResponse($this->errors, $ex);
  145. }
  146. }
  147. public function update( )
  148. {
  149. $client = $_SESSION['uid'] ? $_SESSION['uid'] : $this->zone->clientid;
  150. $zoneLoggerManager = new ZoneLoggerManager($client);
  151. try {
  152. $postRecords = $this->data['records'];
  153. $existedRecords = $this->module->getRecords();
  154. $oldRecords = RecordSetHelper::formatRecordsToIndexById($existedRecords);
  155. $recordArray = array();
  156. $postHelper = [];
  157. foreach ($postRecords as $postKey => $postRecord) {
  158. if($postRecord instanceof Record)
  159. {
  160. $postRecord = $postRecord->toArray(false);
  161. }
  162. if($postRecord['rdata'])
  163. {
  164. $postRecord['data'] = $postRecord['rdata'];
  165. unset($postRecord['rdata']);
  166. }
  167. $postHelper[$postKey]['exists'] = false;
  168. foreach ($existedRecords as $key => $record) {
  169. if(empty($recordArray[$key]))
  170. {
  171. $recordArray[$key]['id'] = $record->line;
  172. $recordArray[$key]['name'] = $record->name;
  173. $recordArray[$key]['type'] = $record->type;
  174. $recordArray[$key]['class'] = $record->class;
  175. $recordArray[$key]['ttl'] = $record->ttl;
  176. $recordArray[$key]['data'] = $record->rdata->toString();
  177. $recordArray[$key]['rdata'] = $record->rdata->toArray(false);
  178. $recordArray[$key]['exists'] = false;
  179. }
  180. //UPDATE IF EXISTS
  181. if((isset($postRecord['id']) && $record->line == $postRecord['id'] || (isset($postRecord['line']) && $postRecord['line'] == $record->line)) ||
  182. $this->compareRecords( $postRecord, $record )
  183. )
  184. {
  185. try {
  186. $record->setDataFromArray($postRecord);
  187. if(is_array($postRecord['data'])){
  188. $record->rdata->setDataFromArray($postRecord['data']);
  189. }else{
  190. $record->rdata->fromString($postRecord['data']);
  191. }
  192. $record->decode();
  193. $this->module->editRecord($record);
  194. $zoneLoggerManager->logEditRecordsInZone($this->zone, new EditRecord($record, $oldRecords[$record->line]), 'API: ');
  195. // LogHelper::addSuccessLogUsingZone('api_editRecord', 'Record: ' . $record->name . ' updated', $this->zone);
  196. } catch (\Exception $ex) {
  197. LogHelper::addFailLogUsingZone('api_editRecord', $ex->getMessage(), $this->zone);
  198. }
  199. $recordArray[$key]['exists'] = true;
  200. $postHelper[$postKey]['exists'] = true;
  201. }
  202. }
  203. }
  204. foreach ($postRecords as $postKey => $postRecord)
  205. {
  206. if($postHelper[$postKey]['exists'] === false)
  207. {
  208. try {
  209. $newRecord = Record::tryToCreateFromArray($postRecord);
  210. if(is_array($postRecord['data'])){
  211. $newRecord->rdata->setDataFromArray($postRecord['data']);
  212. }else{
  213. $newRecord->rdata->fromString($postRecord['data']);
  214. }
  215. $newRecord->decode();
  216. $this->module->addRecord($newRecord);
  217. $zoneLoggerManager->logAddRecordToZone($this->zone, $newRecord, 'API: ');
  218. // LogHelper::addSuccessLogUsingZone('api_addRecord', 'Record: ' . $newRecord->name . ' added', $this->zone);
  219. } catch (\Exception $ex) {
  220. LogHelper::addFailLogUsingZone('api_addRecord', $ex->getMessage(), $this->zone);
  221. }
  222. $postHelper[$postKey]['exists'] = true;
  223. }
  224. }
  225. foreach ($recordArray as $key => $recordItem) {
  226. if($recordItem['exists'] === false)
  227. {
  228. try {
  229. $recordToDelete = $existedRecords[$key];
  230. // LogHelper::addFailLogUsingZone('api_addRecord', json_encode($recordToDelete), $this->zone);
  231. // LogHelper::addFailLogUsingZone('api_addRecord', get_class($recordToDelete), $this->zone);
  232. $this->module->deleteRecord($recordToDelete);
  233. $zoneLoggerManager->logAddRecordToZone($this->zone, $recordToDelete, 'API: ');
  234. // LogHelper::addSuccessLogUsingZone('api_deleteRecord', 'Record: ' . $recordToDelete->name . ' removed', $this->zone);
  235. } catch (\Exception $ex) {
  236. LogHelper::addFailLogUsingZone('api_deleteRecord', $ex->getMessage(), $this->zone);
  237. }
  238. }
  239. }
  240. return Response::successZoneUpdate();
  241. } catch (\Exception $ex) {
  242. Response::proccessExceptionResponse($this->errors, $ex);
  243. }
  244. }
  245. protected function compareRecords( $postRecord, $record )
  246. {
  247. $parsedName = preg_replace('/.'.$this->zone->name.'/', '', $record->name);
  248. if(
  249. ($postRecord['name'] == $record->name || $postRecord['name'] == $parsedName) &&
  250. $postRecord['type'] == $record->type &&
  251. $postRecord['class'] == $record->class &&
  252. $postRecord['ttl'] == $record->ttl &&
  253. (
  254. $postRecord['data'] == $record->rdata->toArray(false) ||
  255. $postRecord['data'] == $record->rdata->toString() ||
  256. strtolower($postRecord['data']) == trim( $record->rdata->toString(), '"')
  257. ))
  258. {
  259. return true;
  260. }
  261. }
  262. public function remove( )
  263. {
  264. $client = $_SESSION['uid'] ? $_SESSION['uid'] : $this->zone->clientid;
  265. $zoneLoggerManager = new ZoneLoggerManager($client);
  266. try {
  267. Validator::isValidZoneDeleteData($this->data, $this->zone);
  268. ZoneRemover::removeZone($this->zone);
  269. $zoneLoggerManager->logTerminateZoneAction($this->zone, 'API: ');
  270. // LogHelper::addSuccessLogUsingZone('Remove Zone', '', $this->zone);
  271. Response::successZoneRemove();
  272. // LogHelper::addSuccessLogUsingZone('api_RemoveZone', 'Zone' .$this->zone->name . ' removed', $this->zone);
  273. } catch (\Exception $ex) {
  274. Response::proccessExceptionResponse($this->errors, $ex);
  275. LogHelper::addFailLogUsingZone('api_RemoveZone', $ex->getMessage(), $this->zone);
  276. // throw $ex;
  277. }
  278. }
  279. public function transfer( )
  280. {
  281. /*
  282. * TODO: make transfer zone after transfer domain/hosting in the API
  283. */
  284. }
  285. }