litmus_paper 1.6.1 → 1.6.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: a52459b0af44d8070aa4f9540928e6e4f119e16f
4
- data.tar.gz: 94f289b53c8bc488cc4ffb49d3dac9ffd976a1fa
2
+ SHA256:
3
+ metadata.gz: e1c48dbe7a39abd27341207056934ec3e486a07c6fa510b77d8dfe18d98e1388
4
+ data.tar.gz: 1c2076dc0c76f6174a69c2e3a93a1e6d89e45d66646f109088ab9f02151db3b9
5
5
  SHA512:
6
- metadata.gz: 5ea42940af0dd06f8a4cbbe9506c7c65689073634a0d35aaa6980db8e37a99cdad516b623090c747b1e959fe7526248d84e076f8bc1e4e5ac9e1b7d5bd90a96b
7
- data.tar.gz: a898999804de640f8527901f79fcb94661096406625f01964728bfec650e78df743a00dae9c687244b5516ed6f6644ee85ba713444eed08a1a031139b8b7ac12
6
+ metadata.gz: ab98209fec2123b0c77a30da44e029d5e2f86bd5f0fb8e8fdbde74b1ab3f5d1f19e568655d184bec05e77b8228324fca8acae55769baa1d485139b86b05b8330
7
+ data.tar.gz: 7926a582ac8b8aefb4f6b18d381b315ae9bfa01b8c921a87db83a896ca2b803fa59c11169b7548d37c619e04a92ef42c3f30012672951c1849ffaacc2b5b67f2
data/Dockerfile CHANGED
@@ -1,8 +1,9 @@
1
- FROM debian:buster-slim
1
+ FROM debian:bookworm-slim
2
2
 
3
3
  EXPOSE 9293/TCP
4
4
 
5
5
  ENV APP_USER litmus_paper
6
+ ENV SSL_CERT_FILE=/home/${APP_USER}/combined_cacerts.pem
6
7
  ENV LANG C.UTF-8
7
8
  ENV LC_ALL C.UTF-8
8
9
 
@@ -19,19 +20,22 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
19
20
 
20
21
  # Create non-root user
21
22
  RUN addgroup --gid 1000 --system $APP_USER && \
22
- adduser --uid 1000 --ingroup $APP_USER --system $APP_USER
23
+ adduser --disabled-password --uid 1000 --ingroup $APP_USER --system $APP_USER
23
24
 
24
25
  ENV GEM_HOME /usr/local/bundle
25
26
  ENV BUNDLE_APP_CONFIG $GEM_HOME
26
27
  ENV PATH $GEM_HOME/bin:$PATH
27
28
 
28
- ADD litmus_paper.gemspec /home/$APP_USER/
29
- ADD lib/litmus_paper/version.rb /home/$APP_USER/lib/litmus_paper/version.rb
30
- ADD Gemfile* /home/$APP_USER/
29
+ COPY --chown=$APP_USER:$APP_USER litmus_paper.gemspec /home/$APP_USER/
30
+ COPY --chown=$APP_USER:$APP_USER lib/litmus_paper/version.rb /home/$APP_USER/lib/litmus_paper/version.rb
31
+ COPY --chown=$APP_USER:$APP_USER Gemfile* /home/$APP_USER/
32
+ COPY --chown=$APP_USER:$APP_USER . /home/$APP_USER
31
33
 
32
34
  WORKDIR /home/$APP_USER
33
35
 
34
- RUN bundle config --global frozen 1 && \
36
+ COPY combined_cacerts.pem /home/${APP_USER}/combined_cacerts.pem
37
+ RUN git config --global --add safe.directory /home/litmus_paper
38
+ RUN bundle config --global silence_root_warning true frozen 1 && \
35
39
  bundle install \
36
40
  -j2 \
37
41
  --retry 3 \
@@ -40,7 +44,6 @@ RUN bundle config --global frozen 1 && \
40
44
  && find /usr/local/bundle/gems/ -name "*.c" -delete \
41
45
  && find /usr/local/bundle/gems/ -name "*.o" -delete
42
46
 
43
- ADD . /home/$APP_USER
44
47
  RUN ln -sf /home/$APP_USER/docker/litmus.conf /etc/litmus.conf \
45
48
  && ln -sf /home/$APP_USER/docker/litmus_unicorn.rb /etc/litmus_unicorn.rb
46
49
  RUN gem build litmus_paper.gemspec && gem install litmus_paper*.gem
data/README.md CHANGED
@@ -203,15 +203,18 @@ There are no additional configuration files for the agent check, since all optio
203
203
 
