Skip to content

Instantly share code, notes, and snippets.

@callumj
Created July 24, 2012 14:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save callumj/3170306 to your computer and use it in GitHub Desktop.
Save callumj/3170306 to your computer and use it in GitHub Desktop.
Set Route 53 record from local IP
options:
only_if: "192[.]168[.]4[.].*"
base:
host: callum
domain: office.example.net
aws:
resource_id: SSS2222222
access_key_id: SSSSSS44444444
secret_access_key: "DSFKJNDS+++SSSSS2222222SDDS"
#!/usr/bin/env ruby
require 'fog'
require 'socket'
require 'yaml'
module Helpers
def self.local_ip
orig, Socket.do_not_reverse_lookup = Socket.do_not_reverse_lookup, true # turn off reverse DNS resolution temporarily
UDPSocket.open do |s|
s.connect 'iinet.net.au', 1 # hit a local endpoint
s.addr.last
end
ensure
Socket.do_not_reverse_lookup = orig
end
def self.settings
@settings = YAML.load_file(File.expand_path "~/.my53.yml") if defined?(@settings).nil?
@settings
end
end
module Execute
def self.construct_dns
Fog::DNS.new({ :provider => 'AWS', :aws_access_key_id => Helpers::settings['aws']['access_key_id'], :aws_secret_access_key => Helpers::settings['aws']['secret_access_key']})
end
def self.full_domain_name
"#{Helpers::settings['base']['host']}.#{Helpers::settings['base']['domain']}."
end
def self.delete_and_set
this_ip = Helpers::local_ip
if Helpers::settings['options'].is_a?(Hash) && !(Helpers::settings['options']['only_if'].nil?)
only_if = Helpers::settings['options']['only_if'].is_a?(Regexp) ? Helpers::settings['options']['only_if'] : Regexp.new(Helpers::settings['options']['only_if'])
if only_if.match(this_ip).nil?
return
end
end
dns = construct_dns
changes = []
# see if the record exists so we can nuke it (it needs to match perfectly)
current_state = dns.list_resource_record_sets Helpers::settings['aws']['resource_id']
if current_state.respond_to?(:body)
current_state.body["ResourceRecordSets"].each do |record|
if record["Name"].eql?(full_domain_name)
changes << {:action => "DELETE",
:name => record["Name"],
:type => record["Type"],
:ttl => record["TTL"],
:resource_records => record["ResourceRecords"]}
end
end
end
# build a new record
changes << {:action => "CREATE",
:name => full_domain_name,
:type => "A",
:ttl => 600,
:resource_records => [this_ip]
}
dns.change_resource_record_sets Helpers::settings['aws']['resource_id'], changes
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment