fix aws
This commit is contained in:
194
webapp/api.php
194
webapp/api.php
@@ -2383,56 +2383,74 @@ function handleAwsRecords($db) {
|
||||
try {
|
||||
// Note: Route53 ListResourceRecordSets requires 'name' if 'type' is specified
|
||||
// So we fetch all records and filter for A records in PHP
|
||||
$result = awsRoute53Request(
|
||||
'GET',
|
||||
"2013-04-01/hostedzone/{$zoneId}/rrset?maxitems=500",
|
||||
[],
|
||||
$accessKeyId,
|
||||
$secretAccessKey,
|
||||
$region
|
||||
);
|
||||
|
||||
if (isset($result['error'])) {
|
||||
jsonResponse(['success' => false, 'error' => $result['error']]);
|
||||
}
|
||||
|
||||
// Pagination support for zones with many records
|
||||
$records = [];
|
||||
if (isset($result['ResourceRecordSets']['ResourceRecordSet'])) {
|
||||
$recordSets = $result['ResourceRecordSets']['ResourceRecordSet'];
|
||||
// Handle single record vs array
|
||||
if (isset($recordSets['Name'])) {
|
||||
$recordSets = [$recordSets];
|
||||
$nextRecordName = null;
|
||||
$nextRecordType = null;
|
||||
$pageCount = 0;
|
||||
$maxPages = 20; // Safety limit
|
||||
|
||||
do {
|
||||
$pageCount++;
|
||||
|
||||
// Build URL with pagination parameters
|
||||
$url = "2013-04-01/hostedzone/{$zoneId}/rrset?maxitems=300";
|
||||
if ($nextRecordName) {
|
||||
$url .= "&name=" . rawurlencode($nextRecordName);
|
||||
if ($nextRecordType) {
|
||||
$url .= "&type=" . rawurlencode($nextRecordType);
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($recordSets as $record) {
|
||||
// Only include A records
|
||||
if (($record['Type'] ?? '') !== 'A') continue;
|
||||
$result = awsRoute53Request('GET', $url, [], $accessKeyId, $secretAccessKey, $region);
|
||||
|
||||
$ips = [];
|
||||
if (isset($record['ResourceRecords']['ResourceRecord'])) {
|
||||
$rrs = $record['ResourceRecords']['ResourceRecord'];
|
||||
if (isset($rrs['Value'])) {
|
||||
$ips[] = $rrs['Value'];
|
||||
} else {
|
||||
foreach ($rrs as $rr) {
|
||||
$ips[] = $rr['Value'];
|
||||
if (isset($result['error'])) {
|
||||
jsonResponse(['success' => false, 'error' => $result['error']]);
|
||||
}
|
||||
|
||||
if (isset($result['ResourceRecordSets']['ResourceRecordSet'])) {
|
||||
$recordSets = $result['ResourceRecordSets']['ResourceRecordSet'];
|
||||
// Handle single record vs array
|
||||
if (isset($recordSets['Name'])) {
|
||||
$recordSets = [$recordSets];
|
||||
}
|
||||
|
||||
foreach ($recordSets as $record) {
|
||||
// Only include A records
|
||||
if (($record['Type'] ?? '') !== 'A') continue;
|
||||
|
||||
$ips = [];
|
||||
if (isset($record['ResourceRecords']['ResourceRecord'])) {
|
||||
$rrs = $record['ResourceRecords']['ResourceRecord'];
|
||||
if (isset($rrs['Value'])) {
|
||||
$ips[] = $rrs['Value'];
|
||||
} else {
|
||||
foreach ($rrs as $rr) {
|
||||
$ips[] = $rr['Value'];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($ips as $ip) {
|
||||
$records[] = [
|
||||
'hostname' => rtrim($record['Name'], '.'),
|
||||
'ip' => $ip,
|
||||
'ttl' => $record['TTL'] ?? 300,
|
||||
'ptr' => null,
|
||||
'ptr_status' => 'unknown'
|
||||
];
|
||||
foreach ($ips as $ip) {
|
||||
$records[] = [
|
||||
'hostname' => rtrim($record['Name'], '.'),
|
||||
'ip' => $ip,
|
||||
'ttl' => $record['TTL'] ?? 300,
|
||||
'ptr' => null,
|
||||
'ptr_status' => 'unknown'
|
||||
];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
jsonResponse(['success' => true, 'records' => $records]);
|
||||
// Check if there are more pages
|
||||
$isTruncated = isset($result['IsTruncated']) && ($result['IsTruncated'] === 'true' || $result['IsTruncated'] === true);
|
||||
$nextRecordName = $result['NextRecordName'] ?? null;
|
||||
$nextRecordType = $result['NextRecordType'] ?? null;
|
||||
|
||||
} while ($isTruncated && $nextRecordName && $pageCount < $maxPages);
|
||||
|
||||
jsonResponse(['success' => true, 'records' => $records, 'pages_fetched' => $pageCount]);
|
||||
} catch (Exception $e) {
|
||||
jsonResponse(['success' => false, 'error' => $e->getMessage()]);
|
||||
}
|
||||
@@ -2702,57 +2720,81 @@ function handlePtrCacheRefresh($db) {
|
||||
$zoneName = rtrim($zoneResult['HostedZone']['Name'], '.');
|
||||
}
|
||||
|
||||
// Get records from Route53
|
||||
// Get records from Route53 with pagination support
|
||||
// Note: Route53 ListResourceRecordSets requires 'name' if 'type' is specified
|
||||
// So we fetch all records and filter for A records in PHP
|
||||
$result = awsRoute53Request('GET', "2013-04-01/hostedzone/{$cleanZoneId}/rrset?maxitems=500", [], $accessKeyId, $secretAccessKey, $region);
|
||||
|
||||
if (isset($result['error'])) {
|
||||
jsonResponse(['success' => false, 'error' => $result['error']]);
|
||||
}
|
||||
|
||||
$records = [];
|
||||
$syncTime = date('Y-m-d H:i:s');
|
||||
$nextRecordName = null;
|
||||
$nextRecordType = null;
|
||||
$pageCount = 0;
|
||||
$maxPages = 20; // Safety limit to prevent infinite loops
|
||||
|
||||
if (isset($result['ResourceRecordSets']['ResourceRecordSet'])) {
|
||||
$rrsets = $result['ResourceRecordSets']['ResourceRecordSet'];
|
||||
// Handle single record case
|
||||
if (isset($rrsets['Name'])) {
|
||||
$rrsets = [$rrsets];
|
||||
do {
|
||||
$pageCount++;
|
||||
|
||||
// Build URL with pagination parameters
|
||||
$url = "2013-04-01/hostedzone/{$cleanZoneId}/rrset?maxitems=300";
|
||||
if ($nextRecordName) {
|
||||
$url .= "&name=" . rawurlencode($nextRecordName);
|
||||
if ($nextRecordType) {
|
||||
$url .= "&type=" . rawurlencode($nextRecordType);
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($rrsets as $rrset) {
|
||||
if (($rrset['Type'] ?? '') !== 'A') continue;
|
||||
$result = awsRoute53Request('GET', $url, [], $accessKeyId, $secretAccessKey, $region);
|
||||
|
||||
$hostname = rtrim($rrset['Name'] ?? '', '.');
|
||||
$ttl = $rrset['TTL'] ?? null;
|
||||
if (isset($result['error'])) {
|
||||
jsonResponse(['success' => false, 'error' => $result['error']]);
|
||||
}
|
||||
|
||||
// Get IPs from ResourceRecords
|
||||
$ips = [];
|
||||
if (isset($rrset['ResourceRecords']['ResourceRecord'])) {
|
||||
$rrs = $rrset['ResourceRecords']['ResourceRecord'];
|
||||
if (isset($rrs['Value'])) {
|
||||
$ips[] = $rrs['Value'];
|
||||
} else {
|
||||
foreach ($rrs as $rr) {
|
||||
if (isset($rr['Value'])) {
|
||||
$ips[] = $rr['Value'];
|
||||
// Process records from this page
|
||||
if (isset($result['ResourceRecordSets']['ResourceRecordSet'])) {
|
||||
$rrsets = $result['ResourceRecordSets']['ResourceRecordSet'];
|
||||
// Handle single record case
|
||||
if (isset($rrsets['Name'])) {
|
||||
$rrsets = [$rrsets];
|
||||
}
|
||||
|
||||
foreach ($rrsets as $rrset) {
|
||||
if (($rrset['Type'] ?? '') !== 'A') continue;
|
||||
|
||||
$hostname = rtrim($rrset['Name'] ?? '', '.');
|
||||
$ttl = $rrset['TTL'] ?? null;
|
||||
|
||||
// Get IPs from ResourceRecords
|
||||
$ips = [];
|
||||
if (isset($rrset['ResourceRecords']['ResourceRecord'])) {
|
||||
$rrs = $rrset['ResourceRecords']['ResourceRecord'];
|
||||
if (isset($rrs['Value'])) {
|
||||
$ips[] = $rrs['Value'];
|
||||
} else {
|
||||
foreach ($rrs as $rr) {
|
||||
if (isset($rr['Value'])) {
|
||||
$ips[] = $rr['Value'];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($ips as $ip) {
|
||||
$records[] = [
|
||||
'zone_id' => $cleanZoneId,
|
||||
'zone_name' => $zoneName,
|
||||
'hostname' => $hostname,
|
||||
'ip_address' => $ip,
|
||||
'ttl' => $ttl
|
||||
];
|
||||
foreach ($ips as $ip) {
|
||||
$records[] = [
|
||||
'zone_id' => $cleanZoneId,
|
||||
'zone_name' => $zoneName,
|
||||
'hostname' => $hostname,
|
||||
'ip_address' => $ip,
|
||||
'ttl' => $ttl
|
||||
];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Check if there are more pages
|
||||
$isTruncated = isset($result['IsTruncated']) && ($result['IsTruncated'] === 'true' || $result['IsTruncated'] === true);
|
||||
$nextRecordName = $result['NextRecordName'] ?? null;
|
||||
$nextRecordType = $result['NextRecordType'] ?? null;
|
||||
|
||||
} while ($isTruncated && $nextRecordName && $pageCount < $maxPages);
|
||||
|
||||
// Update database - use INSERT ... ON DUPLICATE KEY UPDATE
|
||||
$inserted = 0;
|
||||
|
||||
Reference in New Issue
Block a user