class DockerDNS
Public Class Methods
new(config)
click to toggle source
Public Instance Methods
a_record(fqdn)
click to toggle source
# File lib/dockerdns.rb, line 69 def a_record(fqdn) resolver.answer.first.address.to_s end
container_ip(id)
click to toggle source
# File lib/dockerdns.rb, line 61 def container_ip(id) Docker::Container.get(id).json["NetworkSettings"]["IPAddress"] end
container_name(id)
click to toggle source
# File lib/dockerdns.rb, line 65 def container_name(id) Docker::Container.get(id).json["Config"]["Hostname"] end
create_or_update_dns_records!(id)
click to toggle source
# File lib/dockerdns.rb, line 141 def create_or_update_dns_records!(id) hostname = container_name(id) ipAddress = container_ip(id) set_a_record(ipAddress, hostname) set_ptr_record(ipAddress, hostname) a_record("#{hostname}.#{domain}") ptr_record(ipAddress) end
delete_a_record(ipAddress, hostname)
click to toggle source
# File lib/dockerdns.rb, line 93 def delete_a_record(ipAddress, hostname) record = "#{hostname}.#{domain}" puts "deleting a-record #{record}" update = Dnsruby::Update.new(domain) # delete record puts "update.delete(#{record})" update.delete(record) # send update begin resolver.send_message(update) puts "Update succeeded" rescue Exception => e puts "Update failed: #{e}" end end
delete_dns_records!(id)
click to toggle source
# File lib/dockerdns.rb, line 151 def delete_dns_records!(id) hostname = container_name(id) ipAddress = a_record("#{hostname}.#{domain}") delete_a_record(ipAddress, hostname) delete_ptr_record(ipAddress, hostname) end
delete_ptr_record(ipAddress, hostname)
click to toggle source
# File lib/dockerdns.rb, line 125 def delete_ptr_record(ipAddress, hostname) record = "#{ipAddress.split('.').last}.#{reversezone}" puts "deleting ptr-record #{record}" update = Dnsruby::Update.new(reversezone) # delete record puts "update.delete(#{record})" update.delete(record) # send update begin resolver.send_message(update) puts "Update succeeded" rescue Exception => e puts "Update failed: #{e}" end end
docker_url()
click to toggle source
# File lib/dockerdns.rb, line 32 def docker_url @config["dockerurl"] || '/var/run/docker.sock' end
domain()
click to toggle source
# File lib/dockerdns.rb, line 16 def domain @config["domain"] end
ptr_record(ipAddress)
click to toggle source
# File lib/dockerdns.rb, line 73 def ptr_record(ipAddress) resolver.query(ipAddress, "PTR").answer.first.domainname.to_s end
resolver()
click to toggle source
# File lib/dockerdns.rb, line 24 def resolver @resolver ||= Dnsruby::Resolver.new(@config['dnsserver']) end
reversezone()
click to toggle source
# File lib/dockerdns.rb, line 20 def reversezone @config["reversezone"] end
run!()
click to toggle source
# File lib/dockerdns.rb, line 36 def run! Docker.url = docker_url Docker.options[:read_timeout] = 5 begin Docker::Event.stream do |event| case event.status when "create" next when "start" puts "caught event #{event.status} for container id #{event.id}" create_or_update_dns_records!(event.id, domain) when "die", "kill", "stop", "destroy" puts "caught event #{event.status} for container id #{event.id}" delete_dns_records!(event.id) else puts "Ignoring Docker Event #{event.status}" end end rescue Docker::Error::TimeoutError, Excon::Errors::SocketError retry rescue StandardError => e puts "Error while streaming events: #{e}" end end
set_a_record(ipAddress, hostname)
click to toggle source
# File lib/dockerdns.rb, line 77 def set_a_record(ipAddress, hostname) record = "#{hostname}.#{domain}" puts "setting a-record #{record}" update = Dnsruby::Update.new(domain) # add record puts "update.add(#{record}, 'A', #{ttl}, #{ipAddress})" update.add(record, 'A', ttl, ipAddress) # send update begin resolver.send_message(update) puts "Update succeeded" rescue Exception => e puts "Update failed: #{e}" end end
set_ptr_record(ipAddress, hostname)
click to toggle source
# File lib/dockerdns.rb, line 109 def set_ptr_record(ipAddress, hostname) record = "#{ipAddress.split('.').last}.#{reversezone}" puts "setting ptr-record #{record}" update = Dnsruby::Update.new(reversezone) # add record puts "update.add(#{record}, 'PTR', #{ttl}, #{fqdn})" update.add(record, 'PTR', ttl, fqdn) # send update begin resolver.send_message(update) puts "Update succeeded" rescue Exception => e puts "Update failed: #{e}" end end
ttl()
click to toggle source
# File lib/dockerdns.rb, line 28 def ttl @config["ttl"] end