class Rosh
Constants
- VERSION
Public Class Methods
new(*args)
click to toggle source
# File lib/rosh.rb, line 8 def initialize(*args) @interval = 3 @ssh_opts = [] alive_interval = 5 @escape = '^t' OptionParser.new("test").tap do |opt| opt.banner = 'Usage: rosh [options] hostname [session-name]' opt.on('-a alive-interval'){|v| alive_interval = v.to_i} opt.on('-e escape'){|v| @escape = v} opt.on('-I interval'){|v| @interval = v.to_f} end.parse! args @host, @name = *args, :default abort 'hostname is required' if @host == :default @ssh_opts << "-o ServerAliveInterval=#{alive_interval}" @ssh_opts << "-o ServerAliveCountMax=1" # check ~/.ssh/config to resolve alias name config = Net::SSH::Config.for(@host) @host = config[:host_name] if config[:host_name] @ssh_opts << "-l #{config[:user]}" if config[:user] @ssh_opts << "-p #{config[:port]}" if config[:port] if keys = config[:keys] keys.each{|k| @ssh_opts << "-i #{k}"} end @first_try = true end
Public Instance Methods
connect()
click to toggle source
# File lib/rosh.rb, line 35 def connect reconnect until system ["ssh", *@ssh_opts, resolv, '-t', "'screen -rx #{@name}'", '2>/dev/null']*' ' end
reconnect()
click to toggle source
# File lib/rosh.rb, line 40 def reconnect if @first_try if !sh('-p 0 -X echo ok', '2>&1 >/dev/null') print "creating new screen session #{@name}... " if sh %{-c /dev/null -e "#{@escape*2}" -dm} and sh '-p 0 -X eval "stuff STY=\\040screen\\015"' puts "done." else puts "failed." end end @first_try = false else sleep [@last_try - Time.now + @interval, 0].max if @last_try puts "reconnecting..." @last_try = Time.now end end
Private Instance Methods
resolv()
click to toggle source
# File lib/rosh.rb, line 64 def resolv uri = URI("//#{@host}") uri.host = Resolv::DNS.new.getaddress(uri.host).to_s uri.to_s[2..-1] rescue Exception @host end
sh(a, r=nil)
click to toggle source
# File lib/rosh.rb, line 60 def sh(a, r=nil) system "ssh #{resolv} #{@ssh_opts*' '} 'screen -S #{@name} #{a}' #{r}" end