Class: Rubyipmi::BaseCommand
- Inherits:
-
Object
- Object
- Rubyipmi::BaseCommand
- Includes:
- Observable
- Defined in:
- lib/rubyipmi/commands/basecommand.rb
Direct Known Subclasses
Instance Attribute Summary collapse
-
#cmd ⇒ Object
readonly
Returns the value of attribute cmd.
-
#lastcall ⇒ Object
readonly
Returns the value of attribute lastcall.
-
#max_retry_count ⇒ Object
readonly
Returns the value of attribute max_retry_count.
-
#options ⇒ Object
Returns the value of attribute options.
-
#passfile ⇒ Object
Returns the value of attribute passfile.
-
#result ⇒ Object
readonly
Returns the value of attribute result.
Instance Method Summary collapse
- #dump_command ⇒ Object
-
#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.
-
#initialize(commandname, opts = ObservableHash.new) ⇒ BaseCommand
constructor
A new instance of BaseCommand.
- #locate_command(commandname) ⇒ Object
- #logger ⇒ Object
- #makecommand ⇒ Object
- #removepass ⇒ Object
- #run ⇒ Object
-
#runcmd ⇒ Object
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.
- #setpass ⇒ Object
- #update(opts) ⇒ Object
-
#validate_status(exitstatus) ⇒ Object
This method will check if the results are really valid as the exit code can be misleading and incorrect.
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
#cmd ⇒ Object (readonly)
Returns the value of attribute cmd.
8 9 10 |
# File 'lib/rubyipmi/commands/basecommand.rb', line 8 def cmd @cmd end |
#lastcall ⇒ Object (readonly)
Returns the value of attribute lastcall.
10 11 12 |
# File 'lib/rubyipmi/commands/basecommand.rb', line 10 def lastcall @lastcall end |
#max_retry_count ⇒ Object (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 |
#options ⇒ Object
Returns the value of attribute options.
9 10 11 |
# File 'lib/rubyipmi/commands/basecommand.rb', line 9 def @options end |
#passfile ⇒ Object
Returns the value of attribute passfile.
9 10 11 |
# File 'lib/rubyipmi/commands/basecommand.rb', line 9 def passfile @passfile end |
#result ⇒ Object (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_command ⇒ Object
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 |
#logger ⇒ Object
12 13 14 |
# File 'lib/rubyipmi/commands/basecommand.rb', line 12 def logger Rubyipmi.logger end |
#makecommand ⇒ Object
16 17 18 |
# File 'lib/rubyipmi/commands/basecommand.rb', line 16 def makecommand # override in subclass end |
#removepass ⇒ Object
24 25 26 |
# File 'lib/rubyipmi/commands/basecommand.rb', line 24 def removepass @passfile.unlink end |
#run ⇒ Object
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 |
#runcmd ⇒ Object
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 |
#setpass ⇒ Object
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 |