2weekmail/api/scripts/dump_cloudflare.js
2025-03-19 19:56:57 -05:00

183 lines
4.6 KiB
JavaScript

const fs = require('fs');
const axios = require('axios');
const { promisify } = require('util');
const writeFileAsync = promisify(fs.writeFile);
require('dotenv').config();
// Cloudflare API credentials
// You'll need to replace these with your own
const CF_API_TOKEN = process.env.CF_API_TOKEN;
const CF_EMAIL = process.env.CF_EMAIL; // Only needed if using API key instead of token
// Output file
const OUTPUT_FILE = 'cloudflare-dns-records.txt';
/**
* Fetch all zones (domains) from Cloudflare
*/
async function getZones() {
try {
let zones = [];
let page = 1;
let hasMorePages = true;
console.log('Fetching zones from Cloudflare...');
while (hasMorePages) {
const response = await axios({
method: 'GET',
url: 'https://api.cloudflare.com/client/v4/zones',
headers: {
'Authorization': `Bearer ${CF_API_TOKEN}`,
'Content-Type': 'application/json'
},
params: {
page: page,
per_page: 50
}
});
const result = response.data.result;
zones = zones.concat(result);
// Check if there are more pages
if (result.length < 50) {
hasMorePages = false;
} else {
page++;
}
}
console.log(`Found ${zones.length} zones.`);
return zones;
} catch (error) {
console.error('Error fetching zones:', error.message);
if (error.response) {
console.error('API response:', error.response.data);
}
throw error;
}
}
/**
* Fetch DNS records for a specific zone
*/
async function getDnsRecords(zoneId, zoneName) {
try {
let records = [];
let page = 1;
let hasMorePages = true;
console.log(`Fetching DNS records for ${zoneName}...`);
while (hasMorePages) {
const response = await axios({
method: 'GET',
url: `https://api.cloudflare.com/client/v4/zones/${zoneId}/dns_records`,
headers: {
'Authorization': `Bearer ${CF_API_TOKEN}`,
'Content-Type': 'application/json'
},
params: {
page: page,
per_page: 100
}
});
const result = response.data.result;
records = records.concat(result);
// Check if there are more pages
if (result.length < 100) {
hasMorePages = false;
} else {
page++;
}
}
console.log(`Found ${records.length} DNS records for ${zoneName}.`);
return records;
} catch (error) {
console.error(`Error fetching DNS records for ${zoneName}:`, error.message);
if (error.response) {
console.error('API response:', error.response.data);
}
throw error;
}
}
/**
* Format a DNS record to a human-readable string
*/
function formatDnsRecord(record, zoneName) {
let formattedRecord = `[${zoneName}] ${record.name} ${record.ttl} IN ${record.type} `;
switch (record.type) {
case 'A':
case 'AAAA':
formattedRecord += record.content;
break;
case 'CNAME':
case 'NS':
case 'PTR':
formattedRecord += `${record.content}`;
break;
case 'MX':
formattedRecord += `${record.priority} ${record.content}`;
break;
case 'TXT':
formattedRecord += `"${record.content}"`;
break;
case 'SRV':
formattedRecord += `${record.data.priority} ${record.data.weight} ${record.data.port} ${record.data.target}`;
break;
default:
formattedRecord += JSON.stringify(record.content);
}
if (record.proxied) {
formattedRecord += ' [Proxied]';
}
return formattedRecord;
}
/**
* Main function to get all DNS records and write them to a file
*/
async function exportAllDnsRecords() {
try {
// Get all zones
const zones = await getZones();
let allRecords = [];
// For each zone, get its DNS records
for (const zone of zones) {
const records = await getDnsRecords(zone.id, zone.name);
// Add a zone header
allRecords.push(`\n==== Domain: ${zone.name} ====\n`);
// Format and add each record
for (const record of records) {
const formattedRecord = formatDnsRecord(record, zone.name);
allRecords.push(formattedRecord);
}
}
// Join all records with newlines and write to file
const outputContent = allRecords.join('\n');
await writeFileAsync(OUTPUT_FILE, outputContent);
console.log(`\nDNS records exported to ${OUTPUT_FILE}`);
} catch (error) {
console.error('Export failed:', error);
}
}
// Run the script
exportAllDnsRecords().catch(err => {
console.error('Script execution failed:', err);
process.exit(1);
});