idrac 0.7.3 → 0.7.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +9 -0
- data/lib/idrac/client.rb +5 -2
- data/lib/idrac/firmware.rb +4 -67
- data/lib/idrac/session.rb +1 -2
- data/lib/idrac/storage.rb +1 -28
- data/lib/idrac/system_config.rb +0 -78
- data/lib/idrac/version.rb +1 -1
- data/lib/idrac/virtual_media.rb +1 -27
- data/lib/idrac/web.rb +1 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 35af179780aaa39d3e0ecec031f951c09a9d1cbb2da98e28708aca8e603e8da2
|
4
|
+
data.tar.gz: 106abac6bd24e51135c62ec299119be92bd75ddd44df8ff460292a464e699ec0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4bf2ceda937c51d8f0a060a8cecba03465f3823f5032e59c41c94fbf67521e80ae9315ca1925415335e6f332274bf8431bf9f6fb1cd5b996835b301e775587bc
|
7
|
+
data.tar.gz: 329d1cc1cc4c8b1ec79c671f12cd273e9cd50f1512548bb083ebbc649a9c448991f6428c4b3646a7ee7fb536c84142c6cc8573ad4c7148ea36572b7f60bb8404
|
data/README.md
CHANGED
@@ -218,6 +218,15 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
|
|
218
218
|
|
219
219
|
## Changelog
|
220
220
|
|
221
|
+
### Version 0.7.5
|
222
|
+
- **Code Cleanup**: Consolidated duplicate methods across the codebase
|
223
|
+
- Removed 5 sets of duplicate methods: `base_url`, `get_firmware_version`, `wait_for_task`, `handle_location`, and `extract_identifiers`
|
224
|
+
- Simplified method delegation patterns for better maintainability
|
225
|
+
- Eliminated ~150+ lines of duplicate code while preserving all functionality
|
226
|
+
|
227
|
+
### Version 0.7.4
|
228
|
+
- Added tolerance fol SSL Timeout errors during iDRAC operations.
|
229
|
+
|
221
230
|
### Version 0.7.3
|
222
231
|
- Improved error handling around SystemConfigurationProfile.
|
223
232
|
|
data/lib/idrac/client.rb
CHANGED
@@ -148,12 +148,16 @@ module IDRAC
|
|
148
148
|
end
|
149
149
|
|
150
150
|
return response
|
151
|
-
rescue Faraday::ConnectionFailed, Faraday::TimeoutError => e
|
151
|
+
rescue Faraday::ConnectionFailed, Faraday::TimeoutError, Faraday::SSLError => e
|
152
|
+
# Old iDRACs (e.g. R630s) can have occasional connection issues--even SSLError is common
|
152
153
|
debug "Connection error in direct mode: #{e.message}", 1, :red
|
153
154
|
sleep(retry_count + 1) # Add some delay before retry
|
154
155
|
return _perform_authenticated_request(method, path, options, retry_count + 1)
|
155
156
|
rescue => e
|
157
|
+
debugger
|
156
158
|
debug "Error during direct mode request: #{e.message}", 1, :red
|
159
|
+
# sleep(retry_count + 1) # Add some delay before retry
|
160
|
+
# return _perform_authenticated_request(method, path, options, retry_count + 1)
|
157
161
|
raise Error, "Error during authenticated request: #{e.message}"
|
158
162
|
end
|
159
163
|
# Use Redfish session token if available
|
@@ -395,7 +399,6 @@ module IDRAC
|
|
395
399
|
|
396
400
|
# Check final task state
|
397
401
|
if task["TaskState"] == "Completed" && task["TaskStatus"] == "OK"
|
398
|
-
debugger
|
399
402
|
return { status: :success }
|
400
403
|
elsif task["SystemConfiguration"] # SystemConfigurationProfile requests yield a 202 with a SystemConfiguration key
|
401
404
|
return task
|
data/lib/idrac/firmware.rb
CHANGED
@@ -170,7 +170,7 @@ module IDRAC
|
|
170
170
|
displayed_components.add(firmware_name.downcase)
|
171
171
|
|
172
172
|
# Extract key identifiers from the firmware name
|
173
|
-
identifiers = extract_identifiers(firmware_name)
|
173
|
+
identifiers = catalog.extract_identifiers(firmware_name)
|
174
174
|
|
175
175
|
# Try to find a matching update
|
176
176
|
matching_updates = catalog_updates.select do |update|
|
@@ -255,7 +255,7 @@ module IDRAC
|
|
255
255
|
# Skip if this update was already matched to a current firmware
|
256
256
|
next if inventory[:firmware].any? do |fw|
|
257
257
|
firmware_name = fw[:name] || ""
|
258
|
-
identifiers = extract_identifiers(firmware_name)
|
258
|
+
identifiers = catalog.extract_identifiers(firmware_name)
|
259
259
|
|
260
260
|
identifiers.any? { |id| update_name.downcase.include?(id.downcase) } ||
|
261
261
|
update_name.downcase.include?(firmware_name.downcase) ||
|
@@ -429,23 +429,7 @@ module IDRAC
|
|
429
429
|
end
|
430
430
|
end
|
431
431
|
|
432
|
-
|
433
|
-
# Ensure we have a client
|
434
|
-
raise Error, "Client is required for power management" unless client
|
435
|
-
|
436
|
-
# Login to iDRAC if needed
|
437
|
-
client.login unless client.instance_variable_get(:@session_id)
|
438
|
-
|
439
|
-
# Get system information
|
440
|
-
response = client.authenticated_request(:get, "/redfish/v1/Systems/System.Embedded.1")
|
441
|
-
|
442
|
-
if response.status == 200
|
443
|
-
system_data = JSON.parse(response.body)
|
444
|
-
return system_data["PowerState"]
|
445
|
-
else
|
446
|
-
raise Error, "Failed to get power state. Status code: #{response.status}"
|
447
|
-
end
|
448
|
-
end
|
432
|
+
|
449
433
|
|
450
434
|
private
|
451
435
|
|
@@ -750,53 +734,6 @@ module IDRAC
|
|
750
734
|
end
|
751
735
|
end
|
752
736
|
|
753
|
-
|
754
|
-
def extract_identifiers(name)
|
755
|
-
return [] unless name
|
756
|
-
|
757
|
-
identifiers = []
|
758
|
-
|
759
|
-
# Extract model numbers like X520, I350, etc.
|
760
|
-
model_matches = name.scan(/[IX]\d{3,4}/)
|
761
|
-
identifiers.concat(model_matches)
|
762
|
-
|
763
|
-
# Extract PERC model like H730
|
764
|
-
perc_matches = name.scan(/[HP]\d{3,4}/)
|
765
|
-
identifiers.concat(perc_matches)
|
766
|
-
|
767
|
-
# Extract other common identifiers
|
768
|
-
if name.include?("NIC") || name.include?("Ethernet") || name.include?("Network")
|
769
|
-
identifiers << "NIC"
|
770
|
-
end
|
771
|
-
|
772
|
-
if name.include?("PERC") || name.include?("RAID")
|
773
|
-
identifiers << "PERC"
|
774
|
-
# Extract PERC model like H730
|
775
|
-
perc_match = name.match(/PERC\s+([A-Z]\d{3})/)
|
776
|
-
identifiers << perc_match[1] if perc_match
|
777
|
-
end
|
778
|
-
|
779
|
-
if name.include?("BIOS")
|
780
|
-
identifiers << "BIOS"
|
781
|
-
end
|
782
|
-
|
783
|
-
if name.include?("iDRAC") || name.include?("IDRAC") || name.include?("Remote Access Controller")
|
784
|
-
identifiers << "iDRAC"
|
785
|
-
end
|
786
|
-
|
787
|
-
if name.include?("Power Supply") || name.include?("PSU")
|
788
|
-
identifiers << "PSU"
|
789
|
-
end
|
790
|
-
|
791
|
-
if name.include?("Lifecycle Controller")
|
792
|
-
identifiers << "LC"
|
793
|
-
end
|
794
|
-
|
795
|
-
if name.include?("CPLD")
|
796
|
-
identifiers << "CPLD"
|
797
|
-
end
|
798
|
-
|
799
|
-
identifiers
|
800
|
-
end
|
737
|
+
|
801
738
|
end
|
802
739
|
end
|
data/lib/idrac/session.rb
CHANGED
data/lib/idrac/storage.rb
CHANGED
@@ -382,7 +382,6 @@ module IDRAC
|
|
382
382
|
end
|
383
383
|
end
|
384
384
|
|
385
|
-
debugger
|
386
385
|
# Map RAID type to proper format
|
387
386
|
raid_level = case raid_type
|
388
387
|
when "RAID0" then "0"
|
@@ -522,33 +521,7 @@ module IDRAC
|
|
522
521
|
all_seds?(drives) && controller_encryption_capable?(controller) && controller_encryption_enabled?(controller)
|
523
522
|
end
|
524
523
|
|
525
|
-
|
526
|
-
def get_firmware_version
|
527
|
-
response = authenticated_request(:get, "/redfish/v1/Managers/iDRAC.Embedded.1?$select=FirmwareVersion")
|
528
|
-
|
529
|
-
if response.status == 200
|
530
|
-
begin
|
531
|
-
data = JSON.parse(response.body)
|
532
|
-
return data["FirmwareVersion"]
|
533
|
-
rescue JSON::ParserError
|
534
|
-
raise Error, "Failed to parse firmware version response: #{response.body}"
|
535
|
-
end
|
536
|
-
else
|
537
|
-
# Try again without the $select parameter for older firmware
|
538
|
-
response = authenticated_request(:get, "/redfish/v1/Managers/iDRAC.Embedded.1")
|
539
|
-
|
540
|
-
if response.status == 200
|
541
|
-
begin
|
542
|
-
data = JSON.parse(response.body)
|
543
|
-
return data["FirmwareVersion"]
|
544
|
-
rescue JSON::ParserError
|
545
|
-
raise Error, "Failed to parse firmware version response: #{response.body}"
|
546
|
-
end
|
547
|
-
else
|
548
|
-
raise Error, "Failed to get firmware version. Status code: #{response.status}"
|
549
|
-
end
|
550
|
-
end
|
551
|
-
end
|
524
|
+
|
552
525
|
|
553
526
|
# Check if the controller is capable of encryption
|
554
527
|
def controller_encryption_capable?(controller)
|
data/lib/idrac/system_config.rb
CHANGED
@@ -77,85 +77,7 @@ module IDRAC
|
|
77
77
|
return true
|
78
78
|
end
|
79
79
|
|
80
|
-
# Wait for a task to complete
|
81
|
-
def wait_for_task(task_id)
|
82
|
-
task = nil
|
83
|
-
|
84
|
-
begin
|
85
|
-
loop do
|
86
|
-
task_response = authenticated_request(:get, "/redfish/v1/TaskService/Tasks/#{task_id}")
|
87
|
-
|
88
|
-
case task_response.status
|
89
|
-
# 200-299
|
90
|
-
when 200..299
|
91
|
-
task = JSON.parse(task_response.body)
|
92
80
|
|
93
|
-
if task["TaskState"] != "Running"
|
94
|
-
break
|
95
|
-
end
|
96
|
-
|
97
|
-
# Extract percentage complete if available
|
98
|
-
percent_complete = nil
|
99
|
-
if task["Oem"] && task["Oem"]["Dell"] && task["Oem"]["Dell"]["PercentComplete"]
|
100
|
-
percent_complete = task["Oem"]["Dell"]["PercentComplete"]
|
101
|
-
debug "Task progress: #{percent_complete}% complete", 1
|
102
|
-
end
|
103
|
-
|
104
|
-
debug "Waiting for task to complete...: #{task["TaskState"]} #{task["TaskStatus"]}", 1
|
105
|
-
sleep 5
|
106
|
-
else
|
107
|
-
return {
|
108
|
-
status: :failed,
|
109
|
-
error: "Failed to check task status: #{task_response.status} - #{task_response.body}"
|
110
|
-
}
|
111
|
-
end
|
112
|
-
end
|
113
|
-
|
114
|
-
# Check final task state
|
115
|
-
if task["TaskState"] == "Completed" && task["TaskStatus"] == "OK"
|
116
|
-
debugger
|
117
|
-
return { status: :success }
|
118
|
-
elsif task["SystemConfiguration"] # SystemConfigurationProfile requests yield a 202 with a SystemConfiguration key
|
119
|
-
return task
|
120
|
-
else
|
121
|
-
# For debugging purposes
|
122
|
-
debug task.inspect, 1, :yellow
|
123
|
-
|
124
|
-
# Extract any messages from the response
|
125
|
-
messages = []
|
126
|
-
if task["Messages"] && task["Messages"].is_a?(Array)
|
127
|
-
messages = task["Messages"].map { |m| m["Message"] }.compact
|
128
|
-
end
|
129
|
-
|
130
|
-
return {
|
131
|
-
status: :failed,
|
132
|
-
task_state: task["TaskState"],
|
133
|
-
task_status: task["TaskStatus"],
|
134
|
-
messages: messages,
|
135
|
-
error: messages.first || "Task failed with state: #{task["TaskState"]}"
|
136
|
-
}
|
137
|
-
end
|
138
|
-
rescue => e
|
139
|
-
debugger
|
140
|
-
return { status: :error, error: "Exception monitoring task: #{e.message}" }
|
141
|
-
end
|
142
|
-
end
|
143
|
-
|
144
|
-
# Handle location header and determine whether to use wait_for_job or wait_for_task
|
145
|
-
def handle_location(location)
|
146
|
-
return nil if location.nil? || location.empty?
|
147
|
-
|
148
|
-
# Extract the ID from the location
|
149
|
-
id = location.split("/").last
|
150
|
-
|
151
|
-
# Determine if it's a task or job based on the URL pattern
|
152
|
-
if location.include?("/TaskService/Tasks/")
|
153
|
-
wait_for_task(id)
|
154
|
-
else
|
155
|
-
# Assuming it's a job
|
156
|
-
wait_for_job(id)
|
157
|
-
end
|
158
|
-
end
|
159
81
|
|
160
82
|
# Get the system configuration profile for a given target (e.g. "RAID")
|
161
83
|
def get_system_configuration_profile(target: "RAID")
|
data/lib/idrac/version.rb
CHANGED
data/lib/idrac/virtual_media.rb
CHANGED
@@ -244,32 +244,6 @@ module IDRAC
|
|
244
244
|
|
245
245
|
private
|
246
246
|
|
247
|
-
|
248
|
-
def get_firmware_version
|
249
|
-
response = authenticated_request(:get, "/redfish/v1/Managers/iDRAC.Embedded.1?$select=FirmwareVersion")
|
250
|
-
|
251
|
-
if response.status == 200
|
252
|
-
begin
|
253
|
-
data = JSON.parse(response.body)
|
254
|
-
return data["FirmwareVersion"]
|
255
|
-
rescue JSON::ParserError
|
256
|
-
raise Error, "Failed to parse firmware version response: #{response.body}"
|
257
|
-
end
|
258
|
-
else
|
259
|
-
# Try again without the $select parameter for older firmware
|
260
|
-
response = authenticated_request(:get, "/redfish/v1/Managers/iDRAC.Embedded.1")
|
261
|
-
|
262
|
-
if response.status == 200
|
263
|
-
begin
|
264
|
-
data = JSON.parse(response.body)
|
265
|
-
return data["FirmwareVersion"]
|
266
|
-
rescue JSON::ParserError
|
267
|
-
raise Error, "Failed to parse firmware version response: #{response.body}"
|
268
|
-
end
|
269
|
-
else
|
270
|
-
raise Error, "Failed to get firmware version. Status code: #{response.status}"
|
271
|
-
end
|
272
|
-
end
|
273
|
-
end
|
247
|
+
|
274
248
|
end
|
275
249
|
end
|
data/lib/idrac/web.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: idrac
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.
|
4
|
+
version: 0.7.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jonathan Siegel
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2025-
|
11
|
+
date: 2025-06-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: httparty
|