AWSRoute53API.php 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. <?php
  2. namespace MGModule\DNSManager2\mgLibs\custom\dns\submodules\AWSRoute53;
  3. use MGModule\DNSManager2\mgLibs\custom\dns\record\RRSet;
  4. use MGModule\DNSManager2\mgLibs\custom\dns\submodules\AWSRoute53 as awsRoute53;
  5. class AWSRoute53API
  6. {
  7. private $requestHandler;
  8. public function __construct(awsRoute53\AWSRoute53RequestInterface $requestHandler)
  9. {
  10. $this->requestHandler = $requestHandler;
  11. }
  12. public function createZone($name, $delegationSetId = false)
  13. {
  14. $body = $this->getCreateBody($name, $delegationSetId);
  15. return $this->requestHandler->makeRequest('/2013-04-01/hostedzone', 'POST', __FUNCTION__, $body);
  16. }
  17. public function listZones()
  18. {
  19. return $this->requestHandler->makeRequest('/2013-04-01/hostedzone', 'GET', __FUNCTION__);
  20. }
  21. public function testConnection()
  22. {
  23. return $this->requestHandler->makeRequest('/2013-04-01/hostedzone?maxitems=10', 'GET', __FUNCTION__);
  24. }
  25. public function listZonesByName($name)
  26. {
  27. return $this->requestHandler->makeRequest('/2013-04-01/hostedzonesbyname?dnsname='.$name, 'GET', __FUNCTION__);
  28. }
  29. public function deleteHostedZone($id)
  30. {
  31. return $this->requestHandler->makeRequest('/2013-04-01'.$id, 'DELETE', __FUNCTION__);
  32. }
  33. public function getHostedZoneById($id)
  34. {
  35. return $this->requestHandler->makeRequest('/2013-04-01'.$id, 'GET', __FUNCTION__);
  36. }
  37. public function listRecords($zoneId)
  38. {
  39. return $this->requestHandler->makeRequest("/2013-04-01".$zoneId."/rrset", 'GET', __FUNCTION__);
  40. }
  41. public function updateRecord($zoneId, $record, $aliasType = false)
  42. {
  43. $cleanZoneId = $this->cleanZoneId($zoneId);
  44. $body = $this->getRecordBody($cleanZoneId, $record, 'UPSERT', $aliasType);
  45. return $this->requestHandler->makeRequest("/2013-04-01".$zoneId."/rrset/", 'POST', __FUNCTION__, $body);
  46. }
  47. public function updateRRSet( RRSet $RRSet, $zoneId ,$aliasType = false)
  48. {
  49. $cleanZoneId = $this->cleanZoneId($zoneId);
  50. $body = $this->getRecordBody($cleanZoneId, AWSRoute53ResponseParseHelper::createUnifiedRecordFromRRSet($RRSet), 'UPSERT',$aliasType);
  51. return $this->requestHandler->makeRequest("/2013-04-01".$zoneId."/rrset/", 'POST', __FUNCTION__, $body);
  52. }
  53. public function removeRRSet( RRSet $RRSet, $zoneId ,$aliasType = false)
  54. {
  55. $cleanZoneId = $this->cleanZoneId($zoneId);
  56. $body = $this->getRecordBody($cleanZoneId, AWSRoute53ResponseParseHelper::createUnifiedRecordFromRRSet($RRSet), 'DELETE',$aliasType);
  57. return $this->requestHandler->makeRequest("/2013-04-01".$zoneId."/rrset/", 'POST', __FUNCTION__, $body);
  58. }
  59. public function deleteRecord($zoneId, $record, $aliasType = false)
  60. {
  61. $cleanZoneId = $this->cleanZoneId($zoneId);
  62. $body = $this->getRecordBody($cleanZoneId, $record, 'DELETE', $aliasType);
  63. return $this->requestHandler->makeRequest("/2013-04-01".$zoneId."/rrset/", 'POST', __FUNCTION__, $body);
  64. }
  65. public function createRecord($zoneId, $record, $aliasType = false)
  66. {
  67. $cleanZoneId = $this->cleanZoneId($zoneId);
  68. $body = $this->getRecordBody($cleanZoneId, $record, 'UPSERT', $aliasType);
  69. return $this->requestHandler->makeRequest("/2013-04-01".$zoneId."/rrset/", 'POST', __FUNCTION__, $body);
  70. }
  71. private function getCreateBody($name, $delegationSetId = false)
  72. {
  73. $params = array(
  74. 'callerReference' => $this->getCallerReference(),
  75. 'zoneName' => $name,
  76. 'delegationSetId' => $delegationSetId
  77. );
  78. $templateName = ($delegationSetId && $delegationSetId !== '')
  79. ? awsRoute53\AWSRoute53XmlRequestHelper::ZONE_REQUEST_DELEGATION_SET
  80. : awsRoute53\AWSRoute53XmlRequestHelper::ZONE_REQUEST;
  81. $body = awsRoute53\AWSRoute53XmlRequestHelper::prepareResponseBody($templateName, $params);
  82. return $body;
  83. }
  84. private function getRecordBody($zoneId, $record, $action, $aliasType = false)
  85. {
  86. $recordType = $aliasType ? $aliasType : $record->type;
  87. $finalRecord = '';
  88. foreach( explode(PHP_EOL, $record->rdata->toString()) as $recordNS )
  89. {
  90. $finalRecord .= $this->getNsResourceBody(str_replace("\t",'',$recordNS));
  91. }
  92. $params = array(
  93. 'action' => $action,
  94. 'recordName' => $record->name,
  95. 'recordTtl' => $record->ttl,
  96. 'recordType' => $recordType,
  97. 'targetName' => $record->rdata->target,
  98. 'hostedZoneId' => $zoneId,
  99. 'recordValue' =>str_replace("\t", ' ', $record->rdata->toString()),
  100. 'nsResourceRecords' => $finalRecord
  101. );
  102. switch($recordType)
  103. {
  104. case 'A':
  105. $template = awsRoute53\AWSRoute53XmlRequestHelper::RECORD_NS_REQUEST;
  106. break;
  107. case 'AAAA':
  108. $template = awsRoute53\AWSRoute53XmlRequestHelper::RECORD_NS_REQUEST;
  109. break;
  110. case 'NS':
  111. case 'TXT':
  112. $template = awsRoute53\AWSRoute53XmlRequestHelper::RECORD_NS_REQUEST;
  113. break;
  114. case 'MX':
  115. $template = awsRoute53\AWSRoute53XmlRequestHelper::RECORD_NS_REQUEST;
  116. break;
  117. default:
  118. $template = awsRoute53\AWSRoute53XmlRequestHelper::RECORD_REQUEST;
  119. break;
  120. }
  121. $template = $aliasType ? awsRoute53\AWSRoute53XmlRequestHelper::RECORD_ALIAS_REQUEST : $template;
  122. $body = awsRoute53\AWSRoute53XmlRequestHelper::prepareResponseBody($template, $params);
  123. return $body;
  124. }
  125. public function getCallerReference()
  126. {
  127. return time();
  128. }
  129. public function cleanZoneId($zoneId)
  130. {
  131. if(strpos($zoneId, "/hostedzone/") || strpos($zoneId, "/hostedzone/") === 0)
  132. {
  133. return str_replace("/hostedzone/", "", $zoneId);
  134. }
  135. if(strpos($zoneId, "hostedzone/") || strpos($zoneId, "hostedzone/") === 0)
  136. {
  137. return str_replace("hostedzone/", "", $zoneId);
  138. }
  139. return $zoneId;
  140. }
  141. public function getNsResourceBody($rData)
  142. {
  143. $hosts = explode(PHP_EOL, $rData);
  144. $rBody = '';
  145. foreach($hosts as $host)
  146. {
  147. $rBody .= awsRoute53\AWSRoute53XmlRequestHelper::prepareResponseBody(awsRoute53\AWSRoute53XmlRequestHelper::RECORD_NS_HOST,
  148. array('hostName' => $host));
  149. }
  150. return $rBody;
  151. }
  152. }