summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/oxidized/config.rb12
-rw-r--r--lib/oxidized/input/input.rb2
-rw-r--r--lib/oxidized/model/acos.rb4
-rw-r--r--lib/oxidized/model/ios.rb6
-rw-r--r--lib/oxidized/model/iosxr.rb4
-rw-r--r--lib/oxidized/model/model.rb4
-rw-r--r--lib/oxidized/node.rb9
-rw-r--r--lib/oxidized/source/sql.rb7
8 files changed, 38 insertions, 10 deletions
diff --git a/lib/oxidized/config.rb b/lib/oxidized/config.rb
index 9e5ec60..fd120b6 100644
--- a/lib/oxidized/config.rb
+++ b/lib/oxidized/config.rb
@@ -9,6 +9,17 @@ module Oxidized
ModelDir = File.join Directory, %w(lib oxidized model)
SourceDir = File.join Directory, %w(lib oxidized source)
Sleep = 1
+
+ module Vars
+ # convenience method for accessing node, group or global level user variables
+ # nil values will be ignored
+ def vars name
+ r = @node.vars[name]
+ r ||= CFG.groups[@node.group].vars[name.to_s] if CFG.groups.has_key?(@node.group)
+ r ||= CFG.vars[name.to_s]
+ end
+ end
+
end
class << self
attr_accessor :mgr
@@ -25,6 +36,7 @@ module Oxidized
CFGS.default.prompt = /^([\w.@-]+[#>]\s?)$/
CFGS.default.rest = '0.0.0.0:8888' # or false to disable
CFGS.default.vars = {} # could be 'enable'=>'enablePW'
+ CFGS.default.groups = {} # group level configuration
CFGS.default.remove_secret = false # runs cmd(:secret) blocks if true
CFGS.default.input.default = 'ssh, telnet'
diff --git a/lib/oxidized/input/input.rb b/lib/oxidized/input/input.rb
index a64a1f4..769b196 100644
--- a/lib/oxidized/input/input.rb
+++ b/lib/oxidized/input/input.rb
@@ -1,5 +1,7 @@
module Oxidized
class Input
+ include Oxidized::Config::Vars
+
RescueFail = {
:debug => [
Errno::ECONNREFUSED,
diff --git a/lib/oxidized/model/acos.rb b/lib/oxidized/model/acos.rb
index f06bc93..75fbacf 100644
--- a/lib/oxidized/model/acos.rb
+++ b/lib/oxidized/model/acos.rb
@@ -55,10 +55,10 @@ class ACOS < Oxidized::Model
cfg :telnet, :ssh do
# preferred way to handle additional passwords
- if CFG.vars.enable?
+ if vars :enable
post_login do
send "enable\n"
- send CFG.vars.enable + "\n"
+ send vars(:enable) + "\n"
end
end
post_login 'terminal length 0'
diff --git a/lib/oxidized/model/ios.rb b/lib/oxidized/model/ios.rb
index c0994c2..e557469 100644
--- a/lib/oxidized/model/ios.rb
+++ b/lib/oxidized/model/ios.rb
@@ -12,7 +12,7 @@ class IOS < Oxidized::Model
# non-preferred way to handle additional PW prompt
#expect /^[\w.]+>$/ do |data|
# send "enable\n"
- # send CFG.vars.enable + "\n"
+ # send vars(:enable) + "\n"
# data
#end
@@ -45,10 +45,10 @@ class IOS < Oxidized::Model
post_login 'terminal length 0'
post_login 'terminal width 0'
# preferred way to handle additional passwords
- if CFG.vars.enable?
+ if vars :enable
post_login do
send "enable\n"
- send CFG.vars.enable + "\n"
+ send vars(:enable) + "\n"
end
end
pre_logout 'exit'
diff --git a/lib/oxidized/model/iosxr.rb b/lib/oxidized/model/iosxr.rb
index 023dcca..1129a0c 100644
--- a/lib/oxidized/model/iosxr.rb
+++ b/lib/oxidized/model/iosxr.rb
@@ -29,10 +29,10 @@ class IOSXR < Oxidized::Model
cfg :telnet, :ssh do
post_login 'terminal length 0'
post_login 'terminal width 0'
- if CFG.vars.enable?
+ if vars :enable
post_login do
send "enable\n"
- send CFG.vars.enable + "\n"
+ send vars(:enable) + "\n"
end
end
pre_logout 'exit'
diff --git a/lib/oxidized/model/model.rb b/lib/oxidized/model/model.rb
index 6e44039..277a01b 100644
--- a/lib/oxidized/model/model.rb
+++ b/lib/oxidized/model/model.rb
@@ -1,5 +1,7 @@
module Oxidized
class Model
+ include Oxidized::Config::Vars
+
class << self
def inherited klass
klass.instance_variable_set '@cmd', Hash.new { |h,k| h[k] = [] }
@@ -71,7 +73,7 @@ module Oxidized
end
end
- attr_accessor :input
+ attr_accessor :input, :node
def cmd string, &block
out = @input.cmd string
diff --git a/lib/oxidized/node.rb b/lib/oxidized/node.rb
index fce4c21..0537e45 100644
--- a/lib/oxidized/node.rb
+++ b/lib/oxidized/node.rb
@@ -3,7 +3,7 @@ module Oxidized
class MethodNotFound < OxidizedError; end
class ModelNotFound < OxidizedError; end
class Node
- attr_reader :name, :ip, :model, :input, :output, :group, :auth, :prompt
+ attr_reader :name, :ip, :model, :input, :output, :group, :auth, :prompt, :vars
attr_accessor :last, :running, :user, :msg, :from
alias :running? :running
def initialize opt
@@ -15,6 +15,10 @@ module Oxidized
@model = resolve_model opt
@auth = resolve_auth opt
@prompt = resolve_prompt opt
+ @vars = opt[:vars]
+
+ # model instance needs to access node instance
+ @model.node = self
end
def run
@@ -73,6 +77,7 @@ module Oxidized
:group => @group,
:model => @model.class.to_s,
:last => nil,
+ :vars => @vars,
}
h[:full_name] = [@group, @name].join('/') if @group
if @last
@@ -138,7 +143,7 @@ module Oxidized
if not Oxidized.mgr.model[model]
Oxidized.mgr.add_model model or raise ModelNotFound, "#{model} not found for node #{ip}"
end
- Oxidized.mgr.model[model].new
+ Oxidized.mgr.model[model].new
end
end
diff --git a/lib/oxidized/source/sql.rb b/lib/oxidized/source/sql.rb
index 1c4c33e..a115da8 100644
--- a/lib/oxidized/source/sql.rb
+++ b/lib/oxidized/source/sql.rb
@@ -35,9 +35,16 @@ class SQL < Source
Sequel.sqlite @cfg.file
end
db[@cfg.table.to_sym].each do |node|
+ # map node parameters
keys = {}
@cfg.map.each { |key, sql_column| keys[key.to_sym] = node[sql_column.to_sym] }
keys[:model] = map_model keys[:model] if keys.key? :model
+
+ # map node specific vars
+ vars = {}
+ @cfg.vars_map.each { |key, sql_column| vars[key.to_sym] = node[sql_column.to_sym] }
+ keys[:vars] = vars unless vars.empty?
+
nodes << keys
end
nodes