riemann-client 0.2.5 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,9 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'socket'
2
4
  require 'fcntl'
3
5
 
4
6
  module Riemann
5
7
  class Client
6
- # Socket: A specialized socket that has been configure
8
+ # Socket: A specialized socket that has been configure
7
9
  class TcpSocket
8
10
  class Error < Riemann::Client::Error; end
9
11
  class Timeout < Error; end
@@ -68,7 +70,6 @@ module Riemann
68
70
  # connection dead and notifying the application layer.
69
71
  attr_reader :keepalive_count
70
72
 
71
-
72
73
  # Internal: Create and connect to the given location.
73
74
  #
74
75
  # options, same as Constructor
@@ -77,11 +78,11 @@ module Riemann
77
78
  def self.connect(options = {})
78
79
  s = new(options)
79
80
  s.connect
80
- return s
81
+ s
81
82
  end
82
83
 
83
84
  # Internal: Creates a new KJess::Socket
84
- def initialize( options = {} )
85
+ def initialize(options = {})
85
86
  @host = options[:host]
86
87
  @port = options[:port]
87
88
 
@@ -107,27 +108,29 @@ module Riemann
107
108
  # Using the options from the initializer, a new ::Socket is created that
108
109
  # is:
109
110
  #
110
- # TCP, IPv4 only, autoclosing on exit, nagle's algorithm is disabled and has
111
+ # TCP, autoclosing on exit, nagle's algorithm is disabled and has
111
112
  # TCP Keepalive options set if keepalive is supported.
112
113
  #
113
- # Returns a new ::Socket instance
114
- def blank_socket
115
- sock = ::Socket.new(::Socket::AF_INET, ::Socket::SOCK_STREAM, 0)
114
+ # Returns a new ::Socket instance for
116
115
 
117
- # close file descriptors if we exec
118
- sock.fcntl(Fcntl::F_SETFD, Fcntl::FD_CLOEXEC)
116
+ def socket_factory(type)
117
+ sock = ::Socket.new(type, ::Socket::SOCK_STREAM, 0)
119
118
 
119
+ # close file descriptors if we exec
120
+ if Fcntl.constants.include?(:F_SETFD) && Fcntl.constants.include?(:FD_CLOEXEC)
121
+ sock.fcntl(Fcntl::F_SETFD, Fcntl::FD_CLOEXEC)
122
+ end
120
123
  # Disable Nagle's algorithm
121
124
  sock.setsockopt(::Socket::IPPROTO_TCP, ::Socket::TCP_NODELAY, 1)
122
125
 
123
- if using_keepalive? then
124
- sock.setsockopt(::Socket::SOL_SOCKET, ::Socket::SO_KEEPALIVE , true)
125
- sock.setsockopt(::Socket::SOL_TCP, ::Socket::TCP_KEEPIDLE , keepalive_idle)
126
+ if using_keepalive?
127
+ sock.setsockopt(::Socket::SOL_SOCKET, ::Socket::SO_KEEPALIVE, true)
128
+ sock.setsockopt(::Socket::SOL_TCP, ::Socket::TCP_KEEPIDLE, keepalive_idle)
126
129
  sock.setsockopt(::Socket::SOL_TCP, ::Socket::TCP_KEEPINTVL, keepalive_interval)
127
- sock.setsockopt(::Socket::SOL_TCP, ::Socket::TCP_KEEPCNT , keepalive_count)
130
+ sock.setsockopt(::Socket::SOL_TCP, ::Socket::TCP_KEEPCNT, keepalive_count)
128
131
  end
129
132
 
130
- return sock
133
+ sock
131
134
  end
132
135
 
133
136
  # Internal: Return the connected raw Socket.
@@ -137,7 +140,8 @@ module Riemann
137
140
  # Returns a ::Socket
138
141
  def socket
139
142
  return @socket unless closed?
140
- @socket ||= connect()
143
+
144
+ @socket ||= connect
141
145
  end
142
146
 
143
147
  # Internal: Closes the internal ::Socket
@@ -152,7 +156,8 @@ module Riemann
152
156
  def closed?
153
157
  return true if @socket.nil?
154
158
  return true if @socket.closed?
155
- return false
159
+
160
+ false
156
161
  end
157
162
 
158
163
  # Internal:
@@ -166,16 +171,17 @@ module Riemann
166
171
  # Calculate our timeout deadline
167
172
  deadline = Time.now.to_f + connect_timeout
168
173
 
169
- # Lookup destination address, we only want IPv4 , TCP
170
- addrs = ::Socket.getaddrinfo(host, port, ::Socket::AF_INET, ::Socket::SOCK_STREAM )
174
+ # Lookup destination address, we only want TCP.
175
+ addrs = ::Socket.getaddrinfo(host, port, nil, ::Socket::SOCK_STREAM)
171
176
  errors = []
