Class: Rubyipmi::BaseCommand

Inherits:
Object
  • Object
show all
Includes:
Observable
Defined in:
lib/rubyipmi/commands/basecommand.rb

Direct Known Subclasses

Freeipmi::BaseCommand, Ipmitool::BaseCommand

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(commandname, opts = ObservableHash.new) ⇒ BaseCommand

Returns a new instance of BaseCommand.



32
33
34
35
36
37
# File 'lib/rubyipmi/commands/basecommand.rb', line 32

def initialize(commandname, opts = ObservableHash.new)
  # This will locate the command path or raise an error if not found
  @cmdname = commandname
  @options = opts
  @options.add_observer(self)
end

Instance Attribute Details

#cmdObject (readonly)

Returns the value of attribute cmd.



8
9
10
# File 'lib/rubyipmi/commands/basecommand.rb', line 8

def cmd
  @cmd
end

#lastcallObject (readonly)

Returns the value of attribute lastcall.



10
11
12
# File 'lib/rubyipmi/commands/basecommand.rb', line 10

def lastcall
  @lastcall
end

#max_retry_countObject (readonly)

Returns the value of attribute max_retry_count.



8
9
10
# File 'lib/rubyipmi/commands/basecommand.rb', line 8

def max_retry_count
  @max_retry_count
end

#optionsObject

Returns the value of attribute options.



9
10
11
# File 'lib/rubyipmi/commands/basecommand.rb', line 9

def options
  @options
end

#passfileObject

Returns the value of attribute passfile.



9
10
11
# File 'lib/rubyipmi/commands/basecommand.rb', line 9

def passfile
  @passfile
end

#resultObject (readonly)

Returns the value of attribute result.



10
11
12
# File 'lib/rubyipmi/commands/basecommand.rb', line 10

def result
  @result
end

Instance Method Details

#dump_commandObject



28
29
30
# File 'lib/rubyipmi/commands/basecommand.rb', line 28

def dump_command
  makecommand
end

#find_fix(result) ⇒ Object

The findfix method acts like a recursive method and applies fixes defined in the errorcodes If a fix is found it is applied to the options hash, and then the last run command is retried until all the fixes are exhausted or a error not defined in the errorcodes is found this must be overrided in the subclass, as there are no generic errors that fit both providers



93
94
95
96
97
98
99
100
101
102
103
# File 'lib/rubyipmi/commands/basecommand.rb', line 93

def find_fix(result)
  return unless result
  # The errorcode code hash contains the fix
  begin
    fix = ErrorCodes.search(result)
    @options.merge_notify!(fix)
  rescue
    Rubyipmi.logger.debug("Could not find fix for error code: \n#{result}") if logger
    raise "Could not find fix for error code: \n#{result}"
  end
end

#locate_command(commandname) ⇒ Object



39
40
41
42
43
44
45
46
# File 'lib/rubyipmi/commands/basecommand.rb', line 39

def locate_command(commandname)
  location = `which #{commandname}`.strip
  unless $?.success?
    logger.error("#{commandname} command not found, is #{commandname} installed?") if logger
    raise "#{commandname} command not found, is #{commandname} installed?"
  end
  location
end

#loggerObject



12
13
14
# File 'lib/rubyipmi/commands/basecommand.rb', line 12

def logger
  Rubyipmi.logger
end

#makecommandObject



16
17
18
# File 'lib/rubyipmi/commands/basecommand.rb', line 16

def makecommand
  # override in subclass
end

#removepassObject



24
25
26
# File 'lib/rubyipmi/commands/basecommand.rb', line 24

def removepass
  @passfile.unlink
end

#runObject



58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/rubyipmi/commands/basecommand.rb', line 58

def run
  # we search for the command everytime just in case its removed during execution
  # we also don't want to add this to the initialize since mocking is difficult and we don't want to
  # throw errors upon object creation
  retrycount = 0
  process_status = false
  @cmd = locate_command(@cmdname)
  setpass
  @result = nil
  logger.debug(makecommand) if logger
  begin
    command = makecommand
    @lastcall = "#{command}"
    @result = `#{command} 2>&1`
    # sometimes the command tool does not return the correct result, validate it with additional code
    process_status = validate_status($?)
  rescue
    if retrycount < max_retry_count
      find_fix(@result)
      retrycount = retrycount.next
      retry
    else
      logger.error("Exhausted all auto fixes, cannot determine what the problem is") if logger
      raise "Exhausted all auto fixes, cannot determine what the problem is"
    end
  ensure
    removepass
    process_status
  end
end

#runcmdObject

Use this function to run the command line tool, it will inherently use the options hash for all options That need to be specified on the command line



50
51
52
53
54
55
56
# File 'lib/rubyipmi/commands/basecommand.rb', line 50

def runcmd
  @success = false
  @success = run
  logger.debug(@lastcall.inspect) unless @lastcall.nil? if logger
  logger.debug(@result) unless @result.nil? if logger
  @success
end

#setpassObject



20
21
22
# File 'lib/rubyipmi/commands/basecommand.rb', line 20

def setpass
  @passfile = Tempfile.new('')
end

#update(opts) ⇒ Object



105
106
107
# File 'lib/rubyipmi/commands/basecommand.rb', line 105

def update(opts)
  @options.merge!(opts)
end

#validate_status(exitstatus) ⇒ Object

This method will check if the results are really valid as the exit code can be misleading and incorrect



110
111
112
113
114
# File 'lib/rubyipmi/commands/basecommand.rb', line 110

def validate_status(exitstatus)
  raise "Error occurred" unless exitstatus.success?

  true
end