idrac 0.7.4 → 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 +6 -0
- data/lib/idrac/firmware.rb +4 -67
- data/lib/idrac/session.rb +1 -2
- data/lib/idrac/storage.rb +1 -27
- 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,12 @@ 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
|
+
|
221
227
|
### Version 0.7.4
|
222
228
|
- Added tolerance fol SSL Timeout errors during iDRAC operations.
|
223
229
|
|
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
@@ -521,33 +521,7 @@ module IDRAC
|
|
521
521
|
all_seds?(drives) && controller_encryption_capable?(controller) && controller_encryption_enabled?(controller)
|
522
522
|
end
|
523
523
|
|
524
|
-
|
525
|
-
def get_firmware_version
|
526
|
-
response = authenticated_request(:get, "/redfish/v1/Managers/iDRAC.Embedded.1?$select=FirmwareVersion")
|
527
|
-
|
528
|
-
if response.status == 200
|
529
|
-
begin
|
530
|
-
data = JSON.parse(response.body)
|
531
|
-
return data["FirmwareVersion"]
|
532
|
-
rescue JSON::ParserError
|
533
|
-
raise Error, "Failed to parse firmware version response: #{response.body}"
|
534
|
-
end
|
535
|
-
else
|
536
|
-
# Try again without the $select parameter for older firmware
|
537
|
-
response = authenticated_request(:get, "/redfish/v1/Managers/iDRAC.Embedded.1")
|
538
|
-
|
539
|
-
if response.status == 200
|
540
|
-
begin
|
541
|
-
data = JSON.parse(response.body)
|
542
|
-
return data["FirmwareVersion"]
|
543
|
-
rescue JSON::ParserError
|
544
|
-
raise Error, "Failed to parse firmware version response: #{response.body}"
|
545
|
-
end
|
546
|
-
else
|
547
|
-
raise Error, "Failed to get firmware version. Status code: #{response.status}"
|
548
|
-
end
|
549
|
-
end
|
550
|
-
end
|
524
|
+
|
551
525
|
|
552
526
|
# Check if the controller is capable of encryption
|
553
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
|