diff options
Diffstat (limited to 'lib/oxidized')
-rw-r--r-- | lib/oxidized/config/bootstrap.rb | 7 | ||||
-rw-r--r-- | lib/oxidized/input/input.rb | 7 | ||||
-rw-r--r-- | lib/oxidized/input/ssh.rb | 16 | ||||
-rw-r--r-- | lib/oxidized/input/telnet.rb | 25 | ||||
-rw-r--r-- | lib/oxidized/node.rb | 12 |
5 files changed, 41 insertions, 26 deletions
diff --git a/lib/oxidized/config/bootstrap.rb b/lib/oxidized/config/bootstrap.rb index bae2b70..73750de 100644 --- a/lib/oxidized/config/bootstrap.rb +++ b/lib/oxidized/config/bootstrap.rb @@ -14,8 +14,11 @@ module Oxidized CFG.vars = { :enable => 'enablePW', } - CFG.input = { - :default => 'ssh, telnet', + CFG.input = { + :default => 'ssh, telnet', + :ssh => { + :secure => false, + } } CFG.output = { :default => 'git', diff --git a/lib/oxidized/input/input.rb b/lib/oxidized/input/input.rb index e028ce4..d59c4f3 100644 --- a/lib/oxidized/input/input.rb +++ b/lib/oxidized/input/input.rb @@ -1,5 +1,12 @@ module Oxidized class Input + RescueFail = [ + Timeout::Error, + Errno::ECONNREFUSED, + Errno::ECONNRESET, + Errno::EHOSTUNREACH, + Errno::EPIPE, + ] class << self def inherited klass Oxidized.mgr.loader = { :class => klass } diff --git a/lib/oxidized/input/ssh.rb b/lib/oxidized/input/ssh.rb index dc90354..b060418 100644 --- a/lib/oxidized/input/ssh.rb +++ b/lib/oxidized/input/ssh.rb @@ -2,6 +2,10 @@ module Oxidized require 'net/ssh' require 'oxidized/input/cli' class SSH < Input + RescueFail = [ + Net::SSH::Disconnect, + Net::SSH::AuthenticationFailed, + ] include CLI class NoShell < StandardError; end @@ -9,14 +13,12 @@ module Oxidized @node = node @output = '' @node.model.cfg['ssh'].each { |cb| instance_exec &cb } - begin - @ssh = Net::SSH.start @node.ip, @node.auth[:username], - :password => @node.auth[:password], :timeout => CFG.timeout - rescue Timeout::Error, Errno::ECONNREFUSED, Errno::ECONNRESET, Errno::EHOSTUNREACH, Net::SSH::Disconnect - return false - end + secure = CFG.input[:ssh][:secure] + @ssh = Net::SSH.start @node.ip, @node.auth[:username], + :password => @node.auth[:password], :timeout => CFG.timeout, + :paranoid => secure open_shell @ssh unless @exec - not @ssh.closed? + @ssh and not @ssh.closed? end def cmd cmd, expect=@node.prompt diff --git a/lib/oxidized/input/telnet.rb b/lib/oxidized/input/telnet.rb index 26755ca..0ae6877 100644 --- a/lib/oxidized/input/telnet.rb +++ b/lib/oxidized/input/telnet.rb @@ -2,6 +2,7 @@ module Oxidized require 'net/telnet' require 'oxidized/input/cli' class Telnet < Input + RescueFail = [] include CLI attr_reader :telnet @@ -9,28 +10,20 @@ module Oxidized @node = node @timeout = CFG.timeout @node.model.cfg['telnet'].each { |cb| instance_exec &cb } - begin - @telnet = Net::Telnet.new 'Host' => @node.ip, 'Waittime' => @timeout, - 'Model' => @node.model - expect username - @telnet.puts @node.auth[:username] - expect password - @telnet.puts @node.auth[:password] - expect @node.prompt - rescue Timeout::Error, Errno::ECONNREFUSED, Errno::ECONNRESET, Errno::EPIPE, Errno::EHOSTUNREACH - return false - end + @telnet = Net::Telnet.new 'Host' => @node.ip, 'Waittime' => @timeout, + 'Model' => @node.model + expect username + @telnet.puts @node.auth[:username] + expect password + @telnet.puts @node.auth[:password] + expect @node.prompt end def cmd cmd, expect=@node.prompt Log.debug "Telnet: #{cmd} @#{@node.name}" args = { 'String' => cmd } args.merge!({ 'Match' => expect, 'Timeout' => @timeout }) if expect - begin - @telnet.cmd args - rescue Timeout::Error, Errno::ECONNRESET, Errno::EPIPE - return false - end + @telnet.cmd args end def send data diff --git a/lib/oxidized/node.rb b/lib/oxidized/node.rb index 0b307b7..31f26a9 100644 --- a/lib/oxidized/node.rb +++ b/lib/oxidized/node.rb @@ -21,7 +21,7 @@ module Oxidized status, config = :fail, nil @input.each do |input| @model.input = input = input.new - if input.connect self + if connect input config = input.get status = :success if config break @@ -32,6 +32,16 @@ module Oxidized [status, config] end + def connect input + rescue_fail = input.class::RescueFail + input.class.superclass::RescueFail + begin + input.connect self + rescue *rescue_fail => err + Log.warn '%s raised %s with msg' % [self.ip, err.class, err.message] + return false + end + end + def serialize h = { :name => @name, |