From c24826669b60884b72fded16def3fff29f0ac253 Mon Sep 17 00:00:00 2001 From: Purple Date: Sun, 18 Jan 2026 00:05:26 +0000 Subject: [PATCH] fix aws --- webapp/api.php | 194 ++++++++++++++++++++++++++++++------------------- 1 file changed, 118 insertions(+), 76 deletions(-) diff --git a/webapp/api.php b/webapp/api.php index 47e7136..4f23288 100644 --- a/webapp/api.php +++ b/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;