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