Class: Resolv::DNS
- Inherits:
-
Object
show all
- Defined in:
- lib/resolv.rb
Defined Under Namespace
Modules: Label, OpCode, RCode
Classes: Config, DecodeError, EncodeError, Message, Name, Query, Requester, Resource
Constant Summary
collapse
- Port =
STD0013 (RFC 1035, etc.)
ftp://ftp.isi.edu/in-notes/iana/assignments/dns-parameters
53
- UDPSize =
512
- DNSThreadGroup =
ThreadGroup.new
Class Method Summary
collapse
Instance Method Summary
collapse
Constructor Details
#initialize(config_info = nil) ⇒ DNS
Returns a new instance of DNS.
381
382
383
384
385
|
# File 'lib/resolv.rb', line 381
def initialize(config_info=nil)
@mutex = Mutex.new
@config = Config.new(config_info)
@initialized = nil
end
|
Class Method Details
.open(*args) ⇒ Object
371
372
373
374
375
376
377
378
379
|
# File 'lib/resolv.rb', line 371
def self.open(*args)
dns = new(*args)
return dns unless block_given?
begin
yield dns
ensure
dns.close
end
end
|
Instance Method Details
#close ⇒ Object
404
405
406
407
408
409
410
411
412
|
# File 'lib/resolv.rb', line 404
def close
@mutex.synchronize {
if @initialized
@requester.close if @requester
@requester = nil
@initialized = false
end
}
end
|
#each_address(name) ⇒ Object
425
426
427
|
# File 'lib/resolv.rb', line 425
def each_address(name)
each_resource(name, Resource::IN::A) {|resource| yield resource.address}
end
|
#each_name(address) ⇒ Object
440
441
442
443
444
445
446
447
448
449
450
451
452
|
# File 'lib/resolv.rb', line 440
def each_name(address)
case address
when Name
ptr = address
when IPv4::Regex
ptr = IPv4.create(address).to_name
when IPv6::Regex
ptr = IPv6.create(address).to_name
else
raise ResolvError.new("cannot interpret as address: #{address}")
end
each_resource(ptr, Resource::IN::PTR) {|resource| yield resource.name}
end
|
#each_resource(name, typeclass, &proc) ⇒ Object
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
|
# File 'lib/resolv.rb', line 465
def each_resource(name, typeclass, &proc)
lazy_initialize
q = Queue.new
senders = {}
begin
@config.resolv(name) {|candidate, tout, nameserver|
msg = Message.new
msg.rd = 1
msg.add_question(candidate, typeclass)
unless sender = senders[[candidate, nameserver]]
sender = senders[[candidate, nameserver]] =
@requester.sender(msg, candidate, q, nameserver)
end
sender.send
reply = reply_name = nil
timeout(tout, ResolvTimeout) { reply, reply_name = q.pop }
case reply.rcode
when RCode::NoError
(reply, reply_name, typeclass, &proc)
return
when RCode::NXDomain
raise Config::NXDomain.new(reply_name.to_s)
else
raise Config::OtherResolvError.new(reply_name.to_s)
end
}
ensure
@requester.delete(q)
end
end
|
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
|
# File 'lib/resolv.rb', line 496
def (msg, name, typeclass)
if typeclass < Resource::ANY
n0 = Name.create(name)
msg.each_answer {|n, ttl, data|
yield data if n0 == n
}
end
yielded = false
n0 = Name.create(name)
msg.each_answer {|n, ttl, data|
if n0 == n
case data
when typeclass
yield data
yielded = true
when Resource::CNAME
n0 = data.name
end
end
}
return if yielded
msg.each_answer {|n, ttl, data|
if n0 == n
case data
when typeclass
yield data
end
end
}
end
|
#getaddress(name) ⇒ Object
414
415
416
417
|
# File 'lib/resolv.rb', line 414
def getaddress(name)
each_address(name) {|address| return address}
raise ResolvError.new("DNS result has no information for #{name}")
end
|
#getaddresses(name) ⇒ Object
419
420
421
422
423
|
# File 'lib/resolv.rb', line 419
def getaddresses(name)
ret = []
each_address(name) {|address| ret << address}
return ret
end
|
#getname(address) ⇒ Object
429
430
431
432
|
# File 'lib/resolv.rb', line 429
def getname(address)
each_name(address) {|name| return name}
raise ResolvError.new("DNS result has no information for #{address}")
end
|
#getnames(address) ⇒ Object
434
435
436
437
438
|
# File 'lib/resolv.rb', line 434
def getnames(address)
ret = []
each_name(address) {|name| ret << name}
return ret
end
|
#getresource(name, typeclass) ⇒ Object
454
455
456
457
|
# File 'lib/resolv.rb', line 454
def getresource(name, typeclass)
each_resource(name, typeclass) {|resource| return resource}
raise ResolvError.new("DNS result has no information for #{name}")
end
|
#getresources(name, typeclass) ⇒ Object
459
460
461
462
463
|
# File 'lib/resolv.rb', line 459
def getresources(name, typeclass)
ret = []
each_resource(name, typeclass) {|resource| ret << resource}
return ret
end
|
#lazy_initialize ⇒ Object
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
|
# File 'lib/resolv.rb', line 387
def lazy_initialize
@mutex.synchronize {
unless @initialized
@config.lazy_initialize
if nameserver = @config.single?
@requester = Requester::ConnectedUDP.new(nameserver)
else
@requester = Requester::UnconnectedUDP.new
end
@initialized = true
end
}
self
end
|