module MockDnsServer::MessageBuilder
Public Instance Methods
# File lib/mock_dns_server/message_builder.rb, line 173 def axfr_request(zone) Dnsruby::Message.new(zone, 'AXFR') end
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
# 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
# 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
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
@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
Creates an NS RR record.
# File lib/mock_dns_server/message_builder.rb, line 111 def ns(owner, address) rr('NS', owner, address) end
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
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
# 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
# File lib/mock_dns_server/message_builder.rb, line 77 def soa_request(name) Dnsruby::Message.new(name, 'SOA', 'IN') end
@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
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