module Rubyipmi
Constants
- PRIV_TYPES
Attributes
Public Class Methods
The connect method will create a connection object based the provider type passed in If provider is left blank the function will use the first available provider When the driver is set to auto, rubyipmi will try and figure out which driver to use by common error messages. We will most likely be using the lan20 driver, but in order to support a wide use case we default to auto.
# File lib/rubyipmi.rb, line 76 def self.connect(user, pass, host, provider='any', opts={:driver => 'lan20', :timeout => 'default'}) # use this variable to reduce cmd calls installed = false # if the user supplied nil, we want to fix this automatically opts = {:driver => 'lan20', :timeout => 'default'} if opts.nil? # convert all keys to symbols for opts, we can't assume the user will use symbols opts.keys.each do |key| opts[(key.to_sym rescue key) || key] = opts.delete(key) end # allow the user to specify an options hash instead of the provider # in the future I would stop using the provider and use the opts hash instead to get the provider # This allows us to be a little more flexible if the user is doesn't supply us what we need. if provider.is_a?(Hash) opts = provider provider = opts[:provider] ||= 'any' end # Verify options just in case user passed in a incomplete hash opts[:driver] ||= 'lan20' opts[:timeout] ||= 'default' if opts[:privilege] and not supported_privilege_type?(opts[:privilege]) logger.error("Invalid privilege type :#{opts[:privilege]}, must be one of: #{PRIV_TYPES.join("\n")}") if logger raise "Invalid privilege type :#{opts[:privilege]}, must be one of: #{PRIV_TYPES.join("\n")}" end # use the first available provider if provider == 'any' if is_provider_installed?("freeipmi") provider = "freeipmi" installed = true elsif is_provider_installed?("ipmitool") provider = "ipmitool" installed = true else logger.error("No IPMI provider is installed, please install freeipmi or ipmitool") raise "No IPMI provider is installed, please install freeipmi or ipmitool" end end # Support multiple drivers # Note: these are just generic names of drivers that need to be specified for each provider unless valid_drivers.include?(opts[:driver]) logger.debug("You must specify a valid driver: #{valid_drivers.join(',')}") if logger raise "You must specify a valid driver: #{valid_drivers.join(',')}" end # If the provider is available create a connection object if installed or is_provider_installed?(provider) if provider == "freeipmi" Rubyipmi::Freeipmi::Connection.new(user, pass, host, opts) elsif provider == "ipmitool" Rubyipmi::Ipmitool::Connection.new(user,pass,host, opts) else logger.error("Incorrect provider given, must use one of #{valid_providers.join(', ')}") if logger raise "Incorrect provider given, must use one of #{valid_providers.join(', ')}" end else # Can't find the provider command line tool, maybe try other provider? logger.error("The IPMI provider: #{provider} is not installed") if logger raise "The IPMI provider: #{provider} is not installed" end end
gets data from the bmc device and puts in a hash for diagnostics
# File lib/rubyipmi.rb, line 192 def self.get_diag(user, pass, host, opts={:driver => 'lan20', :timeout => 'default'}) data = {} if Rubyipmi.is_provider_installed?('freeipmi') freeconn = Rubyipmi.connect(user, pass, host, 'freeipmi', opts) if freeconn puts "Retrieving freeipmi data" data[:freeipmi] = freeconn.get_diag end end if Rubyipmi.is_provider_installed?('ipmitool') ipmiconn = Rubyipmi.connect(user, pass, host, 'ipmitool', opts) if ipmiconn puts "Retrieving ipmitool data" data[:ipmitool] = ipmiconn.get_diag end end File.open('/tmp/rubyipmi_diag_data.txt', 'w') {|f| f.write(data)} puts "Created file /tmp/rubyipmi_diag_data.txt" end
Return true or false if the provider is available
# File lib/rubyipmi.rb, line 158 def self.is_provider_installed?(provider) case provider when "freeipmi" cmdpath = locate_command('ipmipower') when "ipmitool" cmdpath = locate_command('ipmitool') else logger.error("Invalid BMC provider type #{provider}") if logger false end # return false if command was not found return ! cmdpath.nil? end
method used to find the command which also makes it easier to mock with
# File lib/rubyipmi.rb, line 149 def self.locate_command(commandname) location = `which #{commandname}`.strip if not $?.success? location = nil end location end
sets the log level, this should be called first if logging to a file is desired if you wish to customize the logging options, set the logger yourself with logger= valid levels are of the type Logger::INFO, Logger::DEBUG, Logger::ERROR, …
# File lib/rubyipmi.rb, line 45 def self.log_level=(level) @log_level = level end
this is an read only method that only creates a real logger if the #log_level is set if the #log_level is not setup it creates a null logger which logs nothing
# File lib/rubyipmi.rb, line 51 def self.logger # by default the log will be set to info unless @logger if @log_level and @log_level >= 0 @logger = Logger.new('/tmp/rubyipmi.log') @logger.progname = 'Rubyipmi' @logger.level = @log_level else @logger = NullLogger.new end end @logger end
set a logger instance yourself to customize where the logs should go you will need to set the log level yourself
# File lib/rubyipmi.rb, line 38 def self.logger=(log) @logger = log end
returns true if any of the providers are installed
# File lib/rubyipmi.rb, line 177 def self.provider_installed? providers_installed.length > 0 end
# File lib/rubyipmi.rb, line 172 def self.providers ["freeipmi", "ipmitool"] end
# File lib/rubyipmi.rb, line 181 def self.providers_installed available = [] providers.each do |prov| if is_provider_installed?(prov) available << prov end end return available end
returns boolean true if privilege type is valid
# File lib/rubyipmi.rb, line 144 def self.supported_privilege_type?(type) PRIV_TYPES.include?(type) end
# File lib/rubyipmi.rb, line 65 def self.valid_drivers ['auto', "lan15", "lan20", "open"] end
# File lib/rubyipmi.rb, line 69 def self.valid_providers ['auto', 'ipmitool', 'freeipmi'] end