diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/custodian/util/ping.rb | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/lib/custodian/util/ping.rb b/lib/custodian/util/ping.rb new file mode 100644 index 0000000..d563722 --- /dev/null +++ b/lib/custodian/util/ping.rb @@ -0,0 +1,92 @@ + +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 |