79 lines
1.3 KiB
Ruby
79 lines
1.3 KiB
Ruby
# -*- coding: binary -*-
|
|
require 'timeout'
|
|
|
|
module SecondsHandle #:nodoc: all
|
|
def transform(secs)
|
|
case secs
|
|
when 0
|
|
to_s
|
|
when 1..59
|
|
"#{secs} seconds"
|
|
when 60..3559
|
|
"#{secs/60} minutes and #{secs%60} seconds"
|
|
else
|
|
hours = secs/3600
|
|
secs -= (hours*3600)
|
|
"#{hours} hours, #{secs/60} minutes and #{secs%60} seconds"
|
|
end
|
|
end
|
|
end
|
|
|
|
class DnsTimeout # :nodoc: all
|
|
|
|
include SecondsHandle
|
|
|
|
def initialize(seconds)
|
|
if seconds.is_a? Numeric and seconds >= 0
|
|
@timeout = seconds
|
|
else
|
|
raise DnsTimeoutArgumentError, "Invalid value for tcp timeout"
|
|
end
|
|
end
|
|
|
|
def to_i
|
|
@timeout
|
|
end
|
|
|
|
def to_s
|
|
if @timeout == 0
|
|
@output
|
|
else
|
|
@timeout.to_s
|
|
end
|
|
end
|
|
|
|
def pretty_to_s
|
|
transform(@timeout)
|
|
end
|
|
|
|
def timeout
|
|
unless block_given?
|
|
raise DnsTimeoutArgumentError, "Block required but missing"
|
|
end
|
|
if @timeout == 0
|
|
yield
|
|
else
|
|
return Timeout.timeout(@timeout) do
|
|
yield
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
class TcpTimeout < DnsTimeout # :nodoc: all
|
|
def initialize(seconds)
|
|
@output = "infinite"
|
|
super(seconds)
|
|
end
|
|
end
|
|
|
|
class UdpTimeout < DnsTimeout # :nodoc: all
|
|
def initialize(seconds)
|
|
@output = "not defined"
|
|
super(seconds)
|
|
end
|
|
end
|
|
|
|
class DnsTimeoutArgumentError < ArgumentError # :nodoc: all
|
|
end
|