idrac 0.10.3 → 0.10.4

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: 67737e81c936f047dc3264470e8cf3d913e10d0b300af332f4bd16aca03f4078
4
- data.tar.gz: 62467838651fb0d17ab870948d1b3a82e02f5de31297a2e6d7d7ed260dea044a
3
+ metadata.gz: 17491587256894c2ff168665dca777903a2d6b7d7582f745c4c3e81f697889cd
4
+ data.tar.gz: 432ecbfd6df649a69644254dc942e253a8d917f6ce2cd07c30f7f328c3ffee75
5
5
  SHA512:
6
- metadata.gz: 4164655c54761c104a7b43f5f489972d74238c7f086b3bd865988e875eb756edaa751b6bd3241b0655c154fae57f575849d09796bbc9c0feca015192def2cbe3
7
- data.tar.gz: 5aff6a5a4cbd3362e6dab402f493759ae7b0db72f75adc40c20a9cc84da2e1edea8990d27cd3b0dd4f10ee21ed0775404d101a2dd09752a8a55883dcc2312303
6
+ metadata.gz: 28cc04b7ec2f246ed29d95ba50481f52dff7893e69fd94dc6f82db81e0d7b988e6d0e21589ae09a75e99c51621f2a6650a1aa0ada2c74c8aa4ff6f2726cadf98
7
+ data.tar.gz: 6981e38fe25c803372a0c09aa3616db6ce7d0670415fbec9f73e143c25e44fff25e24ea650dfe5ebfcc821b14c6d17dd778664e43d11b5fbfd8c6458cacae374
data/lib/idrac/boot.rb CHANGED
@@ -323,22 +323,7 @@ module IDRAC
323
323
  raise Error, "Failed to get BIOS information. Status code: #{response.status}"
324
324
  end
325
325
  end
326
- =begin
327
- # Servers can boot in BIOS mode or in UEFI (modern, extensible BIOS replacement) mode.
328
- # We use UEFI mode.
329
- # self.get(path: "Systems/System.Embedded.1/Bios/Settings?$select=BootMode")
330
- res = self.get(path: "Systems/System.Embedded.1/Bios")
331
- if res["body"]["Attributes"]["BootMode"] == "Uefi"
332
- return { status: :success }
333
- else
334
- res = self.set_system_configuration_profile(scp_boot_mode_uefi, reboot: true)
335
- # Then must power cycle the server
336
- self.power_on!(wait: true)
337
- self.power_off!(wait: true)
338
- return res
339
- end
340
326
 
341
- =end
342
327
  def scp_boot_mode_uefi(idrac_license_version: 9)
343
328
  opts = { "BootMode" => 'Uefi' }
344
329
  # If we're iDRAC 9, we need enable a placeholder, otherwise we can't order the
data/lib/idrac/power.rb CHANGED
@@ -58,7 +58,15 @@ module IDRAC
58
58
  return true
59
59
  end
60
60
 
61
+ # Reset types that restart the host rather than leave it down. A restart never settles on
62
+ # "Off", so it must never be waited on — or escalated to — as if it were a shutdown.
63
+ RESTART_TYPES = %w[ForceRestart GracefulRestart PowerCycle].freeze
64
+
61
65
  def power_off(wait: true, kind: "ForceOff")
66
+ # A restart is not a shutdown. Sent down the power-off path it fails the wait for "Off" and
67
+ # escalates to ForceOff, which leaves the host powered down. Route it to the restart instead.
68
+ return reboot(kind: kind, wait: wait) if RESTART_TYPES.include?(kind)
69
+
62
70
  ensure_authenticated!
63
71
 
64
72
  puts "Powering off server...".light_cyan
@@ -93,37 +101,39 @@ module IDRAC
93
101
  return true
94
102
  end
95
103
 
96
- def reboot
104
+ def reboot(kind: "ForceRestart", wait: false)
97
105
  ensure_authenticated!
98
106
 
99
- puts "Rebooting server...".light_cyan
107
+ puts "Rebooting server (#{kind})...".light_cyan
100
108
 
101
109
  # Check current power state first
102
110
  current_state = get_power_state rescue "Unknown"
103
111
  if current_state == "Off"
104
112
  puts "Server is currently off, powering on instead of rebooting".yellow
105
- return power_on
113
+ return power_on(wait: wait)
106
114
  end
107
115
 
108
- # Send reboot command (Reset with ResetType=ForceRestart)
109
116
  path = "/redfish/v1/Systems/System.Embedded.1/Actions/ComputerSystem.Reset"
110
- payload = { "ResetType" => "ForceRestart" }
111
-
112
- response = authenticated_request(:post, path, body: payload.to_json)
117
+ response = authenticated_request(:post, path, body: { "ResetType" => kind }.to_json)
113
118
 
114
119
  if response.status >= 200 && response.status < 300
115
120
  puts "Server reboot command sent successfully".green
116
- return true
117
- elsif response.status == 409
121
+ elsif response.status == 409 && kind != "GracefulRestart"
118
122
  error_data = JSON.parse(response.body) rescue nil
119
123
  puts "Received conflict (409) error from iDRAC: #{error_data.inspect}"
120
124
  # Try gracefulRestart as an alternative
121
125
  puts "Trying GracefulRestart instead...".yellow
122
- payload = { "ResetType" => "GracefulRestart" }
123
- authenticated_request(:post, path, body: payload.to_json)
126
+ response = authenticated_request(:post, path, body: { "ResetType" => "GracefulRestart" }.to_json)
127
+ raise Error, "Failed to reboot server. Status code: #{response.status}" unless response.status.between?(200, 299)
124
128
  else
125
129
  raise Error, "Failed to reboot server. Status code: #{response.status}"
126
130
  end
131
+
132
+ # "On" is the only terminal state a restart reaches. Never wait for "Off" here: the host may
133
+ # never report it, and treating that as failure is what turned a reboot into a shutdown.
134
+ wait_for_power_state(target_state: "On", tries: 12) if wait
135
+
136
+ return true
127
137
  end
128
138
 
129
139
  def get_power_state
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.10.3"
4
+ VERSION = "0.10.4"
5
5
  end
metadata CHANGED
@@ -1,13 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: idrac
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.3
4
+ version: 0.10.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jonathan Siegel
8
+ autorequire:
8
9
  bindir: bin
9
10
  cert_chain: []
10
- date: 1980-01-02 00:00:00.000000000 Z
11
+ date: 2026-08-29 00:00:00.000000000 Z
11
12
  dependencies:
12
13
  - !ruby/object:Gem::Dependency
13
14
  name: httparty
@@ -281,6 +282,7 @@ licenses:
281
282
  metadata:
282
283
  homepage_uri: https://github.com/buildio/idrac
283
284
  source_code_uri: https://github.com/buildio/idrac
285
+ post_install_message:
284
286
  rdoc_options: []
285
287
  require_paths:
286
288
  - lib
@@ -295,7 +297,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
295
297
  - !ruby/object:Gem::Version
296
298
  version: '0'
297
299
  requirements: []
298
- rubygems_version: 3.6.9
300
+ rubygems_version: 3.5.16
301
+ signing_key:
299
302
  specification_version: 4
300
303
  summary: API Client for Dell iDRAC
301
304
  test_files: []