Skip to content

Instantly share code, notes, and snippets.

@jc1arke
Created April 2, 2013 13:28
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 jc1arke/5292199 to your computer and use it in GitHub Desktop.
Save jc1arke/5292199 to your computer and use it in GitHub Desktop.
#!/usr/bin/env ruby
require 'rubygems'
require 'aws-sdk'
AWS.config( :access_key_id => ENV['AWS_ACCESS_KEY_ID'], :secret_access_key => ENV['AWS_SECRET_KEY'] )
bucket = 'route53_backups'
debug = false
r53 = AWS::Route53.new
zones = Array.new
needed_zones = Array.new
me_supreme = 99
z = Hash.new
z[:name] = 'clarkejo.lab.myinstance.com.'
z[:entry] = 'wrr.clarkejo.lab.myinstance.com.'
z[:healthcheck_url] = '/index.html'
z[:type] = 'A'
z[:ttl] = 60
needed_zones << z
if debug
puts r53.client.get_hosted_zone(:id => needed_zones.first[:id]).data.to_a
end
resp = r53.client.list_hosted_zones()
resp[:hosted_zones].each do |zone|
zones << zone
end
zones.each do |z|
needed_zones.each do |zone_to_find|
if z[:name].eql? zone_to_find[:name]
resp = r53.client.list_resource_record_sets(:hosted_zone_id => z[:id])
z[:records] = Array.new
resp[:resource_record_sets].each do |resource|
if resource[:name].eql? zone_to_find[:entry]
z[:records] << resource
end
end
end
end
end
if debug
puts zones.first[:records].count
end
zones.each do |z|
w = 0
z[:records].each do |r|
r[:prev_weight] = r[:weight]
r[:failed] = false
temp = r[:resource_records]
# do healthcheck
url = URI.parse("http://#{temp.first[:value]}#{needed_zones.first[:healthcheck_url]}")
req = Net::HTTP::Get.new("http://#{temp.first[:value]}#{needed_zones.first[:healthcheck_url]}")
@res = Net::HTTP.start(url.host, url.port) { |http|
response = http.request(req)
if response.code.to_i != 200
r[:failed] = true
end
}
if r[:weight] == r[:prev_weight] && r[:failed] == false
w += 1
r[:modify] = true
end
end
weightings = (me_supreme / w).to_i
r53_changes = Hash.new
_r53_changes = Hash.new
changes = Array.new
_changes = Array.new
z[:records].each do |record|
c = Hash.new
c[:action] = 'DELETE'
r = Hash.new
r[:name] = needed_zones.first[:entry]
r[:type] = needed_zones.first[:type]
r[:weight] = record[:prev_weight]
if debug
r[:prev_weight] = record[:prev_weight]
end
rr = Array.new #resource_records
rrr = Hash.new #value
temp = record[:resource_records]
rrr[:value] = temp.first[:value]
rr << rrr
r[:resource_records] = rr
r[:ttl] = record[:ttl]
r[:set_identifier] = record[:set_identifier]
c[:resource_record_set] = r
changes << c
_c = c.clone
_c[:action] = 'CREATE'
_temp = _c[:resource_record_set].clone
if record[:modify]
_temp[:weight] = weightings
end
_temp[:ttl] = needed_zones.first[:ttl]
_c[:resource_record_set] = _temp
_changes << _c
end
r53_changes[:changes] = changes
_r53_changes[:changes] = _changes
if debug
puts r53_changes.to_yaml
puts _r53_changes.to_yaml
end
if ! debug
# delete
resp = r53.client.change_resource_record_sets(
:hosted_zone_id => z[:id],
:change_batch => r53_changes
)
# create
resp = r53.client.change_resource_record_sets(
:hosted_zone_id => z[:id],
:change_batch => _r53_changes
)
end
puts zones.first[:records].to_yaml
puts "Maybe I worked, maybe I didn't...."
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment