net-knocker 0.0.1 → 0.0.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
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