204
204
  ```
205
205
  Usage: litmus-agent-check [options]
206
- -s, --service SERVICE:PORT,... agent-check service to port mappings
206
+ -s, --service SERVICE:PORT,... agent-check service to port mappings (multi-port mode)
207
207
  -c, --config CONFIG Path to litmus paper config file
208
208
  -p, --pid-file PID_FILE Where to write the pid
209
+ -P, --port PORT Port for agent check. Can be used with HAProxy 1.7+ with agent-send directive (single-port mode)
209
210
  -w, --workers WORKERS Number of worker processes
210
211
  -D, --daemonize Daemonize the process
211
212
  -h, --help Help text
212
213
  ```
213
214
 
214
- The service:port argument means that the server will expose the data from the litmus check for `service` on `port` in HAProxy agent check format. For example, if you wanted to serve status information about `myapp` on port `8080`, and already had a service config for it, you'd pass `-s myapp:8080`.
215
+ In single-port mode, the `-P` or `--port` argument specifies the port that the server will expose the data for all services litmus is configured for on `port` in HAProxy agent check format. This can be used on HAProxy 1.7+ with the `agent-send` directive to specify a backend name to be sent by HAProxy and have litmus paper do the lookup. For example, `agent-send "my_service\n"`.
216
+
217
+ In multi-port mode, the service:port argument means that the server will expose the data from the litmus check for `service` on `port` in HAProxy agent check format. For example, if you wanted to serve status information about `myapp` on port `8080`, and already had a service config for it, you'd pass `-s myapp:8080`.
215
218
 
216
219
  On the HAProxy server, add `agent-check agent-port 8080 agent-inter <seconds>s` to the config line for each server listed for that backend. This tells HAProxy to query port 8080 on the backend every `<seconds>` seconds for health information. See the [HAProxy agent check documentation](https://cbonte.github.io/haproxy-dconv/1.8/configuration.html#5.2-agent-check) for more details.
217
220
 
@@ -8,6 +8,10 @@ module LitmusPaper
8
8
  )
9
9
  output = []
10
10
 
11
+ if !service
12
+ return "failed#BAD_INPUT"
13
+ end
14
+
11
15
  health = @cache.get(service)
12
16
  if !health
13
17
  @cache.set(
@@ -5,42 +5,28 @@ require 'socket'
5
5
  require 'litmus_paper/agent_check_handler'
6
6
 
7
7
  module LitmusPaper
8
- class AgentCheckServer
9
- CRLF = "\r\n"
8
+ module AgentCheckServer
9
+ CRLF = "\r\n".freeze
10
10
 
11
- def initialize(litmus_paper_config, services, workers, pid_file, daemonize)
11
+ attr_reader :control_sockets, :pid_file, :workers
12
+
13
+ def initialize(litmus_paper_config, daemonize, pid_file, workers)
12
14
  LitmusPaper.configure(litmus_paper_config)
13
- @services = services
14
- @workers = workers
15
- @pid_file = pid_file
16
15
  @daemonize = daemonize
17
- @control_sockets = @services.keys.map do |port|
18
- TCPServer.new(port)
19
- end
16
+ @pid_file = pid_file
17
+ @workers = workers
18
+
20
19
  trap(:INT) { exit }
21
20
  trap(:TERM) { exit }
22
21
  end
23
22
 
24
- # Stolen pattern from ruby Socket, modified to return the service based on
25
- # the accepting port
26
- def accept_loop(sockets)
27
- if sockets.empty?
28
- raise ArgumentError, "no sockets"
29
- end
30
- loop {
31
- readable, _, _ = IO.select(sockets)
32
- readable.each { |r|
33
- begin
34
- sock, addr = r.accept_nonblock
35
- _, remote_port, _, remote_ip = sock.peeraddr
36
- LitmusPaper.logger.debug "Received request from #{remote_ip}:#{remote_port}"
37
- service = @services[r.local_address.ip_port]
38
- rescue IO::WaitReadable
39
- next
40
- end
41
- yield sock, service
42
- }
43
- }
23
+ def daemonize?
24
+ !!@daemonize
25
+ end
26
+
27
+
28
+ def service_for_socket(socket)
29
+ raise "Consumers must implemented service_for_socket(socket)"
44
30
  end
45
31
 
46
32
  def respond(sock, message)
@@ -55,13 +41,13 @@ module LitmusPaper
55
41
  end
56
42
 
57
43
  def run
58
- if @daemonize
44
+ if daemonize?
59
45
  Process.daemon
60
46
  end
61
- write_pid(@pid_file)
47
+ write_pid(pid_file)
62
48
  child_pids = []
63
49
 
64
- @workers.times do
50
+ workers.times do
65
51
  child_pids << spawn_child
66
52
  end
67
53
 
@@ -72,7 +58,7 @@ module LitmusPaper
72
58
  rescue Errno::ESRCH
73
59
  end
74
60
  end
75
- File.delete(@pid_file) if File.exists?(@pid_file)
61
+ File.delete(pid_file) if File.exists?(pid_file)
76
62
  exit
77
63
  }
