summaryrefslogtreecommitdiff
path: root/bin/multi-ping
blob: 98332158a2b3c13e96e5e9a694b4fe90c816b216 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#!/usr/bin/ruby -Ilib/ -I../lib/
#
# NAME
#   multi-ping - IPv4 and IPv6 ping tool
#
#
# SYNOPSIS
#  multi-ping  [ -h | --help ] [-m | --manual] hostname
#
#
# OPTIONS
#
#  -h, --help      Show a help message, and exit.
#
#  -m, --manual    Show this manual, and exit.
#
#
# 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 family which has been returned.
#
#
# AUTHOR
#
#  Steve Kemp  <steve@bytemark.co.uk>
#


require 'getoptlong'
require 'custodian/util/ping'



#
#  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' then
      $help = true
    when '--manual' then
      $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


#
#  Abort if we don't have a hostname
#
if ( hostname.nil? )
  puts "Usage: #{$PROGRAM_NAME} hostname"
  exit 1
end



#
#  Create the object
#
helper = Custodian::Util::Ping.new( hostname )


#
#  Ping the host, via the helper
#
if ( helper.run_ping )
  puts "#{hostname} - #{helper.address} - is alive."
  exit 0
else
  exit 1
end