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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2daa5d9eb50a541d372954c84db4e371b0f34b02aaf4e57d915d0a08a4a839d5
4
- data.tar.gz: 994b6605e51925c70d1c6948aa8855f45018b951c58c96bc464f4a7598f48827
3
+ metadata.gz: 35af179780aaa39d3e0ecec031f951c09a9d1cbb2da98e28708aca8e603e8da2
4
+ data.tar.gz: 106abac6bd24e51135c62ec299119be92bd75ddd44df8ff460292a464e699ec0
5
5
  SHA512:
6
- metadata.gz: 4430c49903bfff3a52f746b1a526ca7ffce1d116fef8dc8a1c610daa03bee6c3dafc7a5828483a9db58269d6082b384ba60e1d5897e6cc10df867988123905d6
7
- data.tar.gz: ad6ecfb6c6908ddb7c7572db3265c6e10eb985374046aa6af172fbc917fe4e4db246e9336c780872f6a243fbc3d6b5145dd8bafd6cff972e47f855fe1011fbc0
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
@@ -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
- def get_power_state
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
- # Helper method to extract identifiers from component names
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
@@ -282,8 +282,7 @@ module IDRAC
282
282
  private
283
283
 
284
284
  def base_url
285
- protocol = use_ssl ? 'https' : 'http'
286
- "#{protocol}://#{host}:#{port}"
285
+ client.base_url
287
286
  end
288
287
 
289
288
  def print_connection_debug_info
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
- # Get firmware version
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)
@@ -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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module IDRAC
4
- VERSION = "0.7.3"
4
+ VERSION = "0.7.5"
5
5
  end
@@ -244,32 +244,6 @@ module IDRAC
244
244
 
245
245
  private
246
246
 
247
- # Get firmware version (helper method for virtual media operations)
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
@@ -180,8 +180,7 @@ module IDRAC
180
180
  private
181
181
 
182
182
  def base_url
183
- protocol = client.use_ssl ? 'https' : 'http'
184
- "#{protocol}://#{client.host}:#{client.port}"
183
+ client.base_url
185
184
  end
186
185
  end
187
186
  end
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.3
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-05-26 00:00:00.000000000 Z
11
+ date: 2025-06-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: httparty