diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/custodian/dnsutil.rb | 72 | ||||
| -rw-r--r-- | lib/custodian/util/dns.rb | 79 | ||||
| -rw-r--r-- | lib/custodian/util/ping.rb | 88 | 
3 files changed, 167 insertions, 72 deletions
| diff --git a/lib/custodian/dnsutil.rb b/lib/custodian/dnsutil.rb deleted file mode 100644 index e42d5e3..0000000 --- a/lib/custodian/dnsutil.rb +++ /dev/null @@ -1,72 +0,0 @@ - - -require 'ipaddr' -require 'socket' -require 'timeout' - - - -# -#  This class is responsible for doing forward/reverse DNS lookups -# -class DNSUtil - - -  # -  # Return the reverse DNS for the specified IP address, nil on failure. -  # -  def DNSUtil.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 DNSUtil.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 - - -if __FILE__ == $0 then - -  %w( ssh.steve.org.uk ipv6.steve.org.uk ).each do |name| -    puts "Hostname test: #{name} #{DNSUtil.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} #{DNSUtil.ip_to_hostname(name) }" -  end -end 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 | 
