diff options
author | Steve Kemp <steve@steve.org.uk> | 2012-11-13 17:22:43 +0000 |
---|---|---|
committer | Steve Kemp <steve@steve.org.uk> | 2012-11-13 17:22:43 +0000 |
commit | a05a3cb59b26b0eff338b82a8cdf2627839e4cec (patch) | |
tree | eacbf6a3573759ea0f1ee8348a09ca39d60028b7 /bin/multi-ping | |
parent | a977d57759bbe20ae6a6eff6ef1af29a6b7ff936 (diff) |
Renamed and moved files around.
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. +# |