172
- conn_error = lambda { raise errors.first }
177
+ conn_error = -> { raise errors.first }
173
178
  sock = nil
174
179
 
175
- addrs.find( conn_error ) do |addr|
176
- sock = connect_or_error( addr, deadline, errors )
180
+ # Sort it so we get AF_INET, IPv4
181
+ addrs.sort.find(conn_error) do |addr|
182
+ sock = connect_or_error(addr, deadline, errors)
177
183
  end
178
- return sock
184
+ sock
179
185
  end
180
186
 
181
187
  # Internal: Connect to the destination or raise an error.
@@ -192,13 +198,14 @@ module Riemann
192
198
  # Should the connection fail, append the exception to the errors array and
193
199
  # return false.
194
200
  #
195
- def connect_or_error( addr, deadline, errors )
201
+ def connect_or_error(addr, deadline, errors)
196
202
  timeout = deadline - Time.now.to_f
197
203
  raise Timeout, "Could not connect to #{host}:#{port}" if timeout <= 0
198
- return connect_nonblock( addr, timeout )
204
+
205
+ connect_nonblock(addr, timeout)
199
206
  rescue Error => e
200
207
  errors << e
201
- return false
208
+ false
202
209
  end
203
210
 
204
211
  # Internal: Connect to the give address within the timeout.
@@ -207,36 +214,47 @@ module Riemann
207
214
  #
208
215
  # Return the ::Socket when it is connected, or raise an Error if no
209
216
  # connection was possible.
210
- def connect_nonblock( addr, timeout )
217
+ def connect_nonblock(addr, timeout)
211
218
  sockaddr = ::Socket.pack_sockaddr_in(addr[1], addr[3])
212
- sock = blank_socket()
213
- sock.connect_nonblock( sockaddr )
214
- return sock
219
+ sock = socket_factory(addr[4])
220
+ sock.connect_nonblock(sockaddr)
221
+ sock
215
222
  rescue Errno::EINPROGRESS
216
223
  if IO.select(nil, [sock], nil, timeout).nil?
217
- sock.close rescue nil
224
+ begin
225
+ sock.close
226
+ rescue StandardError
227
+ nil
228
+ end
218
229
  raise Timeout, "Could not connect to #{host}:#{port} within #{timeout} seconds"
219
230
  end
220
- return connect_nonblock_finalize( sock, sockaddr )
221
- rescue => ex
222
- sock.close rescue nil
223
- raise Error, "Could not connect to #{host}:#{port}: #{ex.class}: #{ex.message}", ex.backtrace
231
+ connect_nonblock_finalize(sock, sockaddr)
232
+ rescue StandardError => e
233
+ begin
234
+ sock.close
235
+ rescue StandardError
236
+ nil
237
+ end
238
+ raise Error, "Could not connect to #{host}:#{port}: #{e.class}: #{e.message}", e.backtrace
224
239
  end
225
240
 
226
-
227
241
  # Internal: Make sure that a non-blocking connect has truely connected.
228
242
  #
229
243
  # Ensure that the given socket is actually connected to the given adddress.
230
244
  #
231
245
  # Returning the socket if it is and raising an Error if it isn't.
232
- def connect_nonblock_finalize( sock, sockaddr )
233
- sock.connect_nonblock( sockaddr )
234
- return sock
246
+ def connect_nonblock_finalize(sock, sockaddr)
247
+ sock.connect_nonblock(sockaddr)
248
+ sock
235
249
  rescue Errno::EISCONN
236
- return sock
237
- rescue => ex
238
- sock.close rescue nil
239
- raise Error, "Could not connect to #{host}:#{port}: #{ex.class}: #{ex.message}", ex.backtrace
250
+ sock
251
+ rescue StandardError => e
252
+ begin
253
+ sock.close
254
+ rescue StandardError
255
+ nil
256
+ end
257
+ raise Error, "Could not connect to #{host}:#{port}: #{e.class}: #{e.message}", e.backtrace
240
258
  end
241
259
 
242
260
  # Internal: say if we are using TCP Keep Alive or not
@@ -252,12 +270,12 @@ module Riemann
252
270
  # Returns true or false
253
271
  def using_keepalive?
254
272
  using = false
255
- if keepalive_active? then
256
- using = [ :SOL_SOCKET, :SO_KEEPALIVE, :SOL_TCP, :TCP_KEEPIDLE, :TCP_KEEPINTVL, :TCP_KEEPCNT].all? do |c|
273
+ if keepalive_active?
274
+ using = %i[SOL_SOCKET SO_KEEPALIVE SOL_TCP TCP_KEEPIDLE TCP_KEEPINTVL TCP_KEEPCNT].all? do |c|
257
275
  ::Socket.const_defined? c
