summaryrefslogtreecommitdiff
path: root/lib/custodian/protocoltest/ping.rb
blob: 765540c5aaebdf953e6af773ef1fa48cc7190814 (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
130
131
132
133
134
require 'custodian/testfactory.rb'


#
#  The ping test.
#
#  This object is instantiated if the parser sees a line such as:
#
###
### DNSHOSTS must run ping otherwise ..
###
#
#
module Custodian
  module ProtocolTest

    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
  end
end