net-knocker 0.0.1 → 0.0.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
2
  SHA256:
3
- metadata.gz: 7d734c93c4e362b454bace35ef5f0e46efd227139cdafdb3c19c030a98961f85
4
- data.tar.gz: 53de1160612bbd364785b5e97ea84c343eeb27080621fbb0702bc13b0f3329fc
3
+ metadata.gz: a9789879bc518f157cbecee0b2275e9740cb424bc0e4337b57183c299b8a6c82
4
+ data.tar.gz: 2817492fa9cadde9138836aa266dfae4120d26c6b45aa4a4a14fd99a84cd8ed3
5
5
  SHA512:
6
- metadata.gz: c611fc7c1d7eaba3e86db70a4c386e98f8d394d1909d0ebee5f1972149384cf723e94470a20eea622ecb1083fabe588a3fed093ab841136569ec5d06d672d0db
7
- data.tar.gz: f8b6973f49d8d1152a4adee0d71c42e5c70c40adfb1fac8ab745695439c1bbd6c9cc047346a47530a811c77bae9c9dfbd859a9212d0a06a9ea53e552bb156a69
6
+ metadata.gz: f254f92c4758ac0b595244d4bb7aa9556a18fa0ffdedfa80273fe055b466cca7f862f2916601f9d8ac6d36d9576623abccb558147c590f339437b459b4189990
7
+ data.tar.gz: eff3af079d67b23c36b7d534d78c82c70863124804bb27582b2c913072a77d879b0cfc4ffa84ad766cb05b38d65965526d5ec62d9e379a852356229b148a50c1
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,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Net
4
+ class Knocker
5
+ module Env
6
+ def env_secret
7
+ @env_secret ||= ENV.fetch('NET_KNOCKER_SECRET')
8
+ end
9
+
10
+ def http_client
11
+ @http_client ||= Net::HTTP.new(url.host, url.port).tap do |http|
12
+ http.use_ssl = true
13
+ http.cert = ssl_certificate
14
+ http.key = ssl_key
15
+ http.set_debug_output $stderr if ENV.key? 'NET_KNOCKER_HTTP_DEBUG'
16
+ end
17
+ end
18
+
19
+ def should_omit?
20
+ @should_omit ||= (%w[NET_KNOCKER_URL NET_KNOCKER_SECRET] - ENV.keys).any?
21
+ end
22
+
23
+ def ssl_key
24
+ @ssl_key ||= begin
25
+ key_class = case ssl_certificate.signature_algorithm
26
+ when /^ecdsa/
27
+ OpenSSL::PKey::EC
28
+ when /^rsa/
29
+ OpenSSL::PKey::RSA
30
+ when /^dsa/
31
+ OpenSSL::PKey::DSA
32
+ else
33
+ raise "Unknown key type: #{ssl_certificate.signature_algorithm}"
34
+ end
35
+ key_class.new(env_secret)
36
+ end
37
+ end
38
+
39
+ def ssl_certificate
40
+ @ssl_certificate ||= OpenSSL::X509::Certificate.new(env_secret)
41
+ end
42
+
43
+ def url
44
+ @url ||= URI.parse(ENV.fetch('NET_KNOCKER_URL')) unless should_omit?
45
+ end
46
+
47
+ def log
48
+ @log ||= if defined? logger
49
+ logger
50
+ elsif defined? Rails.logger
51
+ Rails.logger
52
+ else
53
+ ::Logger.new($stderr)
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Net
4
+ class Knocker
5
+ class Peer
6
+ def self.any?
7
+ return unless ENV
8
+
9
+ Dir['/proc/*/environ']
10
+ .select { |path| File.readable_real? path }
11
+ .grep_v(self_patterns)
12
+ .select do |path|
13
+ File.read(path)
14
+ .then do |content|
15
+ (env_var_patterns.any? { |pattern| content.include? pattern })
16
+ end
17
+ end
18
+ .any?
19
+ end
20
+
21
+ def self.env_var_patterns
22
+ @env_var_patterns ||= %W[NET_KNOCKER_URL NET_KNOCKER_SECRET #{ENV['NET_KNOCKER_URL']}].freeze
23
+ end
24
+
25
+ def self.self_patterns
26
+ @self_patterns ||= %r{proc/((?:thread-)?self|#{Process.pid})/environ}.freeze
27
+ end
28
+ end
29
+ end
30
+ end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Net
4
4
  class Knocker
5
- VERSION = '0.0.1'
5
+ VERSION = '0.0.2'
6
6
  end
7
7
  end
data/lib/net/knocker.rb CHANGED
@@ -1,89 +1,43 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require_relative './knocker/version'
4
+ require_relative './knocker/env'
5
+ require_relative './knocker/peer'
3
6
  require 'logger'
4
7
  require 'net/https'
5
8
  require 'uri'
6
9
 
7
10
  module Net
8
11
  class Knocker
12
+ include Knocker::Env
13
+
9
14
  def self.check
10
15
  new
11
16
  end
12
17
 
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
18
+ def self.should_omit?
19
+ new.should_omit?
29
20
  end
30
21
 
31
22
  def in
32
- return false if skip_checkin?
33
-
34
- check_connection 'PUT'
23
+ send_request 'PUT'
35
24
  end
36
25
 
37
26
  def out
38
- return false if skip_checkin?
27
+ return log.info("[#{self.class}:#{Process.pid}] omitting send request") if Peer.any?
39
28
 
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) }
29
+ send_request 'DELETE'
45
30
  end
46
31
 
47
32
  private
48
33
 
49
- def check_connection(http_method)
34
+ def send_request(http_method)
35
+ return log.info("[#{self.class}:#{Process.pid}] omitting send request") if should_omit?
36
+
50
37
  http_client.send_request(http_method, '/') do |response|
51
38
  log.debug("[#{self.class}][#{__method__}] Public IP: #{response.body} ")
52
39
  end
53
40
  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
67
-
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)
81
- end
82
- end
83
-
84
- def ssl_certificate
85
- @ssl_certificate ||= OpenSSL::X509::Certificate.new(env_secret)
86
- end
87
41
  end
88
42
  end
89
43
 
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.2
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-12 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