# File lib/rubyipmi.rb, line 34
  def self.connect(user, pass, host, provider='any', opts={:driver => 'auto',
                                                           :timeout => 'default', :debug => false})

    # use this variable to reduce cmd calls
    installed = false

    if provider.is_a?(Hash)
      opts = provider
      provider = 'any'
    end

    # Verify options just in case user passed in a incomplete hash
    opts[:driver]  ||= 'auto'
    opts[:timeout] ||= 'default'
    opts[:debug]   = false if opts[:debug] != true

    if ! opts[:privilege].nil?
      if ! supported_privilege_type?(opts[:privilege])
        raise "Invalid privilege type :#{opts[:privilege]}, must be one of: #{PRIV_TYPES.join("\n")}"
      end
    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
        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])
      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"
        @conn = Rubyipmi::Freeipmi::Connection.new(user, pass, host, opts)
      elsif provider == "ipmitool"
        @conn = Rubyipmi::Ipmitool::Connection.new(user,pass,host, opts)
      else
        raise "Incorrect provider given, must use freeipmi or ipmitool"
      end
    else
      # Can't find the provider command line tool, maybe try other provider?
      raise "The IPMI provider: #{provider} is not installed"

    end
  end