messhy 0.4.0 → 0.5.0

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: b9b5c1546fc154030d0b9b39299e315d13988eefdf5437b2410b07fe1b2fe268
4
- data.tar.gz: f0e209b1a65ac6adbb1d15b3e17fdcf634b165ba07526b1ac1a5dfcdf1a3fcdb
3
+ metadata.gz: 5baf6451ca408d1f0072e1f10316eb683cb96a8ff81726febc60e0a3e30b85ac
4
+ data.tar.gz: e7d1079753416d0288c015daf01c8fb7701de4fc5c6f6eaa4fc65143cb480191
5
5
  SHA512:
6
- metadata.gz: f7aeb904c83b9323c12bb26ea665597e1528e862e8910bd7c918256bc9ac52c9f580040c01462f3c3a6f8a693b86a4839e990efebef12fa44ea6d26db4b75f4b
7
- data.tar.gz: 5562d98883977f7aa0312faec1ec966d0d26d4027e119253eeff66abdbbc26371471a898210e110ded737960f4d1359a1c15be9a912cd5a7a04e08171b27a257
6
+ metadata.gz: dd8ac97816e7670ce7e593663f4cb507340ce21f741728a9734f1c472ab3e151ac9d9540b626560de891e6b71ca3eab7abaa0d58148fc45b3f5096c43353e967
7
+ data.tar.gz: 47eb6507f60dbed0d9a7b3e8733b3abee88241a863e76d7618fe729bcc7053846fe71202ee94bf89720d85e36bb52ca9d885d05853166d79a4197570cb8bc23a
data/lib/messhy/cli.rb CHANGED
@@ -45,11 +45,6 @@ module Messhy
45
45
  handle_ssh_error(e, config)
46
46
  end
47
47
 
48
- desc 'health', 'Alias for status'
49
- def health
50
- status
51
- end
52
-
53
48
  desc 'ping NODE', 'Ping a specific node'
54
49
  def ping(node)
55
50
  config = load_config
@@ -25,6 +25,8 @@ module Messhy
25
25
  show_node_status(node_name)
26
26
  puts
27
27
  end
28
+
29
+ show_latency_matrix
28
30
  end
29
31
 
30
32
  def show_node_status(node_name)
@@ -157,6 +159,51 @@ module Messhy
157
159
 
158
160
  private
159
161
 
162
+ def show_latency_matrix
163
+ node_names = config.node_names
164
+ return if node_names.size < 2
165
+
166
+ puts '==> Latency Matrix (ms)'
167
+ puts
168
+
169
+ latencies = {}
170
+ tested_pairs = Set.new
171
+
172
+ node_names.each do |source|
173
+ node_names.each do |target|
174
+ next if source == target
175
+
176
+ pair_key = [source, target].sort.join('-')
177
+ next if tested_pairs.include?(pair_key)
178
+
179
+ tested_pairs.add(pair_key)
180
+ target_ip = config.node_config(target)['private_ip']
181
+ latency = @ssh_executor.measure_latency(source, target_ip)
182
+ latencies[[source, target]] = latency
183
+ latencies[[target, source]] = latency
184
+ end
185
+ end
186
+
187
+ max_name_len = node_names.map(&:length).max
188
+ header = ' ' * (max_name_len + 2) + node_names.map { |n| n[0..7].rjust(8) }.join(' ')
189
+ puts header
190
+ puts '-' * header.length
191
+
192
+ node_names.each do |source|
193
+ row = node_names.map do |target|
194
+ if source == target
195
+ ' - '
196
+ else
197
+ lat = latencies[[source, target]]
198
+ lat ? format('%7.1f ', lat) : ' N/A '
199
+ end
200
+ end
201
+ puts "#{source.ljust(max_name_len)} #{row.join(' ')}"
202
+ end
203
+
204
+ puts
205
+ end
206
+
160
207
  def handshake_recent?(source_name, target_ip, status_cache)
161
208
  status = status_cache[source_name] ||= @ssh_executor.get_wireguard_status(source_name)
162
209
  peer_block = WireguardStatusParser.extract_peer_block(status, target_ip)
@@ -172,6 +172,19 @@ module Messhy
172
172
  false
173
173
  end
174
174
 
175
+ def measure_latency(source_node, target_ip)
176
+ latency = nil
177
+ execute_on_node(source_node) do
178
+ output = capture(:ping, '-c', '3', '-W', '2', '-I', 'wg0', target_ip, raise_on_non_zero_exit: false)
179
+ if output =~ %r{rtt min/avg/max/mdev = [\d.]+/([\d.]+)/}
180
+ latency = ::Regexp.last_match(1).to_f
181
+ end
182
+ end
183
+ latency
184
+ rescue StandardError
185
+ nil
186
+ end
187
+
175
188
  def test_tcp_connectivity(source_node, target_ip, port = 22)
176
189
  success = false
177
190
  execute_on_node(source_node) do
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Messhy
4
- VERSION = '0.4.0'
4
+ VERSION = '0.5.0'
5
5
  end
@@ -9,11 +9,6 @@ namespace :messhy do
9
9
  system('bundle exec messhy setup')
10
10
  end
11
11
 
12
- desc 'Check VPN mesh connectivity'
13
- task :health do
14
- system('bundle exec messhy health')
15
- end
16
-
17
12
  desc 'Generate new WireGuard keys'
18
13
  task :keygen do
19
14
  system('bundle exec messhy keygen')
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: messhy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - BoringCache
@@ -156,7 +156,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
156
156
  - !ruby/object:Gem::Version
157
157
  version: '0'
158
158
  requirements: []
159
- rubygems_version: 3.6.7
159
+ rubygems_version: 3.7.2
160
160
  specification_version: 4
161
161
  summary: WireGuard VPN mesh for Ruby & Rails apps
162
162
  test_files: []