258
276
  end
259
277
  end
260
- return using
278
+ using
261
279
  end
262
280
 
263
281
  # Reads length bytes from the socket
@@ -271,18 +289,18 @@ module Riemann
271
289
  outbuf.replace('')
272
290
  buf = outbuf
273
291
  else
274
- buf = ''
292
+ buf = String.new
275
293
  end
276
294
 
277
295
  while buf.length < length
278
- unless rb = readpartial(length - buf.length)
296
+ unless (rb = readpartial(length - buf.length))
279
297
  break
280
298
  end
281
299
 
282
300
  buf << rb
283
301
  end
284
302
 
285
- return buf
303
+ buf
286
304
  end
287
305
 
288
306
  # Internal: Read up to a maxlen of data from the socket and store it in outbuf
@@ -292,13 +310,13 @@ module Riemann
292
310
  #
293
311
  # Returns the bytes read
294
312
  def readpartial(maxlen, outbuf = nil)
295
- return socket.read_nonblock(maxlen, outbuf)
313
+ socket.read_nonblock(maxlen, outbuf)
296
314
  rescue Errno::EWOULDBLOCK, Errno::EAGAIN, Errno::ECONNRESET
297
- if wait_readable(read_timeout)
298
- retry
299
- else
315
+ unless wait_readable(read_timeout)
300
316
  raise Timeout, "Could not read from #{host}:#{port} in #{read_timeout} seconds"
301
317
  end
318
+
319
+ retry
302
320
  end
303
321
 
304
322
  # Internal: Write the given data to the socket
@@ -310,16 +328,16 @@ module Riemann
310
328
  #
311
329
  # returns nothing
312
330
  def write(buf)
313
- until buf.nil? or (buf.length == 0) do
331
+ until buf.nil? || buf.length.zero?
314
332
  written = socket.write_nonblock(buf)
315
333
  buf = buf[written, buf.length]
316
334
  end
317
335
  rescue Errno::EWOULDBLOCK, Errno::EINTR, Errno::EAGAIN, Errno::ECONNRESET
318
- if wait_writable(write_timeout)
319
- retry
320
- else
336
+ unless wait_writable(write_timeout)
321
337
  raise Timeout, "Could not write to #{host}:#{port} in #{write_timeout} seconds"
322
338
  end
339
+
340
+ retry
323
341
  end
324
342
 
325
343
  def wait_writable(timeout = nil)
@@ -331,4 +349,4 @@ module Riemann
331
349
  end
332
350
  end
333
351
  end
334
- end
352
+ end
@@ -1,11 +1,13 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Riemann
2
4
  class Client
3
5
  class UDP < Client
4
- MAX_SIZE = 16384
6
+ MAX_SIZE = 16_384
5
7
 
6
8
  attr_accessor :host, :port, :max_size
7
9
 
8
- def initialize(opts = {})
10
+ def initialize(opts = {}) # rubocop:disable Lint/MissingSuper
9
11
  @host = opts[:host] || HOST
10
12
  @port = opts[:port] || PORT
11
13
  @max_size = opts[:max_size] || MAX_SIZE
@@ -13,6 +15,7 @@ module Riemann
13
15
 
14
16
  def socket
15
17
  return @socket if connected?
18
+
16
19
  @socket = UDPSocket.new
17
20
  end
18
21
 
@@ -26,17 +29,18 @@ module Riemann
26
29
  end
27
30
 
28
31
  # Read a message from a stream
29
- def read_message(s)
32
+ def read_message(_socket)
30
33
  raise Unsupported
31
34
  end
32
35
 
33
- def send_recv(*a)
36
+ def send_recv(_message)
34
37
  raise Unsupported
35
38
  end
36
39
 
37
40
  def send_maybe_recv(message)
38
41
  encoded_string = message.encode.to_s
39
42
  raise TooBig unless encoded_string.length < @max_size
43
+
40
44
  socket.send(encoded_string, 0, @host, @port)
41
45
  nil
42
46
  end
@@ -1,104 +1,110 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'riemann'
2
4
 
3
- class Riemann::Client
4
- class Error < RuntimeError; end
5
- class InvalidResponse < Error; end
6
- class ServerError < Error; end
7
- class Unsupported < Error; end
8
- class TooBig < Unsupported; end
5
+ module Riemann
6
+ class Client
7
+ class Error < RuntimeError; end
8
+ class InvalidResponse < Error; end
9
+ class ServerError < Error; end
10
+ class Unsupported < Error; end
11
+ class TooBig < Unsupported; end
9
12
 
10
- require 'thread'
11
- require 'socket'
12
- require 'time'
13
+ require 'socket'
14
+ require 'time'
13
15
 
