This commit is contained in:
Purple
2026-01-18 00:05:26 +00:00
parent 9e272cbbd2
commit c24826669b

View File

@@ -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;