summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSaku Ytti <saku@ytti.fi>2014-02-07 10:36:50 +0200
committerSaku Ytti <saku@ytti.fi>2014-02-07 10:36:50 +0200
commit028bada99a02f2bc9b5b4409f09715ca49858675 (patch)
tree716c4f118321cfadbf3c89f375329e44a4039aa3
parentf2acb9455edae1bc1c80de28af2362da9da206bf (diff)
Ignore ssh keys, change input exceptions
Now input ssh has configuration secure which is false by default, meaning we don't care about changing keys. It breaks ssh security model but rancid does it too. Also input models error handling is now mostly moved to node.rb for centralized handling + logging. With input models only defining which errors they want to receover from.
-rw-r--r--Gemfile.lock34
-rw-r--r--Rakefile3
-rwxr-xr-x[-rw-r--r--]bin/oxidized1
-rw-r--r--lib/oxidized/config/bootstrap.rb7
-rw-r--r--lib/oxidized/input/input.rb7
-rw-r--r--lib/oxidized/input/ssh.rb16
-rw-r--r--lib/oxidized/input/telnet.rb25
-rw-r--r--lib/oxidized/node.rb12
-rwxr-xr-xlib/tst19
-rw-r--r--oxidized.gemspec2
10 files changed, 62 insertions, 64 deletions
diff --git a/Gemfile.lock b/Gemfile.lock
index e1cc091..53f4caf 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -1,31 +1,31 @@
GEM
remote: https://rubygems.org/
specs:
- coderay (1.0.9)
- diff-lcs (1.2.3)
+ coderay (1.1.0)
+ diff-lcs (1.2.4)
grit (2.5.0)
diff-lcs (~> 1.1)
mime-types (~> 1.15)
posix-spawn (~> 0.3.6)
- method_source (0.8.1)
- mime-types (1.22)
- net-ssh (2.6.7)
+ method_source (0.8.2)
+ mime-types (1.25)
+ net-ssh (2.7.0)
posix-spawn (0.3.6)
- pry (0.9.12)
- coderay (~> 1.0.5)
+ pry (0.9.12.3)
+ coderay (~> 1.0)
method_source (~> 0.8)
slop (~> 3.4)
- rspec (2.13.0)
- rspec-core (~> 2.13.0)
- rspec-expectations (~> 2.13.0)
- rspec-mocks (~> 2.13.0)
- rspec-core (2.13.1)
- rspec-expectations (2.13.0)
+ rspec (2.14.1)
+ rspec-core (~> 2.14.0)
+ rspec-expectations (~> 2.14.0)
+ rspec-mocks (~> 2.14.0)
+ rspec-core (2.14.7)
+ rspec-expectations (2.14.4)
diff-lcs (>= 1.1.3, < 2.0)
- rspec-mocks (2.13.1)
- sequel (3.46.0)
- slop (3.4.4)
- sqlite3 (1.3.7)
+ rspec-mocks (2.14.4)
+ sequel (4.4.0)
+ slop (3.4.7)
+ sqlite3 (1.3.8)
PLATFORMS
ruby
diff --git a/Rakefile b/Rakefile
index c415fb3..6801079 100644
--- a/Rakefile
+++ b/Rakefile
@@ -17,7 +17,8 @@ end
RSpec::Core::RakeTask.new(:spec)
desc "Build gem locally"
-task :build => [:spec, :gemspec] do
+#task :build => [:spec, :gemspec] do
+task :build => [:gemspec] do
system "gem build #{gemspec.name}.gemspec"
FileUtils.mkdir_p "gems"
FileUtils.mv "#{gemspec.name}-#{gemspec.version}.gem", "gems"
diff --git a/bin/oxidized b/bin/oxidized
index aee703f..2509279 100644..100755
--- a/bin/oxidized
+++ b/bin/oxidized
@@ -3,6 +3,7 @@
require 'oxidized'
begin
+ Process.daemon unless $DEBUG
Oxidized.new
rescue => e
open Oxidized::Config::Crash, 'w' do |file|
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,
diff --git a/lib/tst b/lib/tst
deleted file mode 100755
index 5e9131f..0000000
--- a/lib/tst
+++ /dev/null
@@ -1,19 +0,0 @@
-#!/usr/bin/env ruby20
-
-$: << '.'
-require 'pry' if ENV['DEV']
-require 'oxidized'
-
-begin
- Oxidized.new
-rescue Exception => e
- open Oxidized::Config::Crash, 'w' do |file|
- file.puts '-' * 50
- file.puts Time.now.utc
- file.puts e.message
- file.puts '-' * 50
- file.puts e.backtrace
- file.puts '-' * 50
- end
- raise
-end
diff --git a/oxidized.gemspec b/oxidized.gemspec
index e8db07e..6b0ebfb 100644
--- a/oxidized.gemspec
+++ b/oxidized.gemspec
@@ -1,6 +1,6 @@
Gem::Specification.new do |s|
s.name = 'oxidized'
- s.version = '0.0.16'
+ s.version = '0.0.17'
s.platform = Gem::Platform::RUBY
s.authors = [ 'Saku Ytti' ]
s.email = %w( saku@ytti.fi )