net-knocker 0.0.4 → 0.0.6
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 +4 -4
- data/README.md +1 -1
- data/lib/net/knocker/env.rb +22 -7
- data/lib/net/knocker/peer.rb +43 -24
- data/lib/net/knocker/version.rb +1 -1
- data/lib/net/knocker.rb +7 -6
- data/net-knocker.gemspec +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 8a38824a21ea2beda34df5f73f6be239301b3aa40fe7b83a41c9d2c384af1ca3
|
|
4
|
+
data.tar.gz: 487b9e354c702565c4aeb4e95595a39e9b38b9979d40112175f7aea3add534cf
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: ae90907f7a0d12d3b189f2df89fca91013b127fd5e7126391e2c2de35d850750c4c27f911b9b31cb448332c336cf9fef1cc5337d25fdfbbab40dcec2c5fb582e
|
|
7
|
+
data.tar.gz: 28880d5f8e3937140eb1648fdc11aa995880b5afc3ad4e1f9873ef1a14410f93fd1697e5b495c9570cdd7c0286edc439d54ef4d4bc47ba19bb7eb805aedf7b67
|
data/README.md
CHANGED
data/lib/net/knocker/env.rb
CHANGED
|
@@ -16,7 +16,7 @@ module Net
|
|
|
16
16
|
http.use_ssl = true
|
|
17
17
|
http.cert = ssl_certificate
|
|
18
18
|
http.key = ssl_key
|
|
19
|
-
http.set_debug_output $stderr if ENV.key? '
|
|
19
|
+
http.set_debug_output $stderr if ENV.key? 'NET_KNOCKER_DEBUG'
|
|
20
20
|
end
|
|
21
21
|
end
|
|
22
22
|
|
|
@@ -40,21 +40,30 @@ module Net
|
|
|
40
40
|
end
|
|
41
41
|
end
|
|
42
42
|
|
|
43
|
-
def info(method = :info
|
|
44
|
-
tags = [
|
|
43
|
+
def info(msg, method = :info)
|
|
44
|
+
tags = [Net::Knocker, Process.pid, method.to_s.upcase].join('][')
|
|
45
45
|
log.send(method, "[#{tags}] #{msg}")
|
|
46
46
|
end
|
|
47
47
|
|
|
48
48
|
def error(msg)
|
|
49
|
-
info(
|
|
49
|
+
info(msg, __method__)
|
|
50
50
|
end
|
|
51
51
|
|
|
52
52
|
def warn(msg)
|
|
53
|
-
info(
|
|
53
|
+
info(msg, __method__)
|
|
54
54
|
end
|
|
55
55
|
|
|
56
56
|
def debug(msg)
|
|
57
|
-
|
|
57
|
+
return unless debugging?
|
|
58
|
+
|
|
59
|
+
info(msg, __method__)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def debugging?
|
|
63
|
+
@debugging ||= begin
|
|
64
|
+
env_debug = ENV.fetch('NET_KNOCKER_DEBUG', false).to_s.downcase
|
|
65
|
+
%w[true yes yep 1].include? env_debug
|
|
66
|
+
end
|
|
58
67
|
end
|
|
59
68
|
|
|
60
69
|
def ssl_certificate
|
|
@@ -62,7 +71,9 @@ module Net
|
|
|
62
71
|
end
|
|
63
72
|
|
|
64
73
|
def url
|
|
65
|
-
|
|
74
|
+
return if should_omit?
|
|
75
|
+
|
|
76
|
+
@url ||= URI.parse(ENV.fetch('NET_KNOCKER_URL'))
|
|
66
77
|
end
|
|
67
78
|
|
|
68
79
|
def log
|
|
@@ -74,6 +85,10 @@ module Net
|
|
|
74
85
|
::Logger.new($stderr)
|
|
75
86
|
end
|
|
76
87
|
end
|
|
88
|
+
|
|
89
|
+
def var_names
|
|
90
|
+
@var_names ||= %w[NET_KNOCKER_SECRET NET_KNOCKER_URL].freeze
|
|
91
|
+
end
|
|
77
92
|
end
|
|
78
93
|
end
|
|
79
94
|
end
|
data/lib/net/knocker/peer.rb
CHANGED
|
@@ -1,42 +1,61 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require_relative 'env'
|
|
3
4
|
module Net
|
|
4
5
|
class Knocker
|
|
5
6
|
class Peer
|
|
6
|
-
|
|
7
|
-
|
|
7
|
+
extend Env
|
|
8
|
+
|
|
9
|
+
attr_reader :pid, :exe, :environ_path
|
|
10
|
+
|
|
11
|
+
def initialize(pid)
|
|
12
|
+
@pid = pid
|
|
13
|
+
@exe ||= Pathname("/proc/#{pid}/exe").realpath
|
|
14
|
+
@environ_path ||= Pathname("/proc/#{pid}/environ")
|
|
8
15
|
end
|
|
9
16
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
17
|
+
def environ
|
|
18
|
+
@environ ||= environ_path.binread.split("\0").map do |line|
|
|
19
|
+
line.split('=', 2)
|
|
20
|
+
end.to_h
|
|
13
21
|
end
|
|
14
22
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
23
|
+
# rubocop:todo Metrics/PerceivedComplexity
|
|
24
|
+
# rubocop:todo Metrics/AbcSize
|
|
25
|
+
def self.try_peer(path) # rubocop:todo Metrics/CyclomaticComplexity, Metrics/AbcSize, Metrics/PerceivedComplexity
|
|
26
|
+
pid = File.basename(path).to_i
|
|
27
|
+
return if pid.zero? || (pid.eql? Process.pid)
|
|
28
|
+
|
|
29
|
+
peer_candidate = new(pid)
|
|
30
|
+
return unless peer_candidate.exe.basename.eql? Pathname('/proc/self/exe').realpath.basename
|
|
31
|
+
return unless var_names.all? { |e| peer_candidate.environ.key? e }
|
|
32
|
+
return unless URI.parse(peer_candidate.environ.fetch('NET_KNOCKER_URL')).eql? url
|
|
33
|
+
return unless peer_candidate.environ.fetch('NET_KNOCKER_SECRET').eql? env_secret
|
|
34
|
+
|
|
35
|
+
peer_candidate
|
|
36
|
+
rescue Errno::EACCES
|
|
37
|
+
nil
|
|
38
|
+
rescue StandardError => e
|
|
39
|
+
debug "non-crical exception raised: #{e.class}: #{e.message}"
|
|
40
|
+
nil
|
|
19
41
|
end
|
|
42
|
+
# rubocop:enable Metrics/AbcSize
|
|
43
|
+
# rubocop:enable Metrics/PerceivedComplexity
|
|
20
44
|
|
|
21
|
-
def self.
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
.split("\0")
|
|
26
|
-
.select { |e| env_var_patterns.any? { |p| e.include? p } }
|
|
27
|
-
.compact
|
|
28
|
-
rescue StandardError
|
|
29
|
-
next
|
|
45
|
+
def self.peers
|
|
46
|
+
@peers ||= Dir['/proc/*/'].map do |path|
|
|
47
|
+
try_peer(path).tap do |p|
|
|
48
|
+
debug("peer found #{p.pid}") unless p.nil?
|
|
30
49
|
end
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
.
|
|
50
|
+
end.compact
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def self.pids
|
|
54
|
+
@pids ||= peers.map(&:pid)
|
|
36
55
|
end
|
|
37
56
|
|
|
38
57
|
def self.any?(&block)
|
|
39
|
-
|
|
58
|
+
peers.any?(&block)
|
|
40
59
|
end
|
|
41
60
|
end
|
|
42
61
|
end
|
data/lib/net/knocker/version.rb
CHANGED
data/lib/net/knocker.rb
CHANGED
|
@@ -17,16 +17,19 @@ module Net
|
|
|
17
17
|
end
|
|
18
18
|
|
|
19
19
|
def in
|
|
20
|
+
return debug(omit_message('PUT')) if should_omit?
|
|
21
|
+
|
|
20
22
|
send_request 'PUT'
|
|
21
23
|
end
|
|
22
24
|
|
|
23
|
-
def
|
|
24
|
-
"to #{url}"
|
|
25
|
+
def omit_message(http_method = 'DELETE')
|
|
26
|
+
msg_end = url.to_s.empty? ? '' : "to #{url}"
|
|
27
|
+
"not sending #{http_method} request #{msg_end}"
|
|
25
28
|
end
|
|
26
29
|
|
|
27
30
|
def out
|
|
28
|
-
return debug(
|
|
29
|
-
return info("
|
|
31
|
+
return debug(omit_message) if should_omit?
|
|
32
|
+
return info("#{omit_message}, blocked by PID(s) #{Peer.pids.join(',')}") if Peer.any?
|
|
30
33
|
|
|
31
34
|
send_request 'DELETE'
|
|
32
35
|
end
|
|
@@ -34,8 +37,6 @@ module Net
|
|
|
34
37
|
private
|
|
35
38
|
|
|
36
39
|
def send_request(http_method)
|
|
37
|
-
return debug("not sending #{http_method} request #{msg_end}") if should_omit?
|
|
38
|
-
|
|
39
40
|
http_client.send_request(http_method, '/') do |response|
|
|
40
41
|
debug("[#{self.class}][#{__method__}] Public IP: #{response.body} ")
|
|
41
42
|
end
|
data/net-knocker.gemspec
CHANGED
|
@@ -11,7 +11,7 @@ Gem::Specification.new do |spec|
|
|
|
11
11
|
spec.summary = 'Use Mutual TLS to knock to remote endpoint.'
|
|
12
12
|
# spec.description = ''
|
|
13
13
|
spec.homepage = 'https://github.com/todosmodos/net-knocker'
|
|
14
|
-
spec.required_ruby_version = Gem::Requirement.new('>= 2.4.0')
|
|
14
|
+
spec.required_ruby_version = Gem::Requirement.new('>= 2.4.0') # rubocop:todo Gemspec/RequiredRubyVersion
|
|
15
15
|
|
|
16
16
|
# spec.metadata['homepage_uri'] = spec.homepage
|
|
17
17
|
# spec.metadata['source_code_uri'] = 'TODO: Put your gem's public repo URL here.'
|
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.
|
|
4
|
+
version: 0.0.6
|
|
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-
|
|
11
|
+
date: 2022-04-14 00:00:00.000000000 Z
|
|
12
12
|
dependencies: []
|
|
13
13
|
description:
|
|
14
14
|
email:
|