diff options
author | elijah <elijah@riseup.net> | 2017-01-05 10:46:40 -0800 |
---|---|---|
committer | elijah <elijah@riseup.net> | 2017-01-05 10:46:40 -0800 |
commit | 099eee57bcfcc7dc5ff0db48df266b0f30308bed (patch) | |
tree | 35fa4861dc1f13fc3627e7c8f421407c6f13faaa /lib | |
parent | 46badc1744bd8ebbc2bd49f0dad0841d5961e5c6 (diff) | |
parent | 6da8d11ec2f000353e952ff95abe27dd8c8381c8 (diff) |
Merge branch 'feature/ping'
Diffstat (limited to 'lib')
-rw-r--r-- | lib/leap_cli/commands/ping.rb | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/lib/leap_cli/commands/ping.rb b/lib/leap_cli/commands/ping.rb new file mode 100644 index 00000000..4283d9b3 --- /dev/null +++ b/lib/leap_cli/commands/ping.rb @@ -0,0 +1,58 @@ +module LeapCli; module Commands + + desc "Ping nodes to see if they are alive." + long_desc "Attempts to ping each node in the FILTER set." + arg_name "FILTER" + command :ping do |c| + c.flag 'timeout', :arg_name => "TIMEOUT", + :default_value => 2, :desc => 'Wait at most TIMEOUT seconds.' + c.flag 'count', :arg_name => "COUNT", + :default_value => 2, :desc => 'Ping COUNT times.' + c.action do |global, options, args| + do_ping(global, options, args) + end + end + + private + + def do_ping(global, options, args) + assert_bin!('ping') + + timeout = [options[:timeout].to_i, 1].max + count = [options[:count].to_i, 1].max + nodes = nil + + if args && args.any? + node = manager.disabled_node(args.first) + if node + nodes = Config::ObjectList.new + nodes.add(node.name, node) + end + end + + nodes ||= manager.filter! args + + threads = [] + nodes.each_node do |node| + threads << Thread.new do + cmd = "ping -i 0.2 -n -q -W #{timeout} -c #{count} #{node.ip_address} 2>&1" + log(2, cmd) + output = `#{cmd}` + if $?.success? + last = output.split("\n").last + times = last.split('=').last.strip + min, avg, max, mdev = times.split('/') + log("ping #{min} ms", host: node.name, color: :green) + else + log(:failed, "to ping #{node.ip_address}", host: node.name) + end + end + end + threads.map(&:join) + + log("done") + end + +end; end + + |