module Meroku # Gives object the ability to execute bash commands on itself via ssh module Tunnelable # rubocop:disable Metrics/AbcSize,Metrics/MethodLength def tunnel_run(cmd) retries = 0 begin code = nil Net::SSH.start(@tunnel_ip, @tunnel_username, keys: @tunnel_key_name, verify_host_key: false) do |ssh| ssh.open_channel do |channel| puts cmd channel.exec cmd do |ch, success| raise "could not execute command" unless success ch.on_data { |_c, data| print data } ch.on_extended_data { |_c, _type, data| print data } ch.on_request("exit-status") { |_ch, data| code = data.read_long } end end.wait end abort "#{cmd} returned #{code} !!" if code != 0 rescue Net::SSH::ConnectionTimeout puts "Net::SSH::ConnectionTimeout" && retry if (retries += 1) < 3 rescue Errno::ECONNREFUSED puts "Net::SSH::ConnectionTimeout" && retry if (retries += 1) < 3 end end end end