Created
July 24, 2012 14:39
-
-
Save callumj/3170306 to your computer and use it in GitHub Desktop.
Set Route 53 record from local IP
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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