litmus_paper 1.6.1 → 1.6.2

Sign up to get free protection for your applications and to get access to all the features.
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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
- MTU2WhgPMjExMzA2MTMwMDExNTZaMFoxCzAJBgNVBAYTAlVTMREwDwYDVQQIEwhJ
6
- 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
- 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
- Ca4fE3M1S/RUaJtUzNQkP9z34mKkNgjbSTN2acN4OtYPDzpoK1JxMWyFAP4ewp9S
9
- M8yE1+SIhD+KK7BJa4HPk/uhOAxgQNZjqWxT9wJaSFfdPnACA7mROra4MXltDo53
10
- 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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
+ 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
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