78
64
 
@@ -89,9 +75,16 @@ module LitmusPaper
89
75
 
90
76
  def spawn_child
91
77
  fork do
92
- accept_loop(@control_sockets) do |sock, service|
93
- respond(sock, AgentCheckHandler.handle(service))
94
- sock.close
78
+ Socket.accept_loop(control_sockets) do |sock, addr|
79
+ _, remote_port, _, remote_ip = sock.peeraddr(:numeric)
80
+
81
+ begin
82
+ service = service_for_socket(sock)
83
+ respond(sock, AgentCheckHandler.handle(service))
84
+ sock.close
85
+ rescue Errno::ECONNRESET, Errno::EPIPE, Errno::ENOTCONN
86
+ LitmusPaper.logger.debug "Received request from #{remote_ip}:#{remote_port}, but client hung up."
87
+ end
95
88
  end
96
89
  end
97
90
  end
@@ -1,5 +1,6 @@
1
1
  require 'optparse'
2
- require 'litmus_paper/agent_check_server'
2
+ require 'litmus_paper/single_port_agent_server'
3
+ require 'litmus_paper/multi_port_agent_server'
3
4
 
4
5
  module LitmusPaper
5
6
  module CLI
@@ -9,7 +10,7 @@ module LitmusPaper
9
10
  options = {}
10
11
  options[:pid_file] = '/tmp/litmus-agent-check.pid'
11
12
  optparser = OptionParser.new do |opts|
12
- opts.on("-s", "--service SERVICE:PORT,...", Array, "agent-check service to port mappings") do |s|
13
+ opts.on("-s", "--service SERVICE:PORT,...", Array, "agent-check service to port mappings (multi-port mode)") do |s|
13
14
  options[:services] = s
14
15
  end
15
16
  opts.on("-c", "--config CONFIG", "Path to litmus paper config file") do |c|
@@ -18,6 +19,9 @@ module LitmusPaper
18
19
  opts.on("-p", "--pid-file PID_FILE", String, "Where to write the pid") do |p|
19
20
  options[:pid_file] = p
20
21
  end
22
+ opts.on("-P", "--port PORT", Integer, "Port for agent check. Can be used with HAProxy 1.7+ with agent-send directive (single-port mode)") do |port|
23
+ options[:port] = port
24
+ end
21
25
  opts.on("-w", "--workers WORKERS", Integer, "Number of worker processes") do |w|
22
26
  options[:workers] = w
23
27
  end
@@ -42,8 +46,12 @@ module LitmusPaper
42
46
  exit 0
43
47
  end
44
48
 
45
- if !options.has_key?(:services)
46
- puts "Error: `-s SERVICE:PORT,...` required"
49
+ if !options.has_key?(:services) && !options.has_key?(:port)
50
+ puts "Error: `-s SERVICE:PORT,...` or `-P PORT` required"
51
+ puts optparser
52
+ exit 1
53
+ elsif options.has_key?(:services) && options.has_key?(:port)
54
+ puts "Error: `-s` and `-P` are mutually exclusive and cannot be specified together"
47
55
  puts optparser
48
56
  exit 1
49
57
  end
@@ -56,15 +64,17 @@ module LitmusPaper
56
64
  exit 1
57
65
  end
58
66
 
59
- options[:services] = options[:services].reduce({}) do |memo, service|
60
- if service.split(':').length == 2
61
- service, port = service.split(':')
62
- memo[port.to_i] = service
63
- memo
64
- else
65
- puts "Error: Incorrect service port arg `-s SERVICE:PORT,...`"
66
- puts optparser
67
- exit 1
67
+ if options.has_key?(:services)
68
+ options[:services] = options[:services].reduce({}) do |memo, service|
69
+ if service.split(':').length == 2
70
+ service, port = service.split(':')
71
+ memo[port.to_i] = service
72
+ memo
73
+ else
74
+ puts "Error: Incorrect service port arg `-s SERVICE:PORT,...`"
75
+ puts optparser
76
+ exit 1
77
+ end
68
78
  end
