class Kitsune::Kit::Commands::Dns
def link
def link validate_ip! domains = resolve_domains return if domains.empty? ip = options[:server_ip] ttl = ENV.fetch("DNS_TTL", options[:ttl]).to_i client = DropletKit::Client.new(access_token: ENV.fetch("DO_API_TOKEN")) domains.each do |fqdn| parts = fqdn.split('.') next if parts.size < 2 root_domain = parts[-2..].join('.') subdomain = parts[0..-3].join('.') name_for_a = subdomain.empty? ? "@" : subdomain puts "\n🌐 Linking '#{fqdn}' to IP #{ip} (domain: #{root_domain}, record: #{name_for_a})" records = client.domain_records.all(for_domain: root_domain) existing = records.find { |r| r.type == "A" && r.name == name_for_a } domain_record = DropletKit::DomainRecord.new( type: "A", name: name_for_a, data: ip, ttl: ttl ) msg = "'#{AnsiColor.colorize(name_for_a, color: :green)}.#{AnsiColor.colorize(root_domain, color: :green)}' → #{AnsiColor.colorize(ip, color: :light_cyan)}" if existing client.domain_records.update( domain_record, for_domain: root_domain, id: existing.id ) puts "✅ Updated A record #{msg}" else client.domain_records.create( domain_record, for_domain: root_domain ) puts "✅ Created A record #{msg}" end end end
def resolve_domains
def resolve_domains raw = options[:domains] || ENV["DOMAIN_NAMES"] if raw.nil? || raw.strip.empty? puts "⏭️ No domains provided. Skipping DNS operation." return [] end raw.split(',').map(&:strip).reject(&:empty?) end
def rollback
def rollback domains = resolve_domains return if domains.empty? client = DropletKit::Client.new(access_token: ENV.fetch("DO_API_TOKEN")) domains.each do |fqdn| parts = fqdn.split('.') next if parts.size < 2 root_domain = parts[-2..].join('.') subdomain = parts[0..-3].join('.') name_for_a = subdomain.empty? ? "@" : subdomain puts "\n🗑️ Attempting to delete A record for '#{fqdn}' (domain: #{root_domain}, record: #{name_for_a})" records = client.domain_records.all(for_domain: root_domain) existing = records.find { |r| r.type == "A" && r.name == name_for_a } if existing client.domain_records.delete(for_domain: root_domain, id: existing.id) puts "✅ Deleted A record '#{name_for_a}.#{root_domain}'" else puts "💡 No A record found for '#{name_for_a}.#{root_domain}', nothing to delete" end end end
def validate_ip!
def validate_ip! if options[:server_ip].nil? || options[:server_ip].empty? abort "❌ Missing required option: --server-ip" end end