Class: SendNsca::NscaConnection

Inherits:
Object
  • Object
show all
Defined in:
lib/send_nsca/send_nsca.rb

Constant Summary collapse

PACKET_VERSION =
3
PACK_STRING =
"nxx N a4 n a64 a128 a512xx"
CRC_TABLE =
[ 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d]

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(args) ⇒ NscaConnection

Returns a new instance of NscaConnection.



58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/send_nsca/send_nsca.rb', line 58

def initialize(args)
  # connecting to nagios
  @nscahost = args[:nscahost]
  @port = args[:port]
  @hostname = args[:hostname]
  @service = args[:service]
  @return_code = args[:return_code]
  @status = args[:status]
  @connected = false
  @password = args[:password] || ''
  @timeout = args[:nscatimeout] || 1
  @encryption_mode = args[:encryption_mode] || SendNsca::XOR
  @debug = args[:debug] || false
end

Instance Attribute Details

#connectedObject (readonly)

connection status and error if one found



23
24
25
# File 'lib/send_nsca/send_nsca.rb', line 23

def connected
  @connected
end

#crcObject

for sending to nsca



52
53
54
# File 'lib/send_nsca/send_nsca.rb', line 52

def crc
  @crc
end

#debugObject

debug



49
50
51
# File 'lib/send_nsca/send_nsca.rb', line 49

def debug
  @debug
end

#encryption_modeObject

encryption_mode



38
39
40
# File 'lib/send_nsca/send_nsca.rb', line 38

def encryption_mode
  @encryption_mode
end

#errorObject (readonly)

Returns the value of attribute error.



24
25
26
# File 'lib/send_nsca/send_nsca.rb', line 24

def error
  @error
end

#hostnameObject

status data to send to nagios Currently all 4 are required, meaning we only support ‘service’ passive checkins. todo: add host checkins



43
44
45
# File 'lib/send_nsca/send_nsca.rb', line 43

def hostname
  @hostname
end

#nscahostObject

params for connecting to the nsca/nagios server



19
20
21
# File 'lib/send_nsca/send_nsca.rb', line 19

def nscahost
  @nscahost
end

#nscatimeoutObject

Returns the value of attribute nscatimeout.



16
17
18
# File 'lib/send_nsca/send_nsca.rb', line 16

def nscatimeout
  @nscatimeout
end

#portObject

Returns the value of attribute port.



20
21
22
# File 'lib/send_nsca/send_nsca.rb', line 20

def port
  @port
end

#return_codeObject

Returns the value of attribute return_code.



45
46
47
# File 'lib/send_nsca/send_nsca.rb', line 45

def return_code
  @return_code
end

#serviceObject

Returns the value of attribute service.



44
45
46
# File 'lib/send_nsca/send_nsca.rb', line 44

def service
  @service
end

#statusObject

Returns the value of attribute status.



46
47
48
# File 'lib/send_nsca/send_nsca.rb', line 46

def status
  @status
end

#timestampObject

Returns the value of attribute timestamp.



35
36
37
# File 'lib/send_nsca/send_nsca.rb', line 35

def timestamp
  @timestamp
end

#timestamp_hexObject

Returns the value of attribute timestamp_hex.



34
35
36
# File 'lib/send_nsca/send_nsca.rb', line 34

def timestamp_hex
  @timestamp_hex
end

#timestringObject

Returns the value of attribute timestring.



33
34
35
# File 'lib/send_nsca/send_nsca.rb', line 33

def timestring
  @timestring
end

#xor_keyObject

Returns the value of attribute xor_key.



32
33
34
# File 'lib/send_nsca/send_nsca.rb', line 32

def xor_key
  @xor_key
end

#xor_key_and_timestampObject

read from the nsca/nagios server



27
28
29
# File 'lib/send_nsca/send_nsca.rb', line 27

def xor_key_and_timestamp
  @xor_key_and_timestamp
end

#xor_key_and_timestamp_strObject

converted from :xor_key_and_timestamp



30
31
32
# File 'lib/send_nsca/send_nsca.rb', line 30

def xor_key_and_timestamp_str
  @xor_key_and_timestamp_str
end

#xor_key_stringObject

Returns the value of attribute xor_key_string.



31
32
33
# File 'lib/send_nsca/send_nsca.rb', line 31

def xor_key_string
  @xor_key_string
end

Class Method Details

.crc32(c) ⇒ Object



151
152
153
154
155
156
157
158
159
160
# File 'lib/send_nsca/send_nsca.rb', line 151

