net-knocker 0.0.1 → 0.0.4

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
2
  SHA256:
3
- metadata.gz: 7d734c93c4e362b454bace35ef5f0e46efd227139cdafdb3c19c030a98961f85
4
- data.tar.gz: 53de1160612bbd364785b5e97ea84c343eeb27080621fbb0702bc13b0f3329fc
3
+ metadata.gz: d2b9e2759985d6e60c6ff108157155b7862d703c2e1836284f89f2786e58d199
4
+ data.tar.gz: dce4cd990ad60f354628f15e83bb2fe9cadfd7d1bb1ea973e7211447711107a7
5
5
  SHA512:
6
- metadata.gz: c611fc7c1d7eaba3e86db70a4c386e98f8d394d1909d0ebee5f1972149384cf723e94470a20eea622ecb1083fabe588a3fed093ab841136569ec5d06d672d0db
7
- data.tar.gz: f8b6973f49d8d1152a4adee0d71c42e5c70c40adfb1fac8ab745695439c1bbd6c9cc047346a47530a811c77bae9c9dfbd859a9212d0a06a9ea53e552bb156a69
6
+ metadata.gz: 43ae20154a32b3a730952bec81a0b0c5a2159c7038b9d1276e4ff11fbf8edbcfb07ae8b6bfc6021c0d892ec47b797a6db14f2a13a7f496fe221c2bcc5540114b
7
+ data.tar.gz: 3b3783e2c1d6a7d7b842f6e93f07ad4b0ca2dbe1e759b94e39ea7942c085d3f2b35a7532bbbff77ee8f74bd6fd24b64dfd6bb74ee242089d4ac4337a94f642fa
data/.pryrc CHANGED
@@ -1 +1,3 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative 'lib/net/knocker'
data/.rubocop.yml CHANGED
@@ -1,5 +1,5 @@
1
1
  AllCops:
2
- TargetRubyVersion: 2.4
2
+ TargetRubyVersion: 2.5
3
3
  NewCops: enable
4
4
 
5
5
  Style/StringLiterals:
@@ -13,3 +13,6 @@ Style/Documentation:
13
13
 
14
14
  Layout/LineLength:
15
15
  Max: 120