69
79
  end
70
80
 
@@ -73,13 +83,25 @@ module LitmusPaper
73
83
 
74
84
  def run(args)
75
85
  options = parse_args(args)
76
- agent_check_server = LitmusPaper::AgentCheckServer.new(
77
- options[:litmus_paper_config],
78
- options[:services],
79
- options[:workers],
80
- options[:pid_file],
81
- options[:daemonize],
82
- )
86
+
87
+ if options.has_key?(:port)
88
+ agent_check_server = LitmusPaper::SinglePortAgentServer.new(
89
+ options[:litmus_paper_config],
90
+ options[:daemonize],
91
+ options[:pid_file],
92
+ options[:port],
93
+ options[:workers],
94
+ )
95
+ else
96
+ agent_check_server = LitmusPaper::MultiPortAgentServer.new(
97
+ options[:litmus_paper_config],
98
+ options[:daemonize],
99
+ options[:pid_file],
100
+ options[:services],
101
+ options[:workers],
102
+ )
103
+ end
104
+
83
105
  agent_check_server.run
84
106
  end
85
107
 
@@ -20,7 +20,7 @@ module LitmusPaper
20
20
  queued = current_stats[:socket_queued]
21
21
  utilization = current_stats[:socket_utilization]
22
22
 
23
- "Metric::TcpSocketUtilitization(weight: #{weight}, maxconn: #{maxconn}, active: #{active}, queued: #{queued}, utilization: #{utilization}, address: #{address})"
23
+ "Metric::TcpSocketUtilization(weight: #{weight}, maxconn: #{maxconn}, active: #{active}, queued: #{queued}, utilization: #{utilization}, address: #{address})"
24
24
  end
25
25
  end
26
26
  end
@@ -25,7 +25,7 @@ module LitmusPaper
25
25
  end
26
26
 
27
27
  def self.const_missing(const_name)
28
- super unless const_name == :UnixSocketUtilitization
28
+ return super unless const_name == :UnixSocketUtilitization
29
29
  warn "`LitmusPaper::Metric::UnixSocketUtilitization` has been deprecated. Use `LitmusPaper::Metric::UnixSocketUtilization` instead."
30
30
  UnixSocketUtilization
31
31
  end
@@ -0,0 +1,23 @@
1
+ require 'litmus_paper/agent_check_server'
2
+
3
+ module LitmusPaper
4
+ class MultiPortAgentServer
5
+ include AgentCheckServer
6
+
7
+ attr_reader :services
8
+
9
+ def initialize(litmus_paper_config, daemonize, pid_file, services, workers)
10
+ super(litmus_paper_config, daemonize, pid_file, workers)
11
+ @services = services
12
+ @control_sockets = @services.keys.map do |port|
13
+ TCPServer.new(port)
14
+ end
15
+ end
16
+
17
+ def service_for_socket(socket)
18
+ _, remote_port, _, remote_ip = socket.peeraddr(:numeric)
19
+ LitmusPaper.logger.debug "Received request from #{remote_ip}:#{remote_port}"
20
+ services[socket.local_address.ip_port]
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,29 @@
1
+ require 'litmus_paper/agent_check_server'
2
+
3
+ module LitmusPaper
4
+ class SinglePortAgentServer
5
+ include AgentCheckServer
6
+
7
+ VALID_NAME_REGEX = /\A[A-Za-z0-9_:.-]+\z/.freeze
8
+
9
+ def initialize(litmus_paper_config, daemonize, pid_file, port, workers)
10
+ super(litmus_paper_config, daemonize, pid_file, workers)
11
+ @control_sockets = [TCPServer.new(port)]
12
+ end
13
+
14
+ def service_for_socket(socket)
15
+ _, remote_port, _, remote_ip = socket.peeraddr(:numeric)
16
+
17
+ msg = socket.gets
18
+
19
+ if msg && (m = msg.chomp.match(VALID_NAME_REGEX))
20
+ backend_name = m[0]
21
+ LitmusPaper.logger.info "Received request from #{remote_ip}:#{remote_port} for '#{backend_name}'"
22
+ backend_name
23
+ else
24
+ LitmusPaper.logger.error "Received request from #{remote_ip}:#{remote_port}, but backend name could not be read."
25
+ nil
26
+ end
27
+ end
28
+ end
29
+ end
@@ -1,3 +1,3 @@
1
1
  module LitmusPaper
