Skip to content

Instantly share code, notes, and snippets.

@opensourceame
Created December 22, 2020 10:35
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save opensourceame/c942b4b32637c65fa7291a53b28f19fe to your computer and use it in GitHub Desktop.
Save opensourceame/c942b4b32637c65fa7291a53b28f19fe to your computer and use it in GitHub Desktop.
Import a DNS zone file into hover.com
#!/usr/bin/env ruby
# import am DNS zone file into Hover
#
# first get your domain ID from here:
# https://www.hover.com/api/domains/yourdomain.com/dns/
#
# install the required gems:
#
# gem install hover dns-zone
#
# then run like so:
#
# DOMAIN_ID=domain123 USERNAME=myusername PASSWORD=mypassword ZONE_FILE=mydomain.zone ./import_zone_to_hover.rb
#
require 'hover'
require 'dns/zone'
require 'logger'
def get_content(record)
case record.type
when 'A'
record.address
when 'CNAME'
record.domainname
when 'TXT'
record.text
when 'MX'
record.priority.to_s + ' ' + record.exchange
when 'NS'
record.nameserver
end
end
def record_exists?(record)
$existing_records.find {|r|
r['type'] == record.type && \
r['name' ] == record.label && \
r['content'] == get_content(record)
}
end
logger = Logger.new(STDOUT)
domain_id = ENV['DOMAIN_ID']
api = Hover::Api.new(ENV['USERNAME'], ENV['PASSWORD'])
text = File.read(ENV['ZONE_FILE'])
zone = DNS::Zone.load(text)
$existing_records = api.domain_dns(domain_id)
logger.info "zone file contains #{zone.records.count} records"
zone.records.each do |record|
# when migrating to Hover they become the SOA for the domain
next if record.type == 'SOA'
if record_exists?(record)
logger.warn "skipping existing record: #{record.dump}"
else
logger.info "creating record: #{record.dump}"
api.create_record(domain_id, record.label, record.type, get_content(record))
sleep 1 # workaround for Hover API closing connections
end
end
logger.info 'finished'
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment