riemann-client 0.2.5 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 395c52ac148f9988953268a74e1e747c415e3b80c75e7e0cfef536d7f44a2d36
4
+ data.tar.gz: 81051904aef015898e9abde73a6bdf2cde446cec0ed8712b0a2cd569d1a62f50
5
+ SHA512:
6
+ metadata.gz: d016e54a3881d70914163c88506da3936f47c6c3390f092eb1a2a179c1cd1034984337d81ecbbefdcef01019efa168f8d93662918c67125f31245cffa471b1f5
7
+ data.tar.gz: 330ea26290403c97dd44ac1b0d04b72ea9bebd27a147f00c0135ce9d46a09c01c4f8271daaa3c118a2feeebb84603d6dde77066ee5a994e6c7c32e8e2eb1c89a
@@ -0,0 +1,58 @@
1
+ ---
2
+ name: CI
3
+
4
+ on:
5
+ push:
6
+ branches:
7
+ - main
8
+ pull_request:
9
+ branches:
10
+ - main
11
+
12
+ jobs:
13
+ lint:
14
+ runs-on: ubuntu-latest
15
+ steps:
16
+ - uses: actions/checkout@v2
17
+ - name: Setup ruby
18
+ uses: ruby/setup-ruby@v1
19
+ with:
20
+ ruby-version: '2.7'
21
+ bundler-cache: true
22
+ - name: Run rubocop
23
+ run: bundle exec rubocop
24
+ test:
25
+ needs: lint
26
+ runs-on: ubuntu-latest
27
+ strategy:
28
+ matrix:
29
+ ruby-version:
30
+ - 2.6
31
+ - 2.7
32
+ - 3.0
33
+ - 3.1
34
+ steps:
35
+ - uses: actions/checkout@v2
36
+ - name: Setup Ruby
37
+ uses: ruby/setup-ruby@v1
38
+ with:
39
+ ruby-version: ${{ matrix.ruby-version }}
40
+ bundler-cache: true
41
+ - name: Install riemann
42
+ run: |
43
+ wget --quiet https://github.com/riemann/riemann/releases/download/0.3.8/riemann_0.3.8_all.deb
44
+ sudo dpkg -i riemann_0.3.8_all.deb
45
+
46
+ sudo systemctl stop riemann
47
+
48
+ sudo openssl genrsa -out /etc/riemann/riemann_server.key 4096
49
+ sudo openssl pkcs8 -topk8 -nocrypt -in /etc/riemann/riemann_server.key -out /etc/riemann/riemann_server.pkcs8
50
+ sudo openssl req -x509 -new -nodes -key /etc/riemann/riemann_server.key -days 7 -out /etc/riemann/riemann_server.crt -subj '/CN=localhost'
51
+ sudo chmod +r /etc/riemann/riemann_server.pkcs8
52
+ sudo cp -v spec/riemann.config /etc/riemann/
53
+
54
+ sudo systemctl start riemann
55
+
56
+ while ! nc -z localhost 5555; do sleep 1; done
57
+ - name: Run the test suite
58
+ run: bundle exec bacon spec/*.rb
data/.gitignore ADDED
@@ -0,0 +1,10 @@
1
+ pkg/
2
+ ._*
3
+ *~
4
+ .DS_Store
5
+ .*.swp
6
+ *.log
7
+ .bundle/
8
+ bin/
9
+ vendor/
10
+ Gemfile.lock
data/.rubocop.yml ADDED
@@ -0,0 +1,18 @@
1
+ ---
2
+ Metrics/AbcSize:
3
+ Enabled: false
4
+ Metrics/BlockLength:
5
+ Enabled: false
6
+ Metrics/ClassLength:
7
+ Enabled: false
8
+ Metrics/CyclomaticComplexity:
9
+ Enabled: false
10
+ Metrics/MethodLength:
11
+ Enabled: false
12
+ Metrics/PerceivedComplexity:
13
+ Enabled: false
14
+ Naming/VariableNumber:
15
+ AllowedIdentifiers:
16
+ - TLSv1_2
17
+ Style/Documentation:
18
+ Enabled: false
data/CHANGELOG.md ADDED
@@ -0,0 +1,84 @@
1
+ # Changelog
2
+
3
+ ## [1.0.1](https://github.com/riemann/riemann-ruby-client/tree/1.0.1) (2022-06-25)
4
+
5
+ [Full Changelog](https://github.com/riemann/riemann-ruby-client/compare/v1.0.0...1.0.1)
6
+
7
+ **Merged pull requests:**
8
+
9
+ - Setup Rubocop and lower required Ruby version [\#37](https://github.com/riemann/riemann-ruby-client/pull/37) ([smortex](https://github.com/smortex))
10
+
11
+ ## [v1.0.0](https://github.com/riemann/riemann-ruby-client/tree/v1.0.0) (2022-06-16)
12
+
13
+ [Full Changelog](https://github.com/riemann/riemann-ruby-client/compare/0.2.6...v1.0.0)
14
+
15
+ **Implemented enhancements:**
16
+
17
+ - Add support for micro-seconds resolution [\#34](https://github.com/riemann/riemann-ruby-client/pull/34) ([smortex](https://github.com/smortex))
18
+ - Add support for TLS [\#33](https://github.com/riemann/riemann-ruby-client/pull/33) ([smortex](https://github.com/smortex))
19
+ - Add support for IPv6 addresses [\#30](https://github.com/riemann/riemann-ruby-client/pull/30) ([dch](https://github.com/dch))
20
+
21
+ **Merged pull requests:**
22
+
23
+ - Fix race conditions in CI [\#35](https://github.com/riemann/riemann-ruby-client/pull/35) ([smortex](https://github.com/smortex))
24
+ - Modernize and setup CI [\#32](https://github.com/riemann/riemann-ruby-client/pull/32) ([smortex](https://github.com/smortex))
25
+ - Bump beefcake dependency [\#29](https://github.com/riemann/riemann-ruby-client/pull/29) ([dch](https://github.com/dch))
26
+
27
+ ## [0.2.6](https://github.com/riemann/riemann-ruby-client/tree/0.2.6) (2015-11-18)
28
+
29
+ [Full Changelog](https://github.com/riemann/riemann-ruby-client/compare/0.2.5...0.2.6)
30
+
31
+ **Merged pull requests:**
32
+
33
+ - Client should yield self [\#22](https://github.com/riemann/riemann-ruby-client/pull/22) ([agile](https://github.com/agile))
34
+ - Allow TCP sockets to work on Windows [\#21](https://github.com/riemann/riemann-ruby-client/pull/21) ([sgran](https://github.com/sgran))
35
+ - README hash syntax fix [\#20](https://github.com/riemann/riemann-ruby-client/pull/20) ([squarism](https://github.com/squarism))
36
+
37
+ ## [0.2.5](https://github.com/riemann/riemann-ruby-client/tree/0.2.5) (2015-02-05)
38
+
39
+ [Full Changelog](https://github.com/riemann/riemann-ruby-client/compare/0.2.4...0.2.5)
40
+
41
+ ## [0.2.4](https://github.com/riemann/riemann-ruby-client/tree/0.2.4) (2015-02-03)
42
+
43
+ [Full Changelog](https://github.com/riemann/riemann-ruby-client/compare/0.2.2...0.2.4)
44
+
45
+ **Merged pull requests:**
46
+
47
+ - Tightening beefcake requirement [\#19](https://github.com/riemann/riemann-ruby-client/pull/19) ([aphyr](https://github.com/aphyr))
48
+ - Fix for \#17, plus test and connection refactor [\#18](https://github.com/riemann/riemann-ruby-client/pull/18) ([RKelln](https://github.com/RKelln))
49
+ - Ensure that we close the connection if we got an error back [\#16](https://github.com/riemann/riemann-ruby-client/pull/16) ([eric](https://github.com/eric))
50
+ - String\#clear doesn't exist in 1.8 [\#15](https://github.com/riemann/riemann-ruby-client/pull/15) ([eric](https://github.com/eric))
51
+ - Tcp client with timeouts [\#14](https://github.com/riemann/riemann-ruby-client/pull/14) ([eric](https://github.com/eric))
52
+
53
+ ## [0.2.2](https://github.com/riemann/riemann-ruby-client/tree/0.2.2) (2013-05-28)
54
+
55
+ [Full Changelog](https://github.com/riemann/riemann-ruby-client/compare/0.2.0...0.2.2)
56
+
57
+ **Merged pull requests:**
58
+
59
+ - Update README with timeout information [\#11](https://github.com/riemann/riemann-ruby-client/pull/11) ([gsandie](https://github.com/gsandie))
60
+ - Add tcp socket timeouts [\#10](https://github.com/riemann/riemann-ruby-client/pull/10) ([gsandie](https://github.com/gsandie))
61
+ - Socket can not be opened in method connected? [\#9](https://github.com/riemann/riemann-ruby-client/pull/9) ([vadv](https://github.com/vadv))
62
+
63
+ ## [0.2.0](https://github.com/riemann/riemann-ruby-client/tree/0.2.0) (2013-04-02)
64
+
65
+ [Full Changelog](https://github.com/riemann/riemann-ruby-client/compare/version-0.0.7...0.2.0)
66
+
67
+ **Merged pull requests:**
68
+
69
+ - Get and set attributes using hash-style accessors [\#8](https://github.com/riemann/riemann-ruby-client/pull/8) ([jegt](https://github.com/jegt))
70
+ - Add extra attributes added to the Event constructor to the event as Attribute instances [\#7](https://github.com/riemann/riemann-ruby-client/pull/7) ([jegt](https://github.com/jegt))
71
+ - Change attribute name to attribute key [\#6](https://github.com/riemann/riemann-ruby-client/pull/6) ([b](https://github.com/b))
72
+ - Arbitrary attributes on events [\#5](https://github.com/riemann/riemann-ruby-client/pull/5) ([b](https://github.com/b))
73
+
74
+ ## [version-0.0.7](https://github.com/riemann/riemann-ruby-client/tree/version-0.0.7) (2012-04-16)
75
+
76
+ [Full Changelog](https://github.com/riemann/riemann-ruby-client/compare/fe25a3b01681612defc39250006748069e06a172...version-0.0.7)
77
+
78
+ **Merged pull requests:**
79
+
80
+ - Add support for ruby 1.8 [\#1](https://github.com/riemann/riemann-ruby-client/pull/1) ([eric](https://github.com/eric))
81
+
82
+
83
+
84
+ \* *This Changelog was automatically generated by [github_changelog_generator](https://github.com/github-changelog-generator/github-changelog-generator)*
data/Gemfile ADDED
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://rubygems.org'
4
+
5
+ gemspec
6
+
7
+ gem 'github_changelog_generator'
data/README.markdown CHANGED
@@ -1,12 +1,16 @@
1
- Installing
2
- ==========
1
+ # Riemann Ruby Client
3
2
 
4
- gem install riemann-client
3
+ [![CI](https://github.com/riemann/riemann-ruby-client/actions/workflows/ci.yml/badge.svg)](https://github.com/riemann/riemann-ruby-client/actions/workflows/ci.yml)
5
4
 
6
- Use
7
- ===
5
+ ## Installing
8
6
 
9
- ``` ruby
7
+ ```shell
8
+ gem install riemann-client
9
+ ```
10
+
11
+ ## Use
12
+
13
+ ```ruby
10
14
  require 'riemann/client'
11
15
 
12
16
  # Create a client. Host, port and timeout are optional.
@@ -38,8 +42,8 @@ c['host =~ "%.dc1" and (state = "critical" or state = "warning")']
38
42
 
39
43
  ```
40
44
 
41
- Transports
42
- ==========
45
+ ## Transports
46
+
43
47
 
44
48
  Riemann::Client sends small events over UDP by default, and uses TCP for
45
49
  queries and large events. UDP sends are essentially "shouting into the void".
@@ -48,14 +52,13 @@ faster than TCP, but you will not know if the server is down or encountered an
48
52
  error. You can specify what transport to use by selecting a subclient:
49
53
 
50
54
  ``` ruby
51
- c.udp << { :state "ok" } # => nil
52
- c.tcp << { :state "ok" } # => #<Message ...>
55
+ c.udp << { :state => "ok" } # => nil
56
+ c.tcp << { :state => "ok" } # => #<Message ...>
53
57
  c.tcp["true"] # => [#<Event ... >, ...]
54
58
  c.udp["true"] # => raise Riemann::Client::Unsupported
55
59
  ```
56
60
 
57
- Client state management
58
- =======================
61
+ ## Client state management
59
62
 
60
63
  Riemann::Client provides some classes to make managing state updates easier.
61
64
 
@@ -64,3 +67,9 @@ be used to flush an accumulated value to ustate at regular intervals.
64
67
 
65
68
  Riemann::AutoState bundles a state and a client together. Any changes to the
66
69
  AutoState automatically send the new state to the client.
70
+
71
+ ## License
72
+
73
+ The MIT License
74
+
75
+ Copyright (c) 2011-2022 Kyle Kingsbury
data/Rakefile ADDED
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'riemann'
4
+
5
+ require 'bundler/gem_tasks'
6
+
7
+ require 'github_changelog_generator/task'
8
+
9
+ GitHubChangelogGenerator::RakeTask.new :changelog do |config|
10
+ config.user = 'riemann'
11
+ config.project = 'riemann-ruby-client'
12
+ config.exclude_labels = ['skip-changelog']
13
+ config.future_release = Riemann::VERSION
14
+ config.add_issues_wo_labels = false
15
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Riemann
2
4
  class Attribute
3
5
  include Beefcake::Message
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Riemann
2
4
  class AutoState
3
5
  # Binds together a state hash and a Client. Any change made here
@@ -40,7 +42,7 @@ module Riemann
40
42
  # @state.state = 'heavy lifting b'
41
43
  # ...
42
44
  # end
43
-
45
+
44
46
  def initialize(client = Client.new, state = {})
45
47
  @client = client
46
48
  @state = state
@@ -95,7 +97,11 @@ module Riemann
95
97
  def once(opts)
96
98
  o = @state.merge opts
97
99
  o[:time] = Time.now.to_i
98
- o[:tags] = ((o[:tags] | ["once"]) rescue ["once"])
100
+ o[:tags] = begin
101
+ (o[:tags] | ['once'])
102
+ rescue StandardError
103
+ ['once']
104
+ end
99
105
  @client << o
100
106
  end
101
107
 
@@ -111,7 +117,7 @@ module Riemann
111
117
  def service=(service)
112
118
  @state[:service] = service
113
119
  flush
114
- end
120
+ end
115
121
 
116
122
  def service
117
123
  @state[:service]
@@ -0,0 +1,92 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'openssl'
4
+ require_relative 'tcp_socket'
5
+
6
+ module Riemann
7
+ class Client
8
+ # Socket: A specialized socket that has been configure
9
+ class SSLSocket < TcpSocket
10
+ def initialize(options = {})
11
+ super(options)
12
+ @key_file = options[:key_file]
13
+ @cert_file = options[:cert_file]
14
+ @ca_file = options[:ca_file]
15
+ @ssl_verify = options[:ssl_verify]
16
+ end
17
+
18
+ def ssl_context
19
+ @ssl_context ||= OpenSSL::SSL::SSLContext.new.tap do |ctx|
20
+ ctx.key = OpenSSL::PKey::RSA.new(File.read(@key_file))
21
+ ctx.cert = OpenSSL::X509::Certificate.new(File.read(@cert_file))
22
+ ctx.ca_file = @ca_file if @ca_file
23
+ ctx.ssl_version = :TLSv1_2
24
+ ctx.verify_mode = OpenSSL::SSL::VERIFY_PEER if @ssl_verify
25
+ end
26
+ end
27
+
28
+ # Internal: Connect to the give address within the timeout.
29
+ #
30
+ # Make an attempt to connect to a single address within the given timeout.
31
+ #
32
+ # Return the ::Socket when it is connected, or raise an Error if no
33
+ # connection was possible.
34
+ def connect_nonblock(addr, timeout)
35
+ sock = super(addr, timeout)
36
+ ssl_socket = OpenSSL::SSL::SSLSocket.new(sock, ssl_context)
37
+ ssl_socket.sync = true
38
+
39
+ begin
40
+ ssl_socket.connect_nonblock
41
+ rescue IO::WaitReadable
42
+ unless IO.select([ssl_socket], nil, nil, timeout)
43
+ raise Timeout, "Could not read from #{host}:#{port} in #{timeout} seconds"
44
+ end
45
+
46
+ retry
47
+ rescue IO::WaitWritable
48
+ unless IO.select(nil, [ssl_socket], nil, timeout)
49
+ raise Timeout, "Could not write to #{host}:#{port} in #{timeout} seconds"
50
+ end
51
+
52
+ retry
53
+ end
54
+ ssl_socket
55
+ end
56
+
57
+ # Internal: Read up to a maxlen of data from the socket and store it in outbuf
58
+ #
59
+ # maxlen - the maximum number of bytes to read from the socket
60
+ # outbuf - the buffer in which to store the bytes.
61
+ #
62
+ # Returns the bytes read
63
+ def readpartial(maxlen, outbuf = nil)
64
+ super(maxlen, outbuf)
65
+ rescue OpenSSL::SSL::SSLErrorWaitReadable
66
+ unless wait_readable(read_timeout)
67
+ raise Timeout, "Could not read from #{host}:#{port} in #{read_timeout} seconds"
68
+ end
69
+
70
+ retry
71
+ end
72
+
73
+ # Internal: Write the given data to the socket
74
+ #
75
+ # buf - the data to write to the socket.
76
+ #
77
+ # Raises an error if it is unable to write the data to the socket within the
78
+ # write_timeout.
79
+ #
80
+ # returns nothing
81
+ def write(buf)
82
+ super(buf)
83
+ rescue OpenSSL::SSL::SSLErrorWaitWritable
84
+ unless wait_writable(write_timeout)
85
+ raise Timeout, "Could not write to #{host}:#{port} in #{write_timeout} seconds"
86
+ end
87
+
88
+ retry
89
+ end
90
+ end
91
+ end
92
+ end
@@ -1,32 +1,39 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'monitor'
2
4
  require 'riemann/client/tcp_socket'
5
+ require 'riemann/client/ssl_socket'
3
6
 
4
7
  module Riemann
5
8
  class Client
6
9
  class TCP < Client
7
- attr_accessor :host, :port, :socket
10
+ attr_accessor :host, :port
8
11
 
9
12
  # Public: Set a socket factory -- an object responding
10
13
  # to #call(options) that returns a Socket object
11
- def self.socket_factory=(factory)
12
- @socket_factory = factory
14
+ class << self
15
+ attr_writer :socket_factory
13
16
  end
14
17
 
15
18
  # Public: Return a socket factory
16
19
  def self.socket_factory
17
- @socket_factory || proc { |options| TcpSocket.connect(options) }
20
+ @socket_factory || proc { |options|
21
+ if options[:ssl]
22
+ SSLSocket.connect(options)
23
+ else
24
+ TcpSocket.connect(options)
25
+ end
26
+ }
18
27
  end
19
28
 
20
- def initialize(options = {})
29
+ def initialize(options = {}) # rubocop:disable Lint/MissingSuper
21
30
  @options = options
22
31
  @locket = Monitor.new
23
32
  end
24
33
 
25
34
  def socket
26
35
  @locket.synchronize do
27
- if @pid && @pid != Process.pid
28
- close
29
- end
36
+ close if @pid && @pid != Process.pid
30
37
 
31
38
  return @socket if connected?
32
39
 
@@ -51,32 +58,32 @@ module Riemann
51
58
  end
52
59
 
53
60
  # Read a message from a stream
54
- def read_message(s)
55
- if buffer = s.read(4) and buffer.size == 4
56
- length = buffer.unpack('N').first
57
- begin
58
- str = s.read length
59
- message = Riemann::Message.decode str
60
- rescue => e
61
- puts "Message was #{str.inspect}"
62
- raise
63
- end
61
+ def read_message(socket)
62
+ unless (buffer = socket.read(4)) && (buffer.size == 4)
63
+ raise InvalidResponse, 'unexpected EOF'
64
+ end
64
65
 
65
- unless message.ok
66
- puts "Failed"
67
- raise ServerError, message.error
68
- end
66
+ length = buffer.unpack1('N')
67
+ begin
68
+ str = socket.read length
69
+ message = Riemann::Message.decode str
70
+ rescue StandardError
71
+ puts "Message was #{str.inspect}"
72
+ raise
73
+ end
69
74
 
70
- message
71
- else
72
- raise InvalidResponse, "unexpected EOF"
75
+ unless message.ok
76
+ puts 'Failed'
77
+ raise ServerError, message.error
73
78
  end
79
+
80
+ message
74
81
  end
75
82
 
76
83
  def send_recv(message)
77
- with_connection do |s|
78
- s.write(message.encode_with_length)
79
- read_message(s)
84
+ with_connection do |socket|
85
+ socket.write(message.encode_with_length)
86
+ read_message(socket)
80
87
  end
81
88
  end
82
89
 
@@ -87,17 +94,17 @@ module Riemann
87
94
  tries = 0
88
95
 
89
96
  @locket.synchronize do
90
- begin
91
- tries += 1
92
- yield(socket)
93
- rescue IOError, Errno::EPIPE, Errno::ECONNREFUSED, InvalidResponse, Timeout::Error, Riemann::Client::TcpSocket::Error
94
- close
95
- raise if tries > 3
96
- retry
97
- rescue Exception
98
- close
99
- raise
100
- end
97
+ tries += 1
98
+ yield(socket)
99
+ rescue IOError, Errno::EPIPE, Errno::ECONNREFUSED, InvalidResponse, Timeout::Error,
100
+ Riemann::Client::TcpSocket::Error
101
+ close
102
+ raise if tries > 3
103
+
104
+ retry
105
+ rescue StandardError
106
+ close
107
+ raise
101
108
  end
102
109
  end
103
110
  end