From 2a77796a7caf10601ae8edea5bf996f951694985 Mon Sep 17 00:00:00 2001 From: Saku Ytti Date: Thu, 7 Aug 2014 13:27:03 +0300 Subject: Pass model config as Outputs object instead of str These objects have some keys, such as 'type' and 'name', which allows our output model to discriminate on them. If ios.rb contains this: cmd 'show ip cef' do |out| { output: out, type: 'poop' } end cmd 'show process cpu' do |out| { output: out, type: 'poop' } end cmd 'show memory statistics' do |out| { output: out, type: 'poop' } end Our git output looks like this: [ytti@ytti.fi ~/.config/oxidized]% git clone oxidized.git Cloning into 'oxidized'... done. [ytti@ytti.fi ~/.config/oxidized]% git clone poop.git Cloning into 'poop'... done. [ytti@ytti.fi ~/.config/oxidized]% ls poop bu.ip.fi--show_ip_cef bu.ip.fi--show_memory_statistics bu.ip.fi--show_process_cpu [ytti@ytti.fi ~/.config/oxidized]% ls oxidized bu.ip.fi [ytti@ytti.fi ~/.config/oxidized]% Where oxidized repo contains standard config for all unspecified types (type is then 'cfg'), for all specified types instead of collapsing it into single string, we store them in 'type' repo with filename including 'name' of the command. --- lib/oxidized/model/model.rb | 28 ++++++++++++++++++++-------- lib/oxidized/model/outputs.rb | 43 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+), 8 deletions(-) create mode 100644 lib/oxidized/model/outputs.rb (limited to 'lib/oxidized/model') diff --git a/lib/oxidized/model/model.rb b/lib/oxidized/model/model.rb index c3d8760..af86f1d 100644 --- a/lib/oxidized/model/model.rb +++ b/lib/oxidized/model/model.rb @@ -1,3 +1,5 @@ +require_relative 'outputs' + module Oxidized class Model include Oxidized::Config::Vars @@ -87,7 +89,7 @@ module Oxidized end end out = instance_exec out, &block if block - out + process_cmd_output out, string end def output @@ -124,20 +126,20 @@ module Oxidized end def get - data, pre = '', '' + outputs = Outputs.new procs = self.class.procs + procs[:pre].each do |pre_proc| + outputs << instance_eval(&pre_proc) + end self.class.cmds[:cmd].each do |command, block| out = cmd command, &block return false unless out - data << out.to_s - end - procs[:pre].each do |pre_proc| - pre << instance_eval(&pre_proc).to_s + outputs << out end procs[:post].each do |post_proc| - data << instance_eval(&post_proc).to_s + outputs << instance_eval(&post_proc) end - pre + data + outputs end def comment _comment @@ -148,5 +150,15 @@ module Oxidized data end + private + + def process_cmd_output cmd, name + if Hash === cmd + cmd[:name] = name + return cmd + end + {:output=>cmd, :type=>'cfg', :name=>name} + end + end end diff --git a/lib/oxidized/model/outputs.rb b/lib/oxidized/model/outputs.rb new file mode 100644 index 0000000..5ef9bc4 --- /dev/null +++ b/lib/oxidized/model/outputs.rb @@ -0,0 +1,43 @@ +module Oxidized + class Model + class Outputs + + def to_cfg + type_to_str('cfg') + end + + def type_to_str want_type + type(want_type).map { |h| h[:output] }.join + end + + def each_type &block + types.each do |want_type| + yield [want_type, type(want_type)] + end + end + + def << output + @outputs << output + end + + def all + @outputs + end + + def type type + @outputs.select { |h| h[:type]==type } + end + + def types + @outputs.map { |h| h[:type] }.uniq + end + + private + + def initialize + @outputs = [] + end + + end + end +end -- cgit v1.2.1