require'json'require'colorize'moduleIDRACmoduleJobs# Summarize jobsdefjobsresponse=authenticated_request(:get,'/redfish/v1/Managers/iDRAC.Embedded.1/Jobs?$expand=*($levels=1)')ifresponse.status==200beginjobs_data=JSON.parse(response.body){completed_count: jobs_data["Members"].select{|j|j["JobState"]=="Completed"}.count,incomplete_count: jobs_data["Members"].select{|j|j["JobState"]!="Completed"}.count,total_count: jobs_data["Members"].count}rescueJSON::ParserErrorraiseError,"Failed to parse jobs response: #{response.body}"endelseraiseError,"Failed to get jobs. Status code: #{response.status}"endend# Get detailed job informationdefjobs_detailresponse=authenticated_request(:get,'/redfish/v1/Managers/iDRAC.Embedded.1/Jobs?$expand=*($levels=1)')ifresponse.status==200beginjobs_data=JSON.parse(response.body)jobs_data["Members"].each.with_indexdo|job,i|puts"#{job['Id']} : #{job['JobState']} > #{job['Message']} <#{job['CompletionTime']}> [#{i+1}/#{jobs_data["Members"].count}]"endreturnjobs_datarescueJSON::ParserErrorraiseError,"Failed to parse jobs detail response: #{response.body}"endelseraiseError,"Failed to get jobs detail. Status code: #{response.status}"endend# Clear all jobs from the job queuedefclear_jobs!# Get list of jobsjobs_response=authenticated_request(:get,'/redfish/v1/Managers/iDRAC.Embedded.1/Jobs?$expand=*($levels=1)')handle_response(jobs_response)ifjobs_response.status==200beginjobs_data=JSON.parse(jobs_response.body)members=jobs_data["Members"]# Delete each job individuallymembers.each.with_indexdo|job,i|puts"Removing #{job['Id']} : #{job['JobState']} > #{job['Message']} [#{i+1}/#{members.count}]".yellowdelete_response=authenticated_request(:delete,"/redfish/v1/Managers/iDRAC.Embedded.1/Jobs/#{job['Id']}")unlessdelete_response.status.between?(200,299)puts"Warning: Failed to delete job #{job['Id']}. Status code: #{delete_response.status}".yellowendendputs"Successfully cleared all jobs".greenreturntruerescueJSON::ParserErrorraiseError,"Failed to parse jobs response: #{jobs_response.body}"endelseraiseError,"Failed to get jobs. Status code: #{jobs_response.status}"endend# Force clear the job queuedefforce_clear_jobs!# Clear the job queue using force option which will also clear any pending data and restart processespath='/redfish/v1/Dell/Managers/iDRAC.Embedded.1/DellJobService/Actions/DellJobService.DeleteJobQueue'payload={"JobID"=>"JID_CLEARALL_FORCE"}response=authenticated_request(:post,path,body: payload.to_json,headers: {'Content-Type'=>'application/json'})ifresponse.status.between?(200,299)puts"Successfully force-cleared job queue".green# Monitor LC status until it's Readyputs"Waiting for LC status to be Ready..."retries=60# ~10 minutes with 10s sleepwhileretries>0lc_response=authenticated_request(:post,'/redfish/v1/Dell/Managers/iDRAC.Embedded.1/DellLCService/Actions/DellLCService.GetRemoteServicesAPIStatus',body: {}.to_json,headers: {'Content-Type':'application/json'})iflc_response.status.between?(200,299)beginlc_data=JSON.parse(lc_response.body)status=lc_data["LCStatus"]ifstatus=="Ready"puts"LC Status is Ready".greenreturntrueendputs"Current LC Status: #{status}. Waiting..."rescueJSON::ParserErrorputs"Failed to parse LC status response, will retry...".yellowendendretries-=1sleep10endputs"Warning: LC status did not reach Ready state within timeout".yellowreturntrueelseerror_message="Failed to force-clear job queue. Status code: #{response.status}"beginerror_data=JSON.parse(response.body)error_message+=", Message: #{error_data['error']['message']}"iferror_data['error']&&error_data['error']['message']rescue# Ignore JSON parsing errorsendraiseError,error_messageendend# Wait for a job to completedefwait_for_job(job_id)# Job ID can be a job ID, path, or response hash from another requestjob_path=ifjob_id.is_a?(Hash)ifjob_id['headers']&&job_id['headers']['location']job_id['headers']['location'].sub(/^\/redfish\/v1\//,'')elseraiseError,"Invalid job hash, missing location header"endelsifjob_id.to_s.start_with?('/redfish/v1/')job_id.sub(/^\/redfish\/v1\//,'')else"Managers/iDRAC.Embedded.1/Jobs/#{job_id}"endputs"Waiting for job to complete: #{job_id}".light_cyanretries=36# ~6 minutes with 10s sleepwhileretries>0response=authenticated_request(:get,"/redfish/v1/#{job_path}")ifresponse.status==200beginjob_data=JSON.parse(response.body)job_state=job_data["JobState"]casejob_statewhen"Completed"puts"Job completed successfully".greenputs"CompletionTime: #{job_data['CompletionTime']}".greenifjob_data['CompletionTime']returnjob_datawhen"Failed"puts"Job failed: #{job_data['Message']}".redputs"CompletionTime: #{job_data['CompletionTime']}".redifjob_data['CompletionTime']raiseError,"Job failed: #{job_data['Message']}"when"CompletedWithErrors"puts"Job completed with errors: #{job_data['Message']}".yellowputs"CompletionTime: #{job_data['CompletionTime']}".yellowifjob_data['CompletionTime']returnjob_dataendputs"Job state: #{job_state}. Waiting...".yellowrescueJSON::ParserErrorputs"Failed to parse job status response, will retry...".yellowendelseputs"Failed to get job status. Status code: #{response.status}".redendretries-=1sleep10endraiseError,"Timeout waiting for job to complete"end# Get system tasksdeftasksresponse=authenticated_request(:get,'/redfish/v1/TaskService/Tasks')ifresponse.status==200begintasks_data=JSON.parse(response.body)# "Tasks: #{tasks_data['Members'].count}", 0 returntasks_data['Members']rescueJSON::ParserErrorraiseError,"Failed to parse tasks response: #{response.body}"endelseraiseError,"Failed to get tasks. Status code: #{response.status}"endendendend