16
+
17
+ Metrics/MethodLength:
18
+ Max: 20
@@ -0,0 +1,79 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'logger'
4
+ require 'net/https'
5
+ require 'uri'
6
+
7
+ module Net
8
+ class Knocker
9
+ module Env
10
+ def env_secret
11
+ @env_secret ||= ENV.fetch('NET_KNOCKER_SECRET')
12
+ end
13
+
14
+ def http_client
15
+ @http_client ||= Net::HTTP.new(url.host, url.port).tap do |http|
16
+ http.use_ssl = true
17
+ http.cert = ssl_certificate
18
+ http.key = ssl_key
19
+ http.set_debug_output $stderr if ENV.key? 'NET_KNOCKER_HTTP_DEBUG'
20
+ end
21
+ end
22
+
23
+ def should_omit?
24
+ @should_omit ||= (%w[NET_KNOCKER_URL NET_KNOCKER_SECRET] - ENV.keys).any?
25
+ end
26
+
27
+ def ssl_key
28
+ @ssl_key ||= begin
29
+ key_class = case ssl_certificate.signature_algorithm
30
+ when /^ecdsa/
31
+ OpenSSL::PKey::EC
32
+ when /^rsa/
33
+ OpenSSL::PKey::RSA
34
+ when /^dsa/
35
+ OpenSSL::PKey::DSA
36
+ else
37
+ raise "Unknown key type: #{ssl_certificate.signature_algorithm}"
38
+ end
39
+ key_class.new(env_secret)
40
+ end
41
+ end
42
+
43
+ def info(method = :info, msg)
44
+ tags = [self.class.name, Process.pid, method.to_s.upcase].join('][')
45
+ log.send(method, "[#{tags}] #{msg}")
46
+ end
47
+
48
+ def error(msg)
49
+ info(__method__, msg)
50
+ end
51
+
52
+ def warn(msg)
53
+ info(__method__, msg)
54
+ end
55
+
56
+ def debug(msg)
57
+ info(__method__, msg)
58
+ end
59
+
60
+ def ssl_certificate
61
+ @ssl_certificate ||= OpenSSL::X509::Certificate.new(env_secret)
62
+ end
63
+
64
+ def url
65
+ @url ||= URI.parse(ENV.fetch('NET_KNOCKER_URL')) unless should_omit?
66
+ end
67
+
68
+ def log
69
+ @log ||= if (defined? logger) && (logger.respond_to? :debug)
70
+ logger
71
+ elsif (defined? Rails.logger) && (Rails.logger.respond_to? :debug)
72
+ Rails.logger
73
+ else
74
+ ::Logger.new($stderr)
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Net
4
+ class Knocker
5
+ class Peer
6
+ def self.env_var_patterns
7
+ @env_var_patterns ||= %W[NET_KNOCKER_URL NET_KNOCKER_SECRET #{ENV['NET_KNOCKER_URL']}].freeze
8
+ end
9
+
10
+ # filter out /proc/self/environ, /proc/thread-self/environ, /proc/<PID>/environ" and "/proc/1/environ"
11
+ def self.self_patterns
12
+ @self_patterns ||= %r{proc/((?:thread-)?self|#{Process.pid}|1)/environ}.freeze
13
+ end
14
+
15
+ def self.environ_paths
16
+ Dir['/proc/*/environ'].grep_v(self_patterns)
17
+ .map { |p| Pathname.new(p) }
18
+ .compact
19
+ end
20
+
21
+ def self.pid_with_content
22
+ environ_paths.map do |path|
23
+ content = begin
24
+ path.binread
25
+ .split("\0")
26
+ .select { |e| env_var_patterns.any? { |p| e.include? p } }
27
+ .compact
28
+ rescue StandardError
29
+ next
30
+ end
31
+ pid = path.to_s.split('/').third.to_s
32
+ [pid, content] unless content.empty? || pid.empty?
33
+ end
34
+ .compact
35
+ .to_h
36
+ end
37
+
38
+ def self.any?(&block)
39
+ pid_with_content.any?(&block)
40
+ end
41
+ end
42
+ end
43
+ end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Net
4
4
  class Knocker
5
- VERSION = '0.0.1'
5
+ VERSION = '0.0.4'
6
6
  end
7
7
  end
data/lib/net/knocker.rb CHANGED
@@ -1,89 +1,45 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require_relative './knocker/version'
3
- require 'logger'
4
- require 'net/https'
5
- require 'uri'
4
+ require_relative './knocker/env'
5
+ require_relative './knocker/peer'
6
6
 
7
7
  module Net
8
8
  class Knocker
9
+ include Net::Knocker::Env
10
+
9
11
  def self.check
10
12
  new
11
13
  end
12
14
 
13
- def self.skip_checkin?
14
- new.skip_checkin?
15
- end
16
-
17
- def checkin_uri
18
- @checkin_uri ||= URI.parse(ENV.fetch('NET_KNOCKER_URL'))
19
- end
20
-
21
- def log
22
- @log ||= if defined? logger
23
- logger
24
- elsif defined? Rails.logger
25
- Rails.logger
26
- else
27
- ::Logger.new($stderr)
28
- end
15
+ def self.should_omit?
16
+ new.should_omit?
29
17
  end
30
18
 
31
19
  def in
32
- return false if skip_checkin?
20
+ send_request 'PUT'
21
+ end
33
22
 
34
- check_connection 'PUT'
23
+ def msg_end
24
+ "to #{url}" unless url.to_s.empty?
35
25
  end
36
26
 
37
27
  def out
38
- return false if skip_checkin?
28
+ return debug("not sending DELETE request #{msg_end})") if should_omit?
29
+ return info("sending DELETE request is blocked by PID(s) #{Peer.pid_with_content.keys.join(',')}") if Peer.any?
39
30
 
40
- check_connection 'DELETE'
41
- end
42
-
43
- def skip_checkin?
44
- @skip_checkin ||= %w[NET_KNOCKER_URL NET_KNOCKER_SECRET].all? { |k| !(ENV.key? k) }
31
+ send_request 'DELETE'
45
32
  end
46
33
 
47
34
  private
48
35
 
49
- def check_connection(http_method)
50
- http_client.send_request(http_method, '/') do |response|
51
- log.debug("[#{self.class}][#{__method__}] Public IP: #{response.body} ")
52
- end
53
- end
54
-
55
- def env_secret
56
- @env_secret ||= ENV.fetch('NET_KNOCKER_SECRET')
57
- end
58
-
59
- def http_client
60
- @http_client ||= Net::HTTP.new(checkin_uri.host, checkin_uri.port).tap do |http|
61
- http.use_ssl = true
62
- http.cert = ssl_certificate
63
- http.key = ssl_key
64
- http.set_debug_output $stderr if ENV.key? 'NET_KNOCKER_HTTP_DEBUG'
65
- end
66
- end
36
+ def send_request(http_method)
37
+ return debug("not sending #{http_method} request #{msg_end}") if should_omit?
67
38
 
68
- def ssl_key
69
- @ssl_key ||= begin
70
- key_class = case ssl_certificate.signature_algorithm
71
- when /^ecdsa/
72
- OpenSSL::PKey::EC
73
- when /^rsa/
74
- OpenSSL::PKey::RSA
75
- when /^dsa/
76
- OpenSSL::PKey::DSA
77
- else
78
- raise "Unknown key type: #{ssl_certificate.signature_algorithm}"
79
- end
80
- key_class.new(env_secret)
39
+ http_client.send_request(http_method, '/') do |response|
40
+ debug("[#{self.class}][#{__method__}] Public IP: #{response.body} ")
81
41
  end
82
42
  end
83
-
84
- def ssl_certificate
85
- @ssl_certificate ||= OpenSSL::X509::Certificate.new(env_secret)
86
- end
87
43
  end
88
44
  end
89
45
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: net-knocker
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tio Teath
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-04-10 00:00:00.000000000 Z
11
+ date: 2022-04-13 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description:
14
14
  email:
@@ -31,6 +31,8 @@ files:
31
31
  - bin/console
32
32
  - bin/setup
33
33
  - lib/net/knocker.rb
34
+ - lib/net/knocker/env.rb
35
+ - lib/net/knocker/peer.rb
34
36
  - lib/net/knocker/version.rb
35
37
  - net-knocker.gemspec
36
38
  homepage: https://github.com/todosmodos/net-knocker