summaryrefslogtreecommitdiff
path: root/lib/net/ssh/connection/keepalive.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/net/ssh/connection/keepalive.rb')
-rw-r--r--lib/net/ssh/connection/keepalive.rb47
1 files changed, 47 insertions, 0 deletions
diff --git a/lib/net/ssh/connection/keepalive.rb b/lib/net/ssh/connection/keepalive.rb
new file mode 100644
index 0000000..6b0daa8
--- /dev/null
+++ b/lib/net/ssh/connection/keepalive.rb
@@ -0,0 +1,47 @@
+module Net; module SSH; module Connection
+
+module Keepalive
+ # Default IO.select timeout threshold
+ DEFAULT_IO_SELECT_TIMEOUT = 300
+
+ def initialize_keepalive
+ @last_keepalive_sent_at = nil
+ @unresponded_keepalive_count = 0
+ end
+
+ def keepalive_enabled?
+ options[:keepalive]
+ end
+
+ def keepalive_interval
+ options[:keepalive_interval] || DEFAULT_IO_SELECT_TIMEOUT
+ end
+
+ def should_send_keepalive?
+ return false unless keepalive_enabled?
+ return true unless @last_keepalive_sent_at
+ Time.now - @last_keepalive_sent_at >= keepalive_interval
+ end
+
+ def keepalive_maxcount
+ (options[:keepalive_maxcount] || 3).to_i
+ end
+
+ def send_keepalive_as_needed(readers, writers)
+ return unless readers.nil? && writers.nil?
+ return unless should_send_keepalive?
+ info { "sending keepalive #{@unresponded_keepalive_count}" }
+
+ @unresponded_keepalive_count += 1
+ send_global_request("keepalive@openssh.com") { |success, response|
+ @unresponded_keepalive_count = 0
+ }
+ if keepalive_maxcount > 0 && @unresponded_keepalive_count > keepalive_maxcount
+ error { "Timeout, server #{host} not responding. Missed #{@unresponded_keepalive_count} timeouts." }
+ raise Net::SSH::Timeout, "Timeout, server #{host} not responding."
+ end
+ @last_keepalive_sent_at = Time.now
+ end
+end
+
+end; end; end \ No newline at end of file