AWSRoute53ResponseParseHelper.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324
  1. <?php
  2. namespace MGModule\DNSManager2\mgLibs\custom\dns\submodules\AWSRoute53;
  3. use \MGModule\DNSManager2\mgLibs\custom\dns;
  4. class AWSRoute53ResponseParseHelper
  5. {
  6. public static function zoneListXmlToArray($xmlList)
  7. {
  8. $zonesList = array();
  9. foreach($xmlList->HostedZones->children() as $zone)
  10. {
  11. $zonesList[$zone->Name->__toString()] = '';
  12. }
  13. return $zonesList;
  14. }
  15. public static function findZoneOnZoneList($xmlList, $domain)
  16. {
  17. foreach($xmlList->HostedZones->children() as $zone)
  18. {
  19. $zoneName = $zone->Name->__toString();
  20. if($zoneName === $domain || trim($zoneName, '.') === $domain)
  21. {
  22. return $zone->Id->__toString();
  23. }
  24. }
  25. return false;
  26. }
  27. public static function checkResponseForErrors($xmlResponse)
  28. {
  29. if($xmlResponse->Error)
  30. {
  31. return array(
  32. 'code' => $xmlResponse->Error->Code->__toString(),
  33. 'message' => $xmlResponse->Error->Message->__toString(),
  34. 'type' => $xmlResponse->Error->Type->__toString()
  35. );
  36. }
  37. return false;
  38. }
  39. public static function prepareRecordList($xmlRecordsList, $availableRecordTypes = array(), $editSoa = false)
  40. {
  41. $recordList = array();
  42. foreach($xmlRecordsList->ResourceRecordSets->children() as $aRecord)
  43. {
  44. $rType = self::getRecordType($aRecord);
  45. if(!$editSoa && $rType == 'SOA')
  46. {
  47. continue;
  48. }
  49. if(in_array($rType, $availableRecordTypes))
  50. {
  51. $record = new dns\record\Record();
  52. $record->name = $aRecord->Name->__toString();
  53. $record->type = $rType;
  54. $record->ttl = $aRecord->TTL->__toString();
  55. $record->createRDATAObject();
  56. switch($rType)
  57. {
  58. case 'ALIAS':
  59. $record->rdata->fromString(self::parseRDataForALIASRecords($aRecord->AliasTarget));
  60. $record->line = md5((string)$record->rdata);
  61. $recordList[] = $record;
  62. break;
  63. case 'NS':
  64. case 'A':
  65. case 'AAAA':
  66. case 'MX':
  67. case 'TXT':
  68. self::parseMultihostRecords($recordList, $record, $aRecord);
  69. break;
  70. default:
  71. $record->rdata->fromString(self::parseRData($aRecord->ResourceRecords));
  72. $record->line = md5((string)$record->rdata);
  73. $recordList[] = $record;
  74. break;
  75. }
  76. }
  77. }
  78. return $recordList;
  79. }
  80. public static function parseRData($xmlRData)
  81. {
  82. $parsed = '';
  83. foreach($xmlRData->children() as $rdata)
  84. {
  85. $parsed .= ($parsed === '' ? '' : ' ').$rdata->Value->__toString();
  86. }
  87. return $parsed;
  88. }
  89. public static function getZoneIdFromCreateConfirmation($xmlRData)
  90. {
  91. return $xmlRData->HostedZone->Id->__toString();
  92. }
  93. public static function findPtrRecordByName($xmlRecordsList, $recordName)
  94. {
  95. foreach($xmlRecordsList->ResourceRecordSets->children() as $aRecord)
  96. {
  97. $rType = $aRecord->Type->__toString();
  98. if($rType !== 'PTR')
  99. {
  100. continue;
  101. }
  102. $rName = $aRecord->Name->__toString();
  103. $trName = trim($rName, '.');
  104. if($rName === $recordName || $trName === $recordName)
  105. {
  106. $record = new dns\record\Record();
  107. $record->name = $rName;
  108. $record->type = $rType;
  109. $record->ttl = $aRecord->TTL->__toString();
  110. $record->createRDATAObject();
  111. $record->rdata->fromString(self::parseRData($aRecord->ResourceRecords));
  112. return $record;
  113. }
  114. }
  115. return false;
  116. }
  117. public static function parseRDataForALIASRecords($xmlRData)
  118. {
  119. return $xmlRData->DNSName->__toString();
  120. }
  121. public static function getRecordType($xmlRecord)
  122. {
  123. $rType = $xmlRecord->Type->__toString();
  124. if(($rType === 'A' || $rType === 'AAAA') && $xmlRecord->AliasTarget)
  125. {
  126. $rType = 'ALIAS';
  127. }
  128. return $rType;
  129. }
  130. public static function parseMultihostRecords(&$recordList, $record, $xmlData)
  131. {
  132. foreach($xmlData->ResourceRecords->children() as $host)
  133. {
  134. $cRecord = clone $record;
  135. $cRecord->createRDATAObject($cRecord->type);
  136. self::parseHostValueToRdata($cRecord, $host->Value->__toString());
  137. $cRecord->line = md5((string)$cRecord->rdata);
  138. $recordList[] = $cRecord;
  139. }
  140. }
  141. public static function parseHostValueToRdata(&$cRecord, $hostValue)
  142. {
  143. switch($cRecord->type)
  144. {
  145. case 'MX':
  146. $hData = explode(' ', $hostValue);
  147. $cRecord->rdata->setDataFromArray(array(
  148. 'preference' => $hData[0],
  149. 'exchange' => $hData[1]
  150. ));
  151. break;
  152. default:
  153. $cRecord->rdata->setFirstProperty($hostValue);
  154. break;
  155. }
  156. }
  157. public static function convertInputFormData(&$input)
  158. {
  159. foreach($input['edit_record'] as &$editedRec)
  160. {
  161. $toEdit = self::findRecordsByName($input['edit_record'], $editedRec, true);
  162. self::mergeRecords($editedRec, $toEdit, $edit);
  163. $toEdit = self::findRecordsByName($input['record'], $editedRec, true);
  164. self::mergeRecords($editedRec, $toEdit);
  165. }
  166. }
  167. public static function findRecordsByName(&$records, $editedRec, $edit = false)
  168. {
  169. $foundRecords = array();
  170. foreach($records as $key => $record)
  171. {
  172. if($record['name'] === $editedRec['name'] && $record['type'] === $editedRec['type'] && $record['field'] !== $editedRec['field'])
  173. {
  174. $foundRecords[] = $record;
  175. if($edit)
  176. {
  177. unset($records[$key]);
  178. }
  179. }
  180. }
  181. return $foundRecords;
  182. }
  183. public static function mergeRecords(&$editRecord, $toEditList)
  184. {
  185. foreach($toEditList as $editValue)
  186. {
  187. self::mergeHostsRecords($editRecord['field'], $editValue['field'], $editRecord['type']);
  188. }
  189. }
  190. public static function mergeHostsRecords(&$editRecord, $addToEdit, $type)
  191. {
  192. switch($type)
  193. {
  194. case 'MX':
  195. if($editRecord['preference'])
  196. {
  197. $editRecord['exchange'] = $editRecord['preference'].' '.$editRecord['exchange'];
  198. $editRecord['preference'] = false;
  199. }
  200. $editRecord['exchange'] .= PHP_EOL.$addToEdit['preference'].' '.$addToEdit['exchange'];
  201. break;
  202. case 'NS':
  203. $editRecord['nsdname'] .= PHP_EOL.$addToEdit['nsdname'];
  204. break;
  205. case 'A':
  206. $editRecord['address'] .= PHP_EOL.$addToEdit['address'];
  207. break;
  208. case 'AAAA':
  209. $editRecord['address'] .= PHP_EOL.$addToEdit['address'];
  210. break;
  211. }
  212. }
  213. public static function createUnifiedRecordFromRRSet( dns\record\RRSet $RRSet )
  214. {
  215. $unifiedRecord = new dns\record\Record;
  216. $unifiedRecord->name = $RRSet->getName();
  217. $unifiedRecord->ttl = $RRSet->getTtl();
  218. $unifiedRecord->type = $RRSet->getType();
  219. $unifiedRecord->createRDATAObject($RRSet->getType());
  220. foreach( $RRSet->getRecords() as $record )
  221. {
  222. switch( $RRSet->getType() )
  223. {
  224. case 'MX':
  225. if( $unifiedRecord->rdata->preference )
  226. {
  227. $unifiedRecord->rdata->exchange = $unifiedRecord->rdata->preference . ' ' . $unifiedRecord->rdata->exchange;
  228. $unifiedRecord->rdata->preference = false;
  229. }
  230. $unifiedRecord->rdata->exchange = $unifiedRecord->rdata->exchange ? $unifiedRecord->rdata->exchange . PHP_EOL . $record->rdata->preference . ' ' . $record->rdata->exchange
  231. : $record->rdata->preference . ' ' . $record->rdata->exchange;
  232. $unifiedRecord->rdata->exchange = trim( $unifiedRecord->rdata->exchange);
  233. break;
  234. case 'NS':
  235. $unifiedRecord->rdata->nsdname = $unifiedRecord->rdata->nsdname ? $unifiedRecord->rdata->nsdname . PHP_EOL . $record->rdata->nsdname
  236. : $record->rdata->nsdname;
  237. break;
  238. case 'A':
  239. $unifiedRecord->rdata->address = $unifiedRecord->rdata->address ? $unifiedRecord->rdata->address . PHP_EOL . $record->rdata->address
  240. : $record->rdata->address;
  241. break;
  242. case 'AAAA':
  243. $unifiedRecord->rdata->address = $unifiedRecord->rdata->address ? $unifiedRecord->rdata->address . PHP_EOL . $record->rdata->address
  244. : $record->rdata->address;
  245. break;
  246. case 'TXT':
  247. $record->rdata->txtdata = '"' . trim(html_entity_decode($record->rdata->txtdata), '"') . '"';
  248. $unifiedRecord->rdata->txtdata = $unifiedRecord->rdata->txtdata ? $unifiedRecord->rdata->txtdata . PHP_EOL . $record->rdata->txtdata : $record->rdata->txtdata;
  249. break;
  250. default:
  251. $unifiedRecord->rdata = $record->rdata;
  252. }
  253. }
  254. return $unifiedRecord;
  255. }
  256. public static function mergeHostsRecordsForRdata(&$editRecord, $addToEdit, $type)
  257. {
  258. if($editRecord->rdata == null)
  259. {
  260. $editRecord->createRDATAObject($editRecord->type);
  261. }
  262. switch($type)
  263. {
  264. case 'MX':
  265. if($editRecord->rdata->preference)
  266. {
  267. $editRecord->rdata->exchange = $editRecord->rdata->preference.' '.$editRecord->rdata->exchange;
  268. $editRecord->rdata->preference = false;
  269. }
  270. $editRecord->rdata->exchange = $editRecord->rdata->exchange ? $editRecord->rdata->exchange.PHP_EOL.$addToEdit->rdata->preference.' '.$addToEdit->rdata->exchange
  271. : $addToEdit->rdata->preference.' '.$addToEdit->rdata->exchange;
  272. break;
  273. case 'NS':
  274. $editRecord->rdata->nsdname = $editRecord->rdata->nsdname ? $editRecord->rdata->nsdname.PHP_EOL.$addToEdit->rdata->nsdname
  275. : $addToEdit->rdata->nsdname;
  276. break;
  277. case 'A':
  278. $editRecord->rdata->address = $editRecord->rdata->address ? $editRecord->rdata->address.PHP_EOL.$addToEdit->rdata->address
  279. : $addToEdit->rdata->address;
  280. break;
  281. case 'AAAA':
  282. $editRecord->rdata->address = $editRecord->rdata->address ? $editRecord->rdata->address.PHP_EOL.$addToEdit->rdata->address
  283. : $addToEdit->rdata->address;
  284. break;
  285. }
  286. }
  287. }