14
- HOST = '127.0.0.1'
15
- PORT = 5555
16
- TIMEOUT = 5
16
+ HOST = '127.0.0.1'
17
+ PORT = 5555
18
+ TIMEOUT = 5
17
19
 
18
- require 'riemann/client/tcp'
19
- require 'riemann/client/udp'
20
+ require 'riemann/client/tcp'
21
+ require 'riemann/client/udp'
20
22
 
21
- attr_reader :tcp, :udp
23
+ attr_reader :tcp, :udp
22
24
 
23
- def initialize(opts = {})
24
- @options = opts.dup
25
- @options[:host] ||= HOST
26
- @options[:port] ||= PORT
27
- @options[:timeout] ||= TIMEOUT
25
+ def initialize(opts = {})
26
+ @options = opts.dup
27
+ @options[:host] ||= HOST
28
+ @options[:port] ||= PORT
29
+ @options[:timeout] ||= TIMEOUT
28
30
 
29
- @udp = UDP.new(@options)
30
- @tcp = TCP.new(@options)
31
- end
31
+ @udp = UDP.new(@options)
32
+ @tcp = TCP.new(@options)
33
+ return unless block_given?
32
34
 
33
- def host
34
- @options[:host]
35
- end
35
+ begin
36
+ yield self
37
+ ensure
38
+ close
39
+ end
40
+ end
36
41
 
37
- def port
38
- @options[:port]
39
- end
42
+ def host
43
+ @options[:host]
44
+ end
40
45
 
41
- def timeout
42
- @options[:timeout]
43
- end
46
+ def port
47
+ @options[:port]
48
+ end
44
49
 
45
- # Send a state
46
- def <<(event_opts)
47
- # Create state
48
- case event_opts
49
- when Riemann::State
50
- event = event_opts
51
- when Riemann::Event
52
- event = event_opts
53
- else
54
- unless event_opts.include? :host
55
- event_opts[:host] = Socket.gethostname
56
- end
57
- event = Riemann::Event.new(event_opts)
50
+ def timeout
51
+ @options[:timeout]
58
52
  end
59
53
 
60
- message = Riemann::Message.new :events => [event]
54
+ # Send a state
55
+ def <<(event_opts)
56
+ # Create state
57
+ case event_opts
58
+ when Riemann::State
59
+ event = event_opts
60
+ when Riemann::Event
61
+ event = event_opts
62
+ else
63
+ event_opts[:host] = Socket.gethostname unless event_opts.include? :host
64
+ event = Riemann::Event.new(event_opts)
65
+ end
61
66
 
62
- # Transmit
63
- send_maybe_recv message
64
- end
67
+ message = Riemann::Message.new events: [event]
65
68
 
66
- # Returns an array of states matching query.
67
- def [](query)
68
- response = query(query)
69
- (response.events || []) |
70
- (response.states || [])
71
- end
69
+ # Transmit
70
+ send_maybe_recv message
71
+ end
72
72
 
73
- def connect
74
- # NOTE: connections are made automatically on send
75
- warn "Riemann client#connect is deprecated"
76
- end
73
+ # Returns an array of states matching query.
74
+ def [](query)
75
+ response = query(query)
76
+ (response.events || []) |
77
+ (response.states || [])
78
+ end
77
79
 
78
- # Close both UDP and TCP sockets.
79
- def close
80
- @udp.close
81
- @tcp.close
82
- end
80
+ def connect
81
+ # NOTE: connections are made automatically on send
82
+ warn 'Riemann client#connect is deprecated'
83
+ end
83
84
 
84
- def connected?
85
- tcp.connected? and udp.connected?
86
- end
85
+ # Close both UDP and TCP sockets.
86
+ def close
87
+ @udp.close
88
+ @tcp.close
89
+ end
87
90
 
88
- # Ask for states
89
- def query(string = "true")
90
- send_recv Riemann::Message.new(:query => Riemann::Query.new(:string => string))
91
- end
91
+ def connected?
92
+ tcp.connected? and udp.connected?
93
+ end
92
94
 
93
- def send_recv(*a)
94
- @tcp.send_recv *a
95
- end
95
+ # Ask for states
96
+ def query(string = 'true')
97
+ send_recv Riemann::Message.new(query: Riemann::Query.new(string: string))
98
+ end
99
+
100
+ def send_recv(message)
101
+ @tcp.send_recv(message)
102
+ end
96
103
 
97
- def send_maybe_recv(*a)
98
- begin
99
- @udp.send_maybe_recv *a
104
+ def send_maybe_recv(message)
105
+ @udp.send_maybe_recv(message)
100
106
  rescue TooBig
101
- @tcp.send_maybe_recv *a
107
+ @tcp.send_maybe_recv(*a)
102
108
  end
103
109
  end
104
110
  end