2
- VERSION = "1.6.1"
2
+ VERSION = "1.6.2"
3
3
  end
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
- require 'litmus_paper/agent_check_server'
2
+ require 'litmus_paper/multi_port_agent_server'
3
3
 
4
- describe LitmusPaper::AgentCheckServer do
4
+ describe LitmusPaper::MultiPortAgentServer do
5
5
  pid = nil
6
6
 
7
7
  before :all do
@@ -0,0 +1,84 @@
1
+ require 'spec_helper'
2
+ require 'litmus_paper/single_port_agent_server'
3
+
4
+ describe LitmusPaper::SinglePortAgentServer do
5
+ pid = nil
6
+
7
+ before :all do
8
+ if ! Kernel.system("bundle exec litmus-agent-check -P 9191 -c spec/support/test.config -w 10 -D")
9
+ fail('Unable to start server')
10
+ end
11
+ port_open = false
12
+ while ! port_open do
13
+ begin
14
+ TCPSocket.new('127.0.0.1', 9191)
15
+ rescue StandardError => e
16
+ sleep 0.1
17
+ next
18
+ end
19
+ port_open = true
20
+ end
21
+ end
22
+
23
+ after :all do
24
+ Process.kill(:TERM, File.read('/tmp/litmus-agent-check.pid').to_i)
25
+ end
26
+
27
+ describe "The agent-check text protocol" do
28
+ it "returns the health from a passing test" do
29
+ TCPSocket.open('127.0.0.1', 9191) do |s|
30
+ s.puts "passing_test"
31
+ s.gets.should match(/ready\tup\t\d+%\r\n/)
32
+ end
33
+ end
34
+ it "returns the health from a failing test" do
35
+ TCPSocket.open('127.0.0.1', 9191) do |s|
36
+ s.puts "test"
37
+ s.gets.should match(/down\t0%\r\n/)
38
+ end
39
+ end
40
+ it "returns a failure for a non-existent service" do
41
+ TCPSocket.open('127.0.0.1', 9191) do |s|
42
+ s.puts "foo"
43
+ s.gets.should match(/failed#NOT_FOUND\r\n/)
44
+ end
45
+ end
46
+ it "returns a failure for a bad message" do
47
+ TCPSocket.open('127.0.0.1', 9191) do |s|
48
+ s.puts "\n"
49
+ s.gets.should match(/failed#BAD_INPUT\r\n/)
50
+ end
51
+ end
52
+ end
53
+
54
+ describe "server" do
55
+ it "has the configured number of children running" do
56
+ pid = File.read('/tmp/litmus-agent-check.pid').to_i
57
+ children = `ps --no-headers --ppid #{pid}|wc -l`
58
+ children.strip.to_i == 10
59
+ end
60
+
61
+ it "doesn't crash if a client hangs up" do
62
+ pid = File.read('/tmp/litmus-agent-check.pid').to_i
63
+ child_pids = `ps --no-headers --ppid #{pid}|wc -l`
64
+ original_pids = `pgrep -P #{pid}`.chomp.split("\n")
65
+
66
+ TCPSocket.open('127.0.0.1', 9191) do |s|
67
+ # Do nothing (e.g. haproxy w/o agent-send setup correctly)
68
+ end
69
+
70
+ sleep 0.5
71
+
72
+ current_pids = `pgrep -P #{pid}`.chomp.split("\n")
73
+ current_pids.should eql(original_pids)
74
+ end
75
+
76
+ it "if a child dies you get a new one" do
77
+ pid = File.read('/tmp/litmus-agent-check.pid').to_i
78
+ Kernel.system("kill -9 $(ps --no-headers --ppid #{pid} -o pid=|tail -1)")
79
+ sleep 0.5
80
+ children = `ps --no-headers --ppid #{pid}|wc -l`
81
+ children.strip.to_i == 10
82
+ end
83
+ end
84
+ end
data/spec/ssl/server.crt CHANGED
@@ -1,18 +1,32 @@
1
1
  -----BEGIN CERTIFICATE-----
2
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
18
32
  -----END CERTIFICATE-----
data/spec/ssl/server.key CHANGED
@@ -1,15 +1,52 @@
1
- -----BEGIN RSA PRIVATE KEY-----
2
- MIICXQIBAAKBgQCmpQmuHxNzNUv0VGibVMzUJD/c9+JipDYI20kzdmnDeDrWDw86
3
- aCtScTFshQD+HsKfUjPMhNfkiIQ/iiuwSWuBz5P7oTgMYEDWY6lsU/cCWkhX3T5w
4
- AgO5kTq2uDF5bQ6Od5KIaZJH6C81jsHwcDUdXfx4hidvRaUs5etJM7Y7SwIDAQAB
5
- AoGAAngRg6XsONnCTVVu01ZXTpFW7OQzU3jRYCI3nG6VtJK0dHV2qUvf0HHi5JO3
6
- 5wv3oDqsj8wsErO/Gd3nNc5wrE6S1qGIRU/1wvVbEgB2AIGYuXuGLyR9nrUkwjHp
7
- ztPIBtl0cgapSSQxYAQ2Apu/aQCaP3l4IKUdktYBKO7CkJkCQQDS9iCKGNV+Xz8X
8
- 0flPJ3yKBndLr1g4sbEacGA/+V/CHhWyKk6RXjWOUTCTPECi2eyg3WJaGnq32BTN
9
- DEZ6YJgtAkEAyjjTWMut/UfoNF6a8++yNjo17JrH/MtCAEphXZcUxEmubYkODR0v
10
- wNELrstWOfkuGVTZm618RHM0J6LqfVsUVwJBAJ4CaeblqOrpbjlqNUDbQ4WiSDIx
11
- GHQGa69w4jaoktezbu6uj4CEPrrlBuwQ4hzX+0uV5fe1A5u1xga7HgLFXNUCQA0d
12
- 8H+S/p8uOd6jwFNQWfPwhKzrQUuhd4+DQ5uJgDxXNyw9tp6dJQrRxHs7D0XFZvsX
13
- qOHTN/tMqbZkd+dXsBMCQQCgLIW0Og3LHubDCn9jNoz21Achi2kwI5AOXEnyHL2W
14
- XvjJH6PM3/d9TpUVYCoj8PO5WoXCSt1DVpZ5ow28ad6M
15
- -----END RSA PRIVATE KEY-----
1
+ -----BEGIN PRIVATE KEY-----
2
+ MIIJQwIBADANBgkqhkiG9w0BAQEFAASCCS0wggkpAgEAAoICAQDfrT8S+y/G5IEY
3
+ WWksau1VJB9lWUFPUd9ey9jmG5tA785gXXKbGke+fxk730Y5bjv3RIpqbmZRqiSn
4
+ pjJmQnJB/Q31rHHEPZS7+TCv2jRCSALHhdVj8E8N+V48p8W00CPAFbMZvgktpUw5
5
+ 8y8acVPLAJYqZfrTm95n/NUn4wzD5o+PILRhFpM2ahroRme5oKKZWobz78DICCQZ
6
+ uW7YQDMD0Og+5UrzFbGC2GYWHz5yPdLClzkekB1ASLbdmtH62F8qkkpQyj7u+ZNS
7
+ Tl37vQhpfTbWYU1O0QAcxtjsPNclMyfdjz10gRL68o4pGmXG2rCEwq4s15k9XIem
8
+ lBM2pj+jG13QD+Q5+FOueWeBPVF+/BjcYKJPBJJkdlJN6T6WrmtwZgqFQEsI6IXk
9
+ GiXztxClbyEB7L0g8qbPXl2gm1/hvIUhIV7CFJjHsLXoxgvQatleZngIjbfgEbYM
10
+ XnC1I2eZm2doil+bwD6vA7r9ziYwPy0Bb1IObJlEn/ScXozDmTYK7vqsCdEPjmYp
11
+ nGN4p4Rk8j9hvkhP/hzc/TEmKGeHDH5baMvSpw4MjmAiDc5lze0dTki5M372RfT/
12
+ IET05zAZdHwNgXQpXpoj0JP0S3DdiRmlJ4wxQ3wdyvBDbtAursz8SBtuXQemh2oq
13
+ VxgAekemC3jo3sN5ZSBVNNfHQKNsJwIDAQABAoICACgiHrIaLc1jDKLA0DUvDlx7
14
+ ecKmjCheSVTqAIXxKB8zp/T0b27S/VJ53Z43hpMha1MHkkpcerFmdOM718kvXO7o
15
+ J8wP3+3VGs3LfWfgIAZQg2cnZU1kPdsFBlqdw8SYoAGEIzmYNm9hPFcdgjMdaGqB
16
+ NXBwEdxMGFDSNbDNdWnlAZctyA+vjER0L1XD5DKTVvlrG9HDD/UUON4AvpnAkya5
17
+ IiK+437QQqR2jYKkooC/BQTzO0V3mDgDlAQZFloK3rB1xS3PzBD26O8YrpZPqaW7
18
+ 2M4IcWWV7I49Q4jHtdav4hRH8j/oNO6f/M/1M5PFg2yevb/AA3fWFWTXJsdkdwBI
19
+ IF73TEVTS2Bseplxii6EhrckVkeDq59Y0r92QmoALWJXCNR60/CJPiSxDsmfBUpz
20
+ C7hi8zGAjPEtB2P5BV6Zinqwwu56AztZz7oHiBfjLSQTl1w9r0e7HdVrZzYMXj/z
21
+ SOBbK3lHoRXltQ7uZnPR5ZO9zQ49MzJKJry+WX4JjJyanpMBf2EA5UoYwgB3IWbf
22
+ CrqlYdES6RXC2ybue9ptTj23PodPqdC8BRJhpBVNLgHYTlHUZzu3cjbrldHy+hIs
23
+ beWQJxX+pYfu8Yuu+v0MVAJqj6fGg51cZ4MQebuEwWYucZ3cNiuD0SviNeAzuQ9g
24
+ GjqhhjfAiK74ITQyb/0pAoIBAQD6SiUFyJIqkAOk8jurja30XLTEJ9yipTlXQAud
25
+ QO85LtTtmyekp16Q87BLvvFcABznviaXrDN1/KwNnuo+CKbQ2NJZUUaZMCTZ9gqs
26
+ n3mqB7OwNNUUVgo/A98ZBcx8llQ+GLBVDCuhPH8LthGJny13NQa62QXL7PJp6NHx
27
+ lAhGzRwJZBeyR7AoDt9r99HJz0cc28A2hY/M+ero0ZiMmaNBQ2NdFR7vZmjFj/5H
28
+ HBPutlNSC+jOB4tGgHHu4f1TVUxMvVifGLP9W4fzfcNM2eLojZKC0RIzSm9Sim4o
29
+ oad1TV6GcP7MWZzjIt1fhTFZvJF4WCeJyZgM7PmbVSUZ1KxjAoIBAQDkx6pDUN71
30
+ QzomDbuQEzDTuFSQ+Wp7HKvicDFWYMql6EdXA3WmbaqfAd1wJa7IYGCjStWdIsUK
31
+ +BUfI6mTir9f54TEZ0fdg2JagNLRCI4nRUjnFZhsWh6SVHb1l8/G7CwkfXgBhAUj
32
+ a4YN2ycwy38KNTS8r0j50GfzzDOCoNBUYHud30H7e3jdh0W0EJ/PO6MEI6dzEZJv
33
+ qHi7VWQUDDiLDtbsE2OTZ3OWhvtgUj9iDGEhqFX8jYMxIx8lqGzhukBJ8ek9x4vP
34
+ MjsEkWu95RHDKT10KMW2k/TgOW7HVEG47GIhX6Ajlj+W5X323Dtxw3bHNjR7VtAQ
35
+ aeHRt9ViscJtAoIBAQCwZA6he9AfNO2Mkrag2bGt1KQE1f71lTHLHrTQt5GgoDOp
36
+ 3L3cmaPYzhUB3OimqOG2JNl37QE7dr4ev09gNqKx7wyXq+LwVPCzt2WgcKfCv7jQ
37
+ RvugYF7KOEVDkkWhzCREuwuSdIhPEp6Kt162ubrGF1XN2uLt6+iP4WgMNAJ9O1I2
38
+ ABd/KmyoXorwwW9VJcJ9QRW+lvRYRg1a1VQISsK2XPKrCBaMK4VNLoTKwqv9gPtJ
39
+ iGEiykhKgH1LGHN7BlNGhe7t+O/ob1hprskz4R68PAH0Nbn48c1ww2SNOBgXYFZs
40
+ szeu9rzNiqWvCuRT1MREpwP+ZFfHTD9BTIlgIfT3AoIBAQCNzGNvjbRjd+OWqnRS
41
+ fFKLJ3ji0nR5EfBHTRqHWz6/ThTJjc9h9B8IpvNFC1Ylw/ahv0RfPKm8fr84qbX1
42
+ SM4M90aHJSyZ01EmnyoLfa3+ESd6cxwiLEk+kTOaTRnvRXqms02qQtWceoyAEhFc
43
+ YQTAovGo8Uvd6ppDtZFHqbz2T0bPNw2CfakQRUOis5sZqvEDI8Ypv/5vTpBmLCr3
44
+ cgupxOzZLbtOJZSy+77amJ/IebvKTLfe7ScfUZGAmb/CuNoX+uSB8ihpp8yErE2H
45
+ SW+U8v6v/IVvAI2KXI6Y5VRG9dxsqwRqijmnoV5Nn3sIrAn2t1YYDFqxka7xeWu8
46
+ 3EiRAoIBADTuPM3EsKP6uQ9JPJXGwjiNYQaKV176BfhPNW8VfemZoVI51xs5LEzQ
47
+ to5M34Z6lJjo7XEkYSW9kpJ+LQ822zzKn/OtMdt06tMGg1puyYnSbo7LlIyNpuQf
48
+ e1NdUtl/3AUm/tRjl9rVQvyrLPfeaHGKeUP96RM8Q2NMQzMnb42liVc9cCtFCyET
49
+ njc/sM9oh6vj9JRL2EFMH2OLAOAezaZIN7LdPz7Ij6P3JRp3KDycYIDIV8g5BBQA
50
+ QWrVsu6iwPLfk65M8J2lSk9Gj/oOK9vBPRXvgn3D1qWCnnCCsCS7lHadH2u15u31
51
+ zzAeg1BIeBWTl87fSL/BKR7l3LtFMbU=
52
+ -----END PRIVATE KEY-----
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: litmus_paper
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.1
4
+ version: 1.6.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Braintreeps
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-01-17 00:00:00.000000000 Z
11
+ date: 2024-09-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sinatra
@@ -192,7 +192,9 @@ files:
192
192
  - lib/litmus_paper/metric/socket_utilization.rb
193
193
  - lib/litmus_paper/metric/tcp_socket_utilization.rb
194
194
  - lib/litmus_paper/metric/unix_socket_utilization.rb
195
+ - lib/litmus_paper/multi_port_agent_server.rb
195
196
  - lib/litmus_paper/service.rb
197
+ - lib/litmus_paper/single_port_agent_server.rb
196
198
  - lib/litmus_paper/status_file.rb
197
199
  - lib/litmus_paper/terminal_output.rb
198
200
  - lib/litmus_paper/util.rb
@@ -201,7 +203,6 @@ files:
201
203
  - litmus_paper.gemspec
202
204
  - release
203
205
  - spec/litmus_paper/agent_check_handler_spec.rb
204
- - spec/litmus_paper/agent_check_server_spec.rb
205
206
  - spec/litmus_paper/app_spec.rb
206
207
  - spec/litmus_paper/cache_spec.rb
207
208
  - spec/litmus_paper/cli/admin_spec.rb
@@ -220,7 +221,9 @@ files:
220
221
  - spec/litmus_paper/metric/script_spec.rb
221
222
  - spec/litmus_paper/metric/tcp_socket_utilization_spec.rb
222
223
  - spec/litmus_paper/metric/unix_socket_utilization_spec.rb
224
+ - spec/litmus_paper/multi_port_agent_server_spec.rb
223
225
  - spec/litmus_paper/service_spec.rb
226
+ - spec/litmus_paper/single_port_agent_server_spec.rb
224
227
  - spec/litmus_paper/status_file_spec.rb
225
228
  - spec/litmus_paper_spec.rb
226
229
  - spec/script/https_test_server.rb
@@ -266,14 +269,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
266
269
  - !ruby/object:Gem::Version
267
270
  version: '0'
268
271
  requirements: []
269
- rubyforge_project:
270
- rubygems_version: 2.5.2.1
272
+ rubygems_version: 3.0.9
271
273
  signing_key:
272
274
  specification_version: 4
273
275
  summary: Backend health tester for HA Services, partner project of big_brother
274
276
  test_files:
275
277
  - spec/litmus_paper/agent_check_handler_spec.rb
276
- - spec/litmus_paper/agent_check_server_spec.rb
277
278
  - spec/litmus_paper/app_spec.rb
278
279
  - spec/litmus_paper/cache_spec.rb
279
280
  - spec/litmus_paper/cli/admin_spec.rb
@@ -292,7 +293,9 @@ test_files:
292
293
  - spec/litmus_paper/metric/script_spec.rb
293
294
  - spec/litmus_paper/metric/tcp_socket_utilization_spec.rb
294
295
  - spec/litmus_paper/metric/unix_socket_utilization_spec.rb
296
+ - spec/litmus_paper/multi_port_agent_server_spec.rb
295
297
  - spec/litmus_paper/service_spec.rb
298
+ - spec/litmus_paper/single_port_agent_server_spec.rb
296
299
  - spec/litmus_paper/status_file_spec.rb
297
300
  - spec/litmus_paper_spec.rb
298
301
  - spec/script/https_test_server.rb