summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/custodian/util/ping.rb92
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