def self.crc32(c)
    r = 0xFFFFFFFF
    c.each_byte do |b|
        r ^= b
        8.times do
          r = (r>>1) ^ (0xEDB88320 * (r & 1))
        end
    end
    r ^ 0xFFFFFFFF
end

.xor(iv, str, password = '') ⇒ Object



162
163
164
165
166
167
168
169
170
171
172
173
174
175
# File 'lib/send_nsca/send_nsca.rb', line 162

def self.xor(iv, str, password='')
  
  str_a = str.unpack("C*")
  iv_a = iv.unpack("C*")
  password_a = password.unpack("C*")
  result = []

  str_a.each_with_index do |c, i|
    result[i] = c ^ iv_a[i % iv_a.size]
    result[i] ^= password_a[i % password_a.size] unless password_a.empty?
  end

  ret_val = result.pack("C*")
end

Instance Method Details

#connect_and_get_keysObject



73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# File 'lib/send_nsca/send_nsca.rb', line 73

def connect_and_get_keys
  begin
    Timeout.timeout(@timeout) do # the server has @timeout second(s) to answer
      @tcp_client = TCPSocket.open(@nscahost, @port)
      @connected = true
      @xor_key_and_timestamp = @tcp_client.recv(132)
    end
  rescue
    @connected = false
    @error = "send_ncsa - error connecting to nsca/nagios: #{$!}"
    puts @error
    @tcp_client.try(:close) unless @tcp_client.nil?
    raise # re-raise same exception
  end
  timestamp_for_logging
end

#convert_timestampObject



90
91
92
93
# File 'lib/send_nsca/send_nsca.rb', line 90

def convert_timestamp
  # convert timestamp for use in comm to nagios
  @timestring = @xor_key_and_timestamp[@xor_key_and_timestamp.length-4,@xor_key_and_timestamp.length]
end

#convert_xor_keyObject



103
104
105
106
# File 'lib/send_nsca/send_nsca.rb', line 103

def convert_xor_key
  # strip off the last 4 characters which are the timestamp
  @xor_key = @xor_key_and_timestamp[0,@xor_key_and_timestamp.length-4]
end

#intialize_nsca_connectionObject



108
109
110
111
112
# File 'lib/send_nsca/send_nsca.rb', line 108

def intialize_nsca_connection
  connect_and_get_keys
  convert_timestamp
  convert_xor_key
end

#send_nscaObject



114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
# File 'lib/send_nsca/send_nsca.rb', line 114

def send_nsca
  intialize_nsca_connection
  @crc = 0 
  nsca_params = [PACKET_VERSION, @crc, @timestring, @return_code, @hostname, @service, @status ]
  string_to_send_without_crc = nsca_params.pack(PACK_STRING)
  
  @crc = SendNsca::NscaConnection.crc32(string_to_send_without_crc)
  nsca_params = [PACKET_VERSION, @crc, @timestring, @return_code, @hostname, @service, @status ]
  string_to_send_with_crc = nsca_params.pack(PACK_STRING)

  if @debug
    puts %{DEBUG: PACKET_VERSION = #{PACKET_VERSION}
@crc = #{@crc}
@timestring = #{@timestring}
@timestamp_hex = #{Time.at(timestamp_hex)}
@return_code #{@return_code}
@hostname = #{@hostname}
@service = #{@service}
@status = #{@status}}
    puts "string_to_send_with_crc = #{string_to_send_with_crc.length}"
    puts "string_to_send_with_crc = #{string_to_send_with_crc.unpack('H*')}"
  end

  if @encryption_mode == SendNsca::NONE
    string_to_send = string_to_send_with_crc
  else
    string_to_send = SendNsca::NscaConnection.xor(@xor_key, string_to_send_with_crc, @password)
    if @debug
      puts "encrypted_string_to_send = #{string_to_send.length}"
      puts "encrypted_string_to_send = #{string_to_send.unpack('H*')}"
    end
  end

  @tcp_client.send(string_to_send, 0)
  @tcp_client.close
end

#timestamp_for_loggingObject



95
96
97
98
99
100
101
# File 'lib/send_nsca/send_nsca.rb', line 95

def timestamp_for_logging
  # convert timestamp in a format we can log
  @xor_key_and_timestamp_str = @xor_key_and_timestamp.unpack("H*")
  @timestring_for_log = @xor_key_and_timestamp_str[0][256,8]
  @timestamp_hex = @timestring_for_log.hex
  @timestamp = Time.at(@timestamp_hex)
end