module MockDnsServer::MessageBuilder

Public Instance Methods

axfr_request(zone) click to toggle source
# File lib/mock_dns_server/message_builder.rb, line 173
def axfr_request(zone)
  Dnsruby::Message.new(zone, 'AXFR')
end
dns_update(zone, records) click to toggle source

Creates a Dnsruby::Update object from a hash, as it would be generated from a Cucumber table with the following headings: | Action | Type | Domain | RDATA |

# File lib/mock_dns_server/message_builder.rb, line 120
def dns_update(zone, records)
  update = Dnsruby::Update.new(zone)
  records.each do |r|
    if r.type.upcase == 'ADD'
      s = "#{Domain} 3600 #{Type}  #{RDATA}"
      rr = Dnsruby::RR.create(s)
      update.add(rr)
    else
      update.delete(r['Domain'], r['Type'], r['RDATA'])
    end
  end
  update
end
dummy_a_response(record_count, domain, ttl = 86400) click to toggle source
# File lib/mock_dns_server/message_builder.rb, line 56
def dummy_a_response(record_count, domain, ttl = 86400)
  ip_dispenser = IpAddressDispenser.new
  message = Dnsruby::Message.new
  message.header.qr = true

  record_count.times do
    answer = Dnsruby::RR.new_from_hash(
        name: domain, ttl: ttl, type: 'A', address: ip_dispenser.next, klass: 'IN')
    message.add_answer(answer)
  end
  message
end
ixfr_request(zone, serial) click to toggle source
# File lib/mock_dns_server/message_builder.rb, line 166
def ixfr_request(zone, serial)
  query = Dnsruby::Message.new(zone, 'IXFR')
  query.add_authority(ixfr_request_soa_rr(zone, serial_value(serial)))
  query
end
ixfr_request_soa_rr(zone, serial) click to toggle source

Builds a SOA RR suitable for inclusion in the authority section of an IXFR query.

# File lib/mock_dns_server/message_builder.rb, line 147
def ixfr_request_soa_rr(zone, serial)
  options = {
      name: zone,
      type: 'SOA',
      ttl: 3600,
      klass: 'IN',
      mname: '.',
      rname: '.',
      serial: serial_value(serial),
      refresh: 0,
      retry: 0,
      expire: 0,
      minimum: 0
  }

  Dnsruby::RR.new_from_hash(options)
end
notify_message(options) click to toggle source

@param options a hash containing values for keys [:name, :serial, :mname]

# File lib/mock_dns_server/message_builder.rb, line 178
def notify_message(options)

  message = Dnsruby::Message.new(options[:name], 'SOA', 'IN')
  message.header.opcode = Dnsruby::OpCode::Notify

  mname = options[:mname] || 'default.com'

  message.add_answer(Dnsruby::RR.new_from_hash( {
      name:    options[:name],
      type:    'SOA',
      serial:  serial_value(options[:serial]),
      mname:   mname,
      rname:   'admin.' + mname,
      refresh: 3600,
      retry:   3600,
      expire:  3600,
      minimum: 3600
  } ))
  message
end
ns(owner, address) click to toggle source

Creates an NS RR record.

# File lib/mock_dns_server/message_builder.rb, line 111
def ns(owner, address)
  rr('NS', owner, address)
end
rr(type, name, rdata) click to toggle source

Builds a Dnsruby::RR instance with the specified type, name, and rdata, with a hard coded TTL and class 'IN'.

# File lib/mock_dns_server/message_builder.rb, line 102
def rr(type, name, rdata)
  ttl = 3600
  klass = 'IN'
  string = [name, ttl, klass, type, rdata].join(' ')
  Dnsruby::RR.new_from_string(string)
end
serial_value(serial) click to toggle source

Gets the serial value from the passed object; if it's a SerialNumber, calls its value method; if not, we assume it's a number and it's returned unchanged.

# File lib/mock_dns_server/message_builder.rb, line 72
def serial_value(serial)
  serial.is_a?(SerialNumber) ? serial.value : serial
end
soa_answer(options) click to toggle source
# File lib/mock_dns_server/message_builder.rb, line 82
def soa_answer(options)
  mname = options[:mname] || 'default.com'

  Dnsruby::RR.create( {
    name:    options[:name],
    ttl:     options[:ttl] || 3600,
    type:    'SOA',
    serial:  serial_value(options[:serial]),
    mname:   mname,
    rname:   'admin.' + mname,
    refresh: options[:refresh] || 3600,
    retry:   options[:retry]   || 3600,
    expire:  options[:expire]  || 3600,
    minimum: options[:minimum] || 3600
  } )
end
soa_request(name) click to toggle source
# File lib/mock_dns_server/message_builder.rb, line 77
def soa_request(name)
  Dnsruby::Message.new(name, 'SOA', 'IN')
end
soa_response(options) click to toggle source

@param options a hash containing values for keys [:name, :serial, :mname] TODO: Eliminate duplication of soa_response and notify_message

# File lib/mock_dns_server/message_builder.rb, line 137
def soa_response(options)
  raise "Must provide zone name as options[:name]." if options[:name].nil?
  message = Dnsruby::Message.new(options[:name], 'SOA', 'IN')
  message.header.qr = true
  message.add_answer(soa_answer(options))
  message
end
specified_a_response(answer_string) click to toggle source

Builds a response to an 'A' request from the encoded string passed. @param answer_string string in any format supported by Dnsruby::RR.create (see resource.rb, e.g. github.com/vertis/dnsruby/blob/master/lib/Dnsruby/resource/resource.rb, line 643 ff at the time of this writing):

a     = Dnsruby::RR.create("foo.example.com. 86400 A 10.1.2.3")
# File lib/mock_dns_server/message_builder.rb, line 47
def specified_a_response(answer_string)
  message = Dnsruby::Message.new
  message.header.qr = true
  answer = Dnsruby::RR.create(answer_string)
  message.add_answer(answer)
  message
end