lib/igp/base.rb in igp-0.0.1 vs lib/igp/base.rb in igp-0.0.2
- old
+ new
@@ -1,9 +1,12 @@
+# main class that runs the ping task
class Igp::Base
# holds the parsed options
attr_reader :options
+ # the output formatter
+ attr_reader :formatter
# the Net::Ping handler for the specific protocol required
attr_reader :ping_handler
# number of pings to perform (nil => infinite)
attr_reader :limit
# number of seconds to wait between pings (default = 5)
@@ -16,10 +19,11 @@
# :url => destination url (required for http/s and ldap/s)
# :host => host name or IP address (required for icmp,tcp, and udp)
# :port => optionally specify the port for host (else default port is assumed)
#
def initialize(options = {})
+ @formatter = Format.new
@options = options
@limit = options[:limit]
@interval = options[:interval] || 5
case options[:type]
when :icmp
@@ -35,33 +39,46 @@
end
end
# main routine to run a complete ping test
def run
- return unless ping_handler
- header
+ return unless ping_handler && formatter
+ formatter.header(
+ '# It goes PING! .. testing',options[:url],
+ (limit ? "#{limit} times - once" : nil),
+ 'every',interval,'seconds'
+ )
ping_count=0
while (limit.nil? || ping_count < limit) do
status = ping_handler.ping?
- log status,ping_handler.duration,ping_handler.exception
+ formatter.log(status,formatter.duration(ping_handler.duration),ping_handler.exception)
ping_count += 1
sleep interval if (limit.nil? || ping_count < limit)
end
end
- protected
+ # handle output formating tasks
+ class Format
- # prints the header structure to STDERR
- def header
- $stderr.puts [
- '# It goes PING! .. testing',options[:url],
- (limit ? "#{limit} times - once" : nil),'every',interval,'seconds'
- ].compact.join(' ')
- end
+ # the time format - in 1.8 strftime doesn't understand milliseconds
+ TIME_FORMAT = (RUBY_VERSION =~ /^1\.9/) ? "%Y-%m-%dT%H:%M:%S.%LZ" : "%Y-%m-%dT%H:%M:%SZ"
- # logs ping result to STDOUT
- # +args+ is an array of values to log
- def log(*args)
- $stdout.puts(([Time.now.utc.strftime( "%Y-%m-%dT%H:%M:%S.%LZ" )] + args).join(','))
- $stdout.flush
+ # prints the header structure to STDERR
+ def header(*args)
+ $stderr.puts(args.compact.join(' '))
+ end
+
+ # logs ping result to STDOUT
+ # +args+ is an array of values to log
+ def log(*args)
+ $stdout.puts(([Time.now.utc.strftime( TIME_FORMAT )] + args).join(','))
+ $stdout.flush
+ end
+
+ # formats the duration for output. nil duration remains nil
+ def duration(duration)
+ "%.6f" % duration if duration
+ end
+
end
+
end
\ No newline at end of file