class IDRAC::Client
def create_redfish_session
def create_redfish_session # Skip if we're in direct mode if @direct_mode puts "Skipping Redfish session creation (direct mode)" return false end url = '/redfish/v1/SessionService/Sessions' payload = { "UserName" => username, "Password" => password } # Try first with just Content-Type header (no Basic Auth) begin response = connection.post(url) do |req| req.headers['Content-Type'] = 'application/json' req.body = payload.to_json end if response.status == 201 || response.status == 200 # Extract X-Auth-Token from response headers @x_auth_token = response.headers['X-Auth-Token'] # Extract session location from response headers @session_location = response.headers['Location'] puts "Redfish session created successfully" @sessions_maxed = false return true end rescue => e puts "First session creation attempt failed: #{e.message}" end # If that fails, try with Basic Auth begin # Use Basic Auth for the session creation basic_auth_headers = { 'Authorization' => "Basic #{Base64.strict_encode64("#{username}:#{password}")}", 'Content-Type' => 'application/json' } response = connection.post(url) do |req| req.headers.merge!(basic_auth_headers) req.body = payload.to_json end if response.status == 201 || response.status == 200 # Extract X-Auth-Token from response headers @x_auth_token = response.headers['X-Auth-Token'] # Extract session location from response headers @session_location = response.headers['Location'] puts "Redfish session created successfully with Basic Auth" @sessions_maxed = false return true elsif response.status == 400 && response.body.include?("maximum number of user sessions") puts "Maximum sessions reached during Redfish session creation" @sessions_maxed = true # Try to clear sessions if auto_delete_sessions is enabled if @auto_delete_sessions puts "Auto-delete sessions is enabled, attempting to clear sessions" if force_clear_sessions puts "Successfully cleared sessions, trying to create a new session" # Try one more time after clearing response = connection.post(url) do |req| req.headers.merge!(basic_auth_headers) req.body = payload.to_json end if response.status == 201 || response.status == 200 @x_auth_token = response.headers['X-Auth-Token'] @session_location = response.headers['Location'] puts "Redfish session created successfully after clearing sessions" @sessions_maxed = false return true else puts "Failed to create Redfish session after clearing: #{response.status} - #{response.body}" # If we still can't create a session, switch to direct mode @direct_mode = true return false end else puts "Failed to clear sessions, switching to direct mode" @direct_mode = true return false end else puts "Auto-delete sessions is disabled, switching to direct mode" @direct_mode = true return false end else puts "Failed to create Redfish session: #{response.status} - #{response.body}" # If we get a 415 error, try with form-urlencoded if response.status == 415 puts "Trying with form-urlencoded content type" response = connection.post(url) do |req| req.headers['Content-Type'] = 'application/x-www-form-urlencoded' req.headers['Authorization'] = "Basic #{Base64.strict_encode64("#{username}:#{password}")}" req.body = "UserName=#{URI.encode_www_form_component(username)}&Password=#{URI.encode_www_form_component(password)}" end if response.status == 201 || response.status == 200 @x_auth_token = response.headers['X-Auth-Token'] @session_location = response.headers['Location'] puts "Redfish session created successfully with form-urlencoded" @sessions_maxed = false return true else puts "Failed with form-urlencoded too: #{response.status} - #{response.body}" @direct_mode = true return false end else @direct_mode = true return false end end rescue => e puts "Error during Redfish session creation: #{e.message}" @direct_mode = true return false end end