mirror of
https://github.com/freedbygrace/DynamoDNS.git
synced 2026-07-26 11:38:13 +00:00
a9c7a0afe5
Replit-Commit-Author: Agent Replit-Commit-Session-Id: 9111ef36-26c8-4085-84ca-a35dc1fec1b5 Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/7083d608-d6d3-4a6a-9a27-6286c5109627/47dbe4b1-66ca-4922-abc0-13fa0ab58ee0.jpg
85 lines
2.8 KiB
TypeScript
85 lines
2.8 KiB
TypeScript
import { Provider, DnsRecord, Domain } from '@shared/schema';
|
|
import { CloudflareProvider } from './cloudflare';
|
|
import { Route53Provider } from './route53';
|
|
import { GoDaddyProvider } from './godaddy';
|
|
import { GenericProvider } from './generic';
|
|
|
|
// Define the provider interface all implementations should adhere to
|
|
export interface DNSProvider {
|
|
name: string;
|
|
type: string;
|
|
initialize(credentials: any): Promise<boolean>;
|
|
getZones(): Promise<any[]>;
|
|
getRecords(zoneId: string): Promise<any[]>;
|
|
createRecord(zoneId: string, record: Partial<DnsRecord>): Promise<any>;
|
|
updateRecord(zoneId: string, recordId: string, record: Partial<DnsRecord>): Promise<any>;
|
|
deleteRecord(zoneId: string, recordId: string): Promise<boolean>;
|
|
getZoneIdByName(domain: string): Promise<string | null>;
|
|
}
|
|
|
|
// Factory function to create the appropriate provider instance
|
|
export function createProvider(provider: Provider): DNSProvider {
|
|
switch (provider.type) {
|
|
case 'cloudflare':
|
|
return new CloudflareProvider(provider);
|
|
case 'route53':
|
|
return new Route53Provider(provider);
|
|
case 'godaddy':
|
|
return new GoDaddyProvider(provider);
|
|
case 'other':
|
|
default:
|
|
return new GenericProvider(provider);
|
|
}
|
|
}
|
|
|
|
// Helper function to get the provider instance for a domain
|
|
export async function getProviderForDomain(domain: Domain, provider: Provider): Promise<DNSProvider | null> {
|
|
try {
|
|
if (!provider || !provider.credentials) {
|
|
console.error('Provider not found or missing credentials');
|
|
return null;
|
|
}
|
|
|
|
const dnsProvider = createProvider(provider);
|
|
const initialized = await dnsProvider.initialize(provider.credentials);
|
|
|
|
if (!initialized) {
|
|
console.error(`Failed to initialize provider ${provider.name}`);
|
|
return null;
|
|
}
|
|
|
|
return dnsProvider;
|
|
} catch (error) {
|
|
console.error('Error getting provider for domain:', error);
|
|
return null;
|
|
}
|
|
}
|
|
|
|
// Utility function to synchronize DNS records with the provider
|
|
export async function syncDnsRecords(domain: Domain, provider: Provider, records: DnsRecord[]): Promise<boolean> {
|
|
try {
|
|
const dnsProvider = await getProviderForDomain(domain, provider);
|
|
if (!dnsProvider) {
|
|
return false;
|
|
}
|
|
|
|
// Get zone ID from the provider
|
|
const zoneId = await dnsProvider.getZoneIdByName(domain.name);
|
|
if (!zoneId) {
|
|
console.error(`Zone not found for domain ${domain.name}`);
|
|
return false;
|
|
}
|
|
|
|
// Get existing records from the provider
|
|
const providerRecords = await dnsProvider.getRecords(zoneId);
|
|
|
|
// Perform the synchronization logic here
|
|
// This would involve matching local records with remote records
|
|
// and creating/updating/deleting as needed
|
|
|
|
return true;
|
|
} catch (error) {
|
|
console.error('Error syncing DNS records:', error);
|
|
return false;
|
|
}
|
|
} |