From 80b250e226472b3d7d71c194ea1cd2b02f52885c Mon Sep 17 00:00:00 2001 From: Steve Kemp Date: Thu, 22 Nov 2012 06:42:07 +0000 Subject: Renamed. --- lib/custodian/util/dns.rb | 79 +++++++++++++++++++++++++++++++++++++++++ lib/custodian/util/ping.rb | 88 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 167 insertions(+) create mode 100644 lib/custodian/util/dns.rb create mode 100644 lib/custodian/util/ping.rb (limited to 'lib/custodian/util') diff --git a/lib/custodian/util/dns.rb b/lib/custodian/util/dns.rb new file mode 100644 index 0000000..901dae0 --- /dev/null +++ b/lib/custodian/util/dns.rb @@ -0,0 +1,79 @@ + + +require 'ipaddr' +require 'socket' +require 'timeout' + + + +# +# This class is responsible for doing forward/reverse DNS lookups +# +module Custodian + module Util + class DNS + + + # + # Return the reverse DNS for the specified IP address, nil on failure. + # + def DNS.ip_to_hostname( ip ) + resolved = nil + begin + timeout( 4 ) do + begin + Socket.getaddrinfo(ip, 'echo').each do |a| + resolved = a[2] if ( a ) + end + rescue SocketError + resolved = nil + end + end + rescue Timeout::Error => e + resolved = nil + end + resolved + end + + + # + # Convert a hostname to an IP address, return nil on failure. + # + def DNS.hostname_to_ip( hostname ) + + resolved = nil + + begin + timeout( 4 ) do + begin + Socket.getaddrinfo(hostname, 'echo').each do |a| + resolved = a[3] if ( a ) + end + rescue SocketError + resolved = nil + end + end + rescue Timeout::Error => e + resolved = nil + end + resolved + end + + end + + end +end + + + + +if __FILE__ == $0 then + + %w( ssh.steve.org.uk ipv6.steve.org.uk ).each do |name| + puts "Hostname test: #{name} #{Custodian::Util::DNS.hostname_to_ip(name) }" + end + + %w( 80.68.85.46 80.68.85.48 2001:41c8:125:46::22 ).each do |name| + puts "Hostname test: #{name} #{Custodian::Util::DNS.ip_to_hostname(name) }" + end +end diff --git a/lib/custodian/util/ping.rb b/lib/custodian/util/ping.rb new file mode 100644 index 0000000..b3fa7f4 --- /dev/null +++ b/lib/custodian/util/ping.rb @@ -0,0 +1,88 @@ + +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 ) + @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 + return false + end + + end + + end +end -- cgit v1.2.1