diff options
Diffstat (limited to 'bin/multi-ping')
| -rwxr-xr-x | bin/multi-ping | 161 | 
1 files changed, 161 insertions, 0 deletions
| diff --git a/bin/multi-ping b/bin/multi-ping new file mode 100755 index 0000000..0d2add5 --- /dev/null +++ b/bin/multi-ping @@ -0,0 +1,161 @@ +#!/usr/bin/ruby1.8 -w +# +# NAME +#   multi-ping - IPv4 and IPv6 ping tool +# +# SYNOPSIS +#  multi-ping  [ -h | --help ] [-m | --manual] hostname1 +# +# OPTIONS +# +#  -h, --help              Show a help message, and exit. +# +#  -m, --manual            Show this manual, and exit. +# +#  -v, --verbose           Show verbose errors +# +# ABOUT +# +#  The multi-ping tool is designed to be IPv4/IPv6-agnostic ping tool, +# which removes the need to know if you're pinging an IPv4 host or an +# IPv6 host. +# +#  The tool works by resolving the hostname specified upon the command line, +# and invoking "ping" or "ping6" upon the result - using the correct one for +# the address which has been returned. +# +# AUTHOR +# +#  Steve Kemp  <steve@bytemark.co.uk> +# + + +require 'getoptlong' +require 'socket' + + + +# +#  Options set by the command-line.  These are all global. +# +$help   = false +$manual = false + +opts = GetoptLong.new( +                      [ '--help',   '-h', GetoptLong::NO_ARGUMENT ], +                      [ '--manual', '-m', GetoptLong::NO_ARGUMENT ] ) + +begin +  opts.each do |opt,arg| +    case opt +    when '--help' +      $help = true +    when '--manual' +      $manual = true +    end +  end +rescue => err +  # any errors, show the help +  warn err.to_s +  $help = true +end + + +# +# CAUTION! Here be quality kode. +# +if $manual or $help + +  # Open the file, stripping the shebang line +  lines = File.open(__FILE__){|fh| fh.readlines}[1..-1] + +  found_synopsis = false + +  lines.each do |line| + +    line.chomp! +    break if line.empty? + +    if $help and !found_synopsis +      found_synopsis = (line =~ /^#\s+SYNOPSIS\s*$/) +      next +    end + +    puts line[2..-1].to_s + +    break if $help and found_synopsis and line =~ /^#\s*$/ + +  end + +  exit 0 +end + + + + +# +#  Get the address to ping. +# +hostname = ARGV.shift + +# +#  If we have no host then abort +# +if ( hostname.nil? ) +  puts "Usage: #{$0} hostname" +  exit 1 +end + + +# +#  The IP we'll deal with +# +ip = nil + + +# +#  Lookup the IP, catching any exception +# +begin +  Socket.getaddrinfo(hostname, 'echo').each do |a| +    ip = a[3] +  end +rescue SocketError +  puts "Failed to resolve: #{hostname}" +  exit 1 +end + + +# +#  Was the result an IPv4 address? +# +if ( ip =~ /^([0-9]+).([0-9]+).([0-9]+).([0-9]+)$/ ) + +  # +  #  If so invoke "ping" +  # +  if ( system( "ping -c 1 #{ip} 2>/dev/null >/dev/null" ) == true ) +    puts "#{hostname} alive." +    exit 0 +  else +    puts "ping4 failed - #{hostname} [#{ip}]" +    exit 1 +  end +elsif ( ip =~ /2001/ ) + +  # +  #  Was the result an IPv6 address? +  # +  if ( system( "ping6 -c 1 -w1 #{ip} 2>/dev/null >/dev/null" ) == true ) +    puts "#{hostname} alive." +    exit 0 +  else +    puts "ping6 failed - #{hostname} [#{ip}]" +    exit 1 +  end +end + + +# +#  All done. +# | 
