require 'custodian/util/dns' # # This class has methods to determine whether the target # of a hostname/IP address is IPv4 or IPv6. # # Assuming the address resolves to one of those two types # it can invoke on of /usr/bin/ping or /usr/bin/ping6 appropriately. # module Custodian module Util class Ping # # The hostname we'll ping, and the resolved address. # attr_reader :hostname, :resolved # # Save the hostname away, resolve it if possible. # def initialize( hostname ) raise ArgumentError, 'Hostname must not be nil' if hostname.nil? raise ArgumentError, 'Hostname must be a String' unless hostname.kind_of?( String ) @hostname = hostname @resolved = Custodian::Util::DNS.hostname_to_ip( hostname ) end # # Return the resolved address # def address @resolved end # # Does the hostname resolve to an IPv4 address? # def is_ipv4? if ( ! @resolved.nil? ) && ( @resolved =~ /^([0-9]+).([0-9]+).([0-9]+).([0-9]+)$/ ) true else false end end # # Does the hostname resolve to an IPv6 address? # def is_ipv6? if ( ! @resolved.nil? ) && ( @resolved =~ /^([a-f0-9:]+)$/i ) true else false end end # # Run the ping - if it succeeds return "true". # # Return false on error. # def run_ping if is_ipv6? if ( system( "ping6 -c 1 #{@resolved} 2>/dev/null >/dev/null" ) == true ) return true end elsif( is_ipv4? ) if ( system( "ping -c 1 #{@resolved} 2>/dev/null >/dev/null" ) == true ) return true end else puts 'ERROR: Resolved to neither an IPv6 or IPv4 address.' end false end end end end