Auto Assign IPs when domains are resolved

This commit is contained in:
Raven Scott
2025-12-20 17:11:48 -05:00
parent 14cd0d98dd
commit 575d1c359d
3 changed files with 92 additions and 21 deletions
@@ -109,10 +109,9 @@ async function handleDomainsRoutes(req, res) {
domains.push({ domain: validation.domain, hash: validation.hash, ssl: ssl }); domains.push({ domain: validation.domain, hash: validation.hash, ssl: ssl });
} }
await fs.writeFile(domainsFile, JSON.stringify(domains, null, 2)); await fs.writeFile(domainsFile, JSON.stringify(domains, null, 2));
if (!state.domainToIPMap.has(validation.domain)) { // Note: IP assignment now happens automatically after consensus resolution
await createInterfaceForDomain(validation.domain); // See assignAllIPs() function for automatic IP assignment logic
logDebug('Admin', `Assigned IP to ${validation.domain}: ${state.domainToIPMap.get(validation.domain)}`); logDebug('Admin', `Domain ${validation.domain} added - IP will be assigned automatically after consensus resolution`);
}
broadcast({ type: 'update-database' }); broadcast({ type: 'update-database' });
res.writeHead(200, { 'Content-Type': 'text/plain' }); res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('OK'); res.end('OK');
+3 -4
View File
@@ -109,10 +109,9 @@ async function handleDomainsRoutes(req, res) {
domains.push({ domain: validation.domain, hash: validation.hash, ssl: ssl }); domains.push({ domain: validation.domain, hash: validation.hash, ssl: ssl });
} }
await fs.writeFile(domainsFile, JSON.stringify(domains, null, 2)); await fs.writeFile(domainsFile, JSON.stringify(domains, null, 2));
if (!state.domainToIPMap.has(validation.domain)) { // Note: IP assignment now happens automatically after consensus resolution
await createInterfaceForDomain(validation.domain); // See assignAllIPs() function for automatic IP assignment logic
logDebug('Admin', `Assigned IP to ${validation.domain}: ${state.domainToIPMap.get(validation.domain)}`); logDebug('Admin', `Domain ${validation.domain} added - IP will be assigned automatically after consensus resolution`);
}
broadcast({ type: 'update-database' }); broadcast({ type: 'update-database' });
res.writeHead(200, { 'Content-Type': 'text/plain' }); res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('OK'); res.end('OK');
+85 -12
View File
@@ -1283,7 +1283,8 @@ async function main() {
await listDomains(); await listDomains();
broadcast({ type: 'update-database' }); broadcast({ type: 'update-database' });
await assignAllIPs(); await assignIPsToResolvedDomains(); // Assign IPs to newly resolved domains
await assignAllIPs(); // Ensure all resolved domains have IPs
} catch (err) { } catch (err) {
logError('Swarm', `Error in update handler: ${err.message}`); logError('Swarm', `Error in update handler: ${err.message}`);
} }
@@ -1352,7 +1353,8 @@ async function main() {
await listDomains(); await listDomains();
broadcast({ type: 'update-database' }); broadcast({ type: 'update-database' });
await assignAllIPs(); await assignIPsToResolvedDomains(); // Assign IPs to newly resolved domains
await assignAllIPs(); // Ensure all resolved domains have IPs
} catch (err) { } catch (err) {
logError('Swarm', `Error in append handler: ${err.message}`); logError('Swarm', `Error in append handler: ${err.message}`);
} }
@@ -2834,7 +2836,7 @@ async function main() {
// Function to assign IPs to all domains // Function to assign IPs to all domains
async function assignAllIPs() { async function assignAllIPs() {
try { try {
logInfo('Main', 'Assigning IPs to all domains...'); logInfo('Main', 'Assigning IPs to resolved domains...');
let internalDomains = ['p2ns.admin']; let internalDomains = ['p2ns.admin'];
try { try {
const { getInternalDomains } = require('./includes/plugins/plugin-handler'); const { getInternalDomains } = require('./includes/plugins/plugin-handler');
@@ -2862,18 +2864,32 @@ async function assignAllIPs() {
} else { } else {
logWarn('Main', 'dnsPass not initialized, only assigning IPs to internal domains'); logWarn('Main', 'dnsPass not initialized, only assigning IPs to internal domains');
} }
// Assign IPs to all domains
// Import getConsensusState for checking resolution status
const { getConsensusState } = require('./includes/core/core');
// Assign IPs only to resolved domains
for (const domain of domains) { for (const domain of domains) {
if (domain === "p2ns.admin" || domain === "peer.directory") continue; if (domain === "p2ns.admin" || domain === "peer.directory") continue;
if (!state.domainToIPMap.has(domain)) {
try { // Check if domain already has IP
await createInterfaceForDomain(domain); if (state.domainToIPMap.has(domain)) {
logDebug('Main', `Assigned IP to domain: ${domain} (${state.domainToIPMap.get(domain)})`);
} catch (err) {
logError('Main', `Failed to assign IP to ${domain}: ${err.message}`);
}
} else {
logDebug('Main', `IP already assigned for ${domain}: ${state.domainToIPMap.get(domain)}`); logDebug('Main', `IP already assigned for ${domain}: ${state.domainToIPMap.get(domain)}`);
continue;
}
// Check consensus state - only assign if resolved
try {
const consensusState = await getConsensusState(domain);
if (consensusState.status === 'resolved') {
await createInterfaceForDomain(domain);
logInfo('Main', `Assigned IP to resolved domain: ${domain} (${state.domainToIPMap.get(domain)})`);
} else {
logDebug('Main', `Skipping ${domain} - not resolved yet (status: ${consensusState.status})`);
}
} catch (err) {
logError('Main', `Failed to check consensus or assign IP to ${domain}: ${err.message}`);
} }
} }
logInfo('Main', `IP assignment completed for ${domains.size} domains`); logInfo('Main', `IP assignment completed for ${domains.size} domains`);
@@ -2882,6 +2898,63 @@ async function assignAllIPs() {
} }
} }
// Assign IPs to domains that have just become resolved (called after consensus updates)
async function assignIPsToResolvedDomains() {
try {
logDebug('Main', 'Checking for newly resolved domains...');
// Fetch domains from Autopass entries if dnsPass is initialized
if (!state.dnsPass) {
logDebug('Main', 'dnsPass not initialized, skipping IP assignment check');
return;
}
const { getAllEntries, getConsensusState } = require('./includes/core/core');
const allEntries = await getAllEntries();
const domains = new Set();
// Collect all domains with claims
for (const entry of allEntries) {
if (entry.key.startsWith('claim:')) {
const parts = entry.key.split(':');
if (parts.length === 3) {
domains.add(parts[1]);
}
}
}
let assignedCount = 0;
// Check each domain for resolution status
for (const domain of domains) {
// Skip internal domains and domains that already have IPs
if (domain === "p2ns.admin" || domain === "peer.directory" || state.domainToIPMap.has(domain)) {
continue;
}
try {
const consensusState = await getConsensusState(domain);
if (consensusState.status === 'resolved') {
await createInterfaceForDomain(domain);
logInfo('Main', `Assigned IP to newly resolved domain: ${domain} (${state.domainToIPMap.get(domain)})`);
assignedCount++;
}
} catch (err) {
logError('Main', `Failed to check consensus for ${domain}: ${err.message}`);
}
}
if (assignedCount > 0) {
logInfo('Main', `Assigned IPs to ${assignedCount} newly resolved domains`);
} else {
logDebug('Main', 'No newly resolved domains found');
}
} catch (err) {
logError('Main', `Error in assignIPsToResolvedDomains: ${err.message}`);
}
}
main(); main();
// Usage: // Usage:
// Master: node p2ns.js --master // Master: node p2ns.js --master