AWSRoute53ResponseParseHelper.php 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  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. $recordList[] = $record;
  61. break;
  62. case 'MX':
  63. self::parseMultihostRecords($recordList, $record, $aRecord);
  64. break;
  65. case 'NS':
  66. self::parseMultihostRecords($recordList, $record, $aRecord);
  67. break;
  68. case 'A':
  69. self::parseMultihostRecords($recordList, $record, $aRecord);
  70. break;
  71. case 'AAAA':
  72. self::parseMultihostRecords($recordList, $record, $aRecord);
  73. break;
  74. default:
  75. $record->rdata->fromString(self::parseRData($aRecord->ResourceRecords));
  76. $recordList[] = $record;
  77. break;
  78. }
  79. }
  80. }
  81. return $recordList;
  82. }
  83. public static function parseRData($xmlRData)
  84. {
  85. $parsed = '';
  86. foreach($xmlRData->children() as $rdata)
  87. {
  88. $parsed .= ($parsed === '' ? '' : ' ').$rdata->Value->__toString();
  89. }
  90. return $parsed;
  91. }
  92. public static function getZoneIdFromCreateConfirmation($xmlRData)
  93. {
  94. return $xmlRData->HostedZone->Id->__toString();
  95. }
  96. public static function findPtrRecordByName($xmlRecordsList, $recordName)
  97. {
  98. foreach($xmlRecordsList->ResourceRecordSets->children() as $aRecord)
  99. {
  100. $rType = $aRecord->Type->__toString();
  101. if($rType !== 'PTR')
  102. {
  103. continue;
  104. }
  105. $rName = $aRecord->Name->__toString();
  106. $trName = trim($rName, '.');
  107. if($rName === $recordName || $trName === $recordName)
  108. {
  109. $record = new dns\record\Record();
  110. $record->name = $rName;
  111. $record->type = $rType;
  112. $record->ttl = $aRecord->TTL->__toString();
  113. $record->createRDATAObject();
  114. $record->rdata->fromString(self::parseRData($aRecord->ResourceRecords));
  115. return $record;
  116. }
  117. }
  118. return false;
  119. }
  120. public static function parseRDataForALIASRecords($xmlRData)
  121. {
  122. return $xmlRData->DNSName->__toString();
  123. }
  124. public static function getRecordType($xmlRecord)
  125. {
  126. $rType = $xmlRecord->Type->__toString();
  127. if(($rType === 'A' || $rType === 'AAAA') && $xmlRecord->AliasTarget)
  128. {
  129. $rType = 'ALIAS';
  130. }
  131. return $rType;
  132. }
  133. public static function parseMultihostRecords(&$recordList, $record, $xmlData)
  134. {
  135. foreach($xmlData->ResourceRecords->children() as $host)
  136. {
  137. $cRecord = clone $record;
  138. $cRecord->createRDATAObject($cRecord->type);
  139. self::parseHostValueToRdata($cRecord, $host->Value->__toString());
  140. $recordList[] = $cRecord;
  141. }
  142. }
  143. public static function parseHostValueToRdata(&$cRecord, $hostValue)
  144. {
  145. switch($cRecord->type)
  146. {
  147. case 'MX':
  148. $hData = explode(' ', $hostValue);
  149. $cRecord->rdata->setDataFromArray(array(
  150. 'preference' => $hData[0],
  151. 'exchange' => $hData[1]
  152. ));
  153. break;
  154. default:
  155. $cRecord->rdata->setFirstProperty($hostValue);
  156. break;
  157. }
  158. }
  159. public static function convertInputFormData(&$input)
  160. {
  161. foreach($input['edit_record'] as &$editedRec)
  162. {
  163. $toEdit = self::findRecordsByName($input['edit_record'], $editedRec, true);
  164. self::mergeRecords($editedRec, $toEdit, $edit);
  165. $toEdit = self::findRecordsByName($input['record'], $editedRec, true);
  166. self::mergeRecords($editedRec, $toEdit);
  167. }
  168. }
  169. public static function findRecordsByName(&$records, $editedRec, $edit = false)
  170. {
  171. $foundRecords = array();
  172. foreach($records as $key => $record)
  173. {
  174. if($record['name'] === $editedRec['name'] && $record['type'] === $editedRec['type'] && $record['field'] !== $editedRec['field'])
  175. {
  176. $foundRecords[] = $record;
  177. if($edit)
  178. {
  179. unset($records[$key]);
  180. }
  181. }
  182. }
  183. return $foundRecords;
  184. }
  185. public static function mergeRecords(&$editRecord, $toEditList)
  186. {
  187. foreach($toEditList as $editValue)
  188. {
  189. self::mergeHostsRecords($editRecord['field'], $editValue['field'], $editRecord['type']);
  190. }
  191. }
  192. public static function mergeHostsRecords(&$editRecord, $addToEdit, $type)
  193. {
  194. switch($type)
  195. {
  196. case 'MX':
  197. if($editRecord['preference'])
  198. {
  199. $editRecord['exchange'] = $editRecord['preference'].' '.$editRecord['exchange'];
  200. $editRecord['preference'] = false;
  201. }
  202. $editRecord['exchange'] .= PHP_EOL.$addToEdit['preference'].' '.$addToEdit['exchange'];
  203. break;
  204. case 'NS':
  205. $editRecord['nsdname'] .= PHP_EOL.$addToEdit['nsdname'];
  206. break;
  207. case 'A':
  208. $editRecord['address'] .= PHP_EOL.$addToEdit['address'];
  209. break;
  210. case 'AAAA':
  211. $editRecord['address'] .= PHP_EOL.$addToEdit['address'];
  212. break;
  213. }
  214. }
  215. public static function mergeHostsRecordsForRdata(&$editRecord, $addToEdit, $type)
  216. {
  217. if($editRecord->rdata == null)
  218. {
  219. $editRecord->createRDATAObject($editRecord->type);
  220. }
  221. switch($type)
  222. {
  223. case 'MX':
  224. if($editRecord->rdata->preference)
  225. {
  226. $editRecord->rdata->exchange = $editRecord->rdata->preference.' '.$editRecord->rdata->exchange;
  227. $editRecord->rdata->preference = false;
  228. }
  229. $editRecord->rdata->exchange = $editRecord->rdata->exchange ? $editRecord->rdata->exchange.PHP_EOL.$addToEdit->rdata->preference.' '.$addToEdit->rdata->exchange
  230. : $addToEdit->rdata->preference.' '.$addToEdit->rdata->exchange;
  231. break;
  232. case 'NS':
  233. $editRecord->rdata->nsdname = $editRecord->rdata->nsdname ? $editRecord->rdata->nsdname.PHP_EOL.$addToEdit->rdata->nsdname
  234. : $addToEdit->rdata->nsdname;
  235. break;
  236. case 'A':
  237. $editRecord->rdata->address = $editRecord->rdata->address ? $editRecord->rdata->address.PHP_EOL.$addToEdit->rdata->address
  238. : $addToEdit->rdata->address;
  239. break;
  240. case 'AAAA':
  241. $editRecord->rdata->address = $editRecord->rdata->address ? $editRecord->rdata->address.PHP_EOL.$addToEdit->rdata->address
  242. : $addToEdit->rdata->address;
  243. break;
  244. }
  245. }
  246. }