def self.connect(user, pass, host, provider='any', opts={:driver => 'lan20', :timeout => 'default'})
installed = false
opts = {:driver => 'lan20', :timeout => 'default'} if opts.nil?
opts.keys.each do |key|
opts[(key.to_sym rescue key) || key] = opts.delete(key)
end
if provider.is_a?(Hash)
opts = provider
provider = opts[:provider] ||= 'any'
end
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
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
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 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
logger.error("The IPMI provider: #{provider} is not installed") if logger
raise "The IPMI provider: #{provider} is not installed"
end
end