class Oxidized::Model

Attributes

procs[R]

@author Saku Ytti <saku@ytti.fi> @since 0.0.39 @return [Hash] hash proc procs :pre+:post to be prepended/postfixed to output

input[RW]
node[RW]

Public Class Methods

cfg(*methods, **args, &block) click to toggle source
# File lib/oxidized/model/model.rb, line 43
def cfg(*methods, **args, &block)
  [methods].flatten.each do |method|
    process_args_block(@cfg[method.to_s], args, block)
  end
end
cfgs() click to toggle source
# File lib/oxidized/model/model.rb, line 49
def cfgs
  @cfg
end
cmd(cmd_arg = nil, **args, &block) click to toggle source
# File lib/oxidized/model/model.rb, line 53
def cmd(cmd_arg = nil, **args, &block)
  if cmd_arg.instance_of?(Symbol)
    process_args_block(@cmd[cmd_arg], args, block)
  else
    process_args_block(@cmd[:cmd], args, [cmd_arg, block])
  end
  Oxidized.logger.debug "lib/oxidized/model/model.rb Added #{cmd_arg} to the commands list"
end
cmds() click to toggle source
# File lib/oxidized/model/model.rb, line 62
def cmds
  @cmd
end
comment(str = " { || ... } click to toggle source
# File lib/oxidized/model/model.rb, line 29
def comment(str = "# ")
  @comment = if block_given?
               yield
             elsif not @comment
               str
             else
               @comment
             end
end
expect(regex, **args, &block) click to toggle source
# File lib/oxidized/model/model.rb, line 66
def expect(regex, **args, &block)
  process_args_block(@expect, args, [regex, block])
end
expects() click to toggle source
# File lib/oxidized/model/model.rb, line 70
def expects
  @expect
end
inherited(klass) click to toggle source
Calls superclass method
# File lib/oxidized/model/model.rb, line 11
def inherited(klass)
  super
  if klass.superclass == Oxidized::Model
    klass.instance_variable_set '@cmd',     (Hash.new { |h, k| h[k] = [] })
    klass.instance_variable_set '@cfg',     (Hash.new { |h, k| h[k] = [] })
    klass.instance_variable_set '@procs',   (Hash.new { |h, k| h[k] = [] })
    klass.instance_variable_set '@expect',  []
    klass.instance_variable_set '@comment', nil
    klass.instance_variable_set '@prompt',  nil
  else # we're subclassing some existing model, take its variables
    instance_variables.each do |var|
      iv = instance_variable_get(var)
      klass.instance_variable_set var, iv.dup
      @cmd[:cmd] = iv[:cmd].dup if var.to_s == "@cmd"
    end
  end
end
post(**args, &block) click to toggle source

calls the block at the end of the model, adding the output of the block to the output string

@author Saku Ytti <saku@ytti.fi> @since 0.0.39 @yield expects block which should return [String] @return [void]

# File lib/oxidized/model/model.rb, line 92
def post(**args, &block)
  process_args_block(@procs[:post], args, block)
end
pre(**args, &block) click to toggle source

calls the block at the end of the model, prepending the output of the block to the output string

@author Saku Ytti <saku@ytti.fi> @since 0.0.39 @yield expects block which should return [String] @return [void]

# File lib/oxidized/model/model.rb, line 81
def pre(**args, &block)
  process_args_block(@procs[:pre], args, block)
end
prompt(regex = nil) click to toggle source
# File lib/oxidized/model/model.rb, line 39
def prompt(regex = nil)
  @prompt = regex || @prompt
end

Private Class Methods

process_args_block(target, args, block) click to toggle source
# File lib/oxidized/model/model.rb, line 103
def process_args_block(target, args, block)
  if args[:clear]
    if block.instance_of?(Array)
      target.reject! { |k, _| k == block[0] }
      target.push(block)
    else
      target.replace([block])
    end
  else
    method = args[:prepend] ? :unshift : :push
    target.send(method, block)
  end
end

Public Instance Methods

cfg() click to toggle source
# File lib/oxidized/model/model.rb, line 150
def cfg
  self.class.cfgs
end
cmd(string, &block) click to toggle source
# File lib/oxidized/model/model.rb, line 120
def cmd(string, &block)
  Oxidized.logger.debug "lib/oxidized/model/model.rb Executing #{string}"
  out = @input.cmd(string)
  return false unless out

  out = out.b unless Oxidized.config.input.utf8_encoded?
  self.class.cmds[:all].each do |all_block|
    out = instance_exec out, string, &all_block
  end
  if vars :remove_secret
    self.class.cmds[:secret].each do |all_block|
      out = instance_exec out, string, &all_block
    end
  end
  out = instance_exec out, &block if block
  process_cmd_output out, string
end
comment(str) click to toggle source
# File lib/oxidized/model/model.rb, line 186
def comment(str)
  data = ''
  str.each_line do |line|
    data << self.class.comment << line
  end
  data
end
expect(...) click to toggle source
# File lib/oxidized/model/model.rb, line 146
def expect(...)
  self.class.expect(...)
end
expects(data) click to toggle source
# File lib/oxidized/model/model.rb, line 158
def expects(data)
  self.class.expects.each do |re, cb|
    if data.match re
      data = cb.arity == 2 ? instance_exec([data, re], &cb) : instance_exec(data, &cb)
    end
  end
  data
end
get() click to toggle source
# File lib/oxidized/model/model.rb, line 167
def get
  Oxidized.logger.debug 'lib/oxidized/model/model.rb Collecting commands\' outputs'
  outputs = Outputs.new
  procs = self.class.procs
  self.class.cmds[:cmd].each do |command, block|
    out = cmd command, &block
    return false unless out

    outputs << out
  end
  procs[:pre].each do |pre_proc|
    outputs.unshift process_cmd_output(instance_eval(&pre_proc), '')
  end
  procs[:post].each do |post_proc|
    outputs << process_cmd_output(instance_eval(&post_proc), '')
  end
  outputs
end
output() click to toggle source
# File lib/oxidized/model/model.rb, line 138
def output
  @input.output
end
prompt() click to toggle source
# File lib/oxidized/model/model.rb, line 154
def prompt
  self.class.prompt
end
screenscrape() click to toggle source
# File lib/oxidized/model/model.rb, line 212
def screenscrape
  @input.class.to_s.match(/Telnet/) || vars(:ssh_no_exec)
end
send(data) click to toggle source
# File lib/oxidized/model/model.rb, line 142
def send(data)
  @input.send data
end
xmlcomment(str) click to toggle source
# File lib/oxidized/model/model.rb, line 194
def xmlcomment(str)
  # XML Comments start with <!-- and end with -->
  #
  # Because it's illegal for the first or last characters of a comment
  # to be a -, i.e. <!--- or ---> are illegal, and also to improve
  # readability, we add extra spaces after and before the beginning
  # and end of comment markers.
  #
  # Also, XML Comments must not contain --. So we put a space between
  # any double hyphens, by replacing any - that is followed by another -
  # with '- '
  data = ''
  str.each_line do |_line|
    data << '<!-- ' << str.gsub(/-(?=-)/, '- ').chomp << " -->\n"
  end
  data
end

Private Instance Methods

process_cmd_output(output, name) click to toggle source
# File lib/oxidized/model/model.rb, line 218
def process_cmd_output(output, name)
  output = String.new('') unless output.instance_of?(String)
  output.process_cmd(name)
  output
end