class DockerDNS

Public Class Methods

new(config) click to toggle source
# File lib/dockerdns.rb, line 12
def initialize(config)
  @config = config
end
run!(config) click to toggle source
# File lib/dockerdns.rb, line 7
def self.run!(config)
  DockerDNS.new(config).run!
end

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