summaryrefslogtreecommitdiff
path: root/lib/custodian/protocoltest/ping.rb
blob: cd8490deaa0e9fdc97dd5a09f9d7ac89afa65d5c (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
require 'custodian/testfactory.rb'


#
#  The ping test.
#
#  This object is instantiated if the parser sees a line such as:
#
###
### DNSHOSTS must run ping otherwise ..
###
#
#
class PINGTest < TestFactory


  #
  # The line from which we were constructed.
  #
  attr_reader :line


  #
  # The host to test against.
  #
  attr_reader :host




  #
  # Constructor
  #
  def initialize( line )

    #
    #  Save the line
    #
    @line = line

    #
    # Save the host
    #
    @host  = line.split( /\s+/)[0]
  end




  #
  # Helper for development.
  #
  def to_s
    "ping-test - #{@host}."
  end




  #
  # Convert this class to JSON such that it may be serialized.
  #
  def to_json
    hash = { :line => @line }
    hash.to_json
  end



  #
  # Run the test.
  #
  def run_test

    #
    # Find the binary we're going to invoke.
    #
    binary = nil
    binary = "/usr/bin/multi-ping"  if ( File.exists?( "/usr/bin/multi-ping" ) )

    if ( binary.nil? )
      @error = "Failed to find '/usr/bin/multi-ping'"
      return false
    end


    #
    # Sanity check the hostname for ping-tests, to
    # avoid this security hole:
    #
    #   $(/tmp/exploit.sh) must run ping ..
    #
    if ( @host !~ /^([a-zA-Z0-9:\-\.]+)$/ )
      @error = "Invalid hostname for ping-test: #{@host}"
      return false
    end


    #
    # Run the test.
    #
    if ( system( "#{binary} #{host}" ) == true )
      return true
    else
      @error = "Ping failed."
      return false
    end

  end




  #
  # If the test fails then report the error.
  #
  def error
    @error
  end




  register_test_type "ping"




end