Starting point for Windows packaging. Serial backend will be replaced with pyserial; PyInstaller used to produce a standalone .exe. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
151 lines
4.3 KiB
Python
151 lines
4.3 KiB
Python
"""
|
|
workflow_restart.py — Restart IOM workflow.
|
|
Sends a GracefulRestart to a selected IOM via either a direct network
|
|
Redfish connection or a serial console curl command.
|
|
"""
|
|
|
|
import time
|
|
|
|
from redfish import _redfish_restart_iom
|
|
from workflow_serial import (
|
|
detect_serial_device,
|
|
open_serial_connection,
|
|
_login_serial_console,
|
|
_serial_redfish_request,
|
|
)
|
|
from ui import (
|
|
_c, C,
|
|
banner, rule,
|
|
info, ok, warn, error,
|
|
prompt, prompt_ip, prompt_password, prompt_yn,
|
|
)
|
|
|
|
|
|
def _iom_prompt() -> str:
|
|
"""Ask which IOM to target and return 'IOM1' or 'IOM2'."""
|
|
print()
|
|
print(" Which IOM would you like to restart?")
|
|
print(f" {_c(C.BOLD, '1')} IOM1")
|
|
print(f" {_c(C.BOLD, '2')} IOM2")
|
|
print()
|
|
while True:
|
|
choice = prompt("Select [1/2]")
|
|
if choice in ("1", "2"):
|
|
break
|
|
warn("Please enter 1 or 2.")
|
|
return "IOM1" if choice == "1" else "IOM2"
|
|
|
|
|
|
# ── Network restart ────────────────────────────────────────────────────────────
|
|
|
|
def _restart_via_network():
|
|
banner()
|
|
rule("Restart IOM -- Network Connection")
|
|
|
|
print()
|
|
password = prompt_password()
|
|
print()
|
|
ip = prompt_ip(" IOM IP address (either IOM1 or IOM2)")
|
|
iom = _iom_prompt()
|
|
|
|
print()
|
|
if not prompt_yn(f"Restart {iom} at {ip}?", default=False):
|
|
info("Restart cancelled.")
|
|
print()
|
|
prompt("Press Enter to return to main menu")
|
|
return
|
|
|
|
info(f"Sending restart command to {iom}...")
|
|
ok_flag, data = _redfish_restart_iom(password, ip, iom)
|
|
if ok_flag:
|
|
ok(f"{iom} restart initiated.")
|
|
info("The IOM will be temporarily unreachable while rebooting.")
|
|
else:
|
|
error(f"Restart failed: {data}")
|
|
|
|
print()
|
|
prompt("Press Enter to return to main menu")
|
|
|
|
|
|
# ── Serial restart ─────────────────────────────────────────────────────────────
|
|
|
|
def _restart_via_serial():
|
|
banner()
|
|
rule("Restart IOM -- Serial Connection")
|
|
|
|
device = detect_serial_device()
|
|
if not device:
|
|
error("Could not detect a serial device. Returning to main menu.")
|
|
time.sleep(2)
|
|
return
|
|
|
|
ser = open_serial_connection(device)
|
|
if not ser:
|
|
error("Could not open serial port. Returning to main menu.")
|
|
time.sleep(2)
|
|
return
|
|
|
|
print()
|
|
logged_in, password = _login_serial_console(ser)
|
|
if not logged_in:
|
|
error("Could not log in to IOM console. Returning to main menu.")
|
|
if ser.is_open:
|
|
ser.close()
|
|
time.sleep(2)
|
|
return
|
|
|
|
iom = _iom_prompt()
|
|
|
|
print()
|
|
if not prompt_yn(f"Restart {iom} via serial?", default=False):
|
|
info("Restart cancelled.")
|
|
if ser.is_open:
|
|
ser.close()
|
|
print()
|
|
prompt("Press Enter to return to main menu")
|
|
return
|
|
|
|
info(f"Sending restart command to {iom}...")
|
|
ok_flag, data = _serial_redfish_request(
|
|
ser, password, "POST",
|
|
f"/redfish/v1/Managers/{iom}/Actions/Manager.Reset",
|
|
{"ResetType": "GracefulRestart"},
|
|
)
|
|
if ok_flag:
|
|
ok(f"{iom} restart initiated.")
|
|
info("The IOM will be temporarily unreachable while rebooting.")
|
|
else:
|
|
error(f"Restart failed: {data}")
|
|
|
|
if ser.is_open:
|
|
ser.close()
|
|
ok(f"Serial port {device} closed.")
|
|
|
|
print()
|
|
prompt("Press Enter to return to main menu")
|
|
|
|
|
|
# ── Top-level entry point ──────────────────────────────────────────────────────
|
|
|
|
def restart_iom_workflow():
|
|
banner()
|
|
rule("Restart IOM")
|
|
|
|
print(" How do you want to connect to the IOM?")
|
|
print()
|
|
print(f" {_c(C.BOLD, '1')} Network connection")
|
|
print(f" {_c(C.BOLD, '2')} Serial connection")
|
|
print(f" {_c(C.BOLD, '3')} Cancel")
|
|
print()
|
|
|
|
while True:
|
|
choice = prompt("Select [1/2/3]")
|
|
if choice in ("1", "2", "3"):
|
|
break
|
|
warn("Please enter 1, 2, or 3.")
|
|
|
|
if choice == "1":
|
|
_restart_via_network()
|
|
elif choice == "2":
|
|
_restart_via_serial()
|