|
@@ -0,0 +1,76 @@
|
|
|
|
|
+def decode_psu_status(hex_input):
|
|
|
|
|
+ """
|
|
|
|
|
+ PSU Decoder by Parv Ashwani
|
|
|
|
|
+ ---------------------------
|
|
|
|
|
+ Decodes a PSU status hex value into human-readable descriptions
|
|
|
|
|
+ based on standard IPMI bitmask definitions.
|
|
|
|
|
+ """
|
|
|
|
|
+ bitmask_definitions = {
|
|
|
|
|
+ 1: "Presence Detected",
|
|
|
|
|
+ 2: "Failure Detected",
|
|
|
|
|
+ 4: "Predictive Failure",
|
|
|
|
|
+ 8: "Input Lost",
|
|
|
|
|
+ 16: "Out of Range",
|
|
|
|
|
+ 32: "Detected Out of Range",
|
|
|
|
|
+ 64: "Configuration Error",
|
|
|
|
|
+ 128: "Reserved"
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ print("\n" + "="*50)
|
|
|
|
|
+ print(f"DECODING INPUT: {hex_input}")
|
|
|
|
|
+ print("="*50)
|
|
|
|
|
+
|
|
|
|
|
+ try:
|
|
|
|
|
+ decimal_value = int(hex_input, 16)
|
|
|
|
|
+ except ValueError:
|
|
|
|
|
+ print("Error: Invalid hex input.")
|
|
|
|
|
+ return
|
|
|
|
|
+
|
|
|
|
|
+ print(f"\n[Step 1] Hex to Decimal Conversion:")
|
|
|
|
|
+ print(f" Hex '{hex_input}' --> Decimal {decimal_value}")
|
|
|
|
|
+ active_flags = []
|
|
|
|
|
+ math_parts = []
|
|
|
|
|
+
|
|
|
|
|
+ print(f"\n[Step 2] Bitwise Analysis (Checking switches):")
|
|
|
|
|
+ for bit_value, description in sorted(bitmask_definitions.items(), reverse=True):
|
|
|
|
|
+
|
|
|
|
|
+ if (decimal_value & bit_value) == bit_value:
|
|
|
|
|
+ status = "ON"
|
|
|
|
|
+ active_flags.append(description)
|
|
|
|
|
+ math_parts.append(str(bit_value))
|
|
|
|
|
+ print(f" - Checking Bit {bit_value:>3}: {status} --> Found: {description}")
|
|
|
|
|
+ else:
|
|
|
|
|
+ # Optional: Uncomment below line to see checks that failed
|
|
|
|
|
+ # print(f" - Checking Bit {bit_value:>3}: OFF")
|
|
|
|
|
+ pass
|
|
|
|
|
+
|
|
|
|
|
+ print(f"\n[Step 3] Calculation Explanation:")
|
|
|
|
|
+ if math_parts:
|
|
|
|
|
+ equation = " + ".join(math_parts)
|
|
|
|
|
+ print(f" Math: {equation} = {decimal_value}")
|
|
|
|
|
+ else:
|
|
|
|
|
+ print(" No active flags found (Value is 0).")
|
|
|
|
|
+
|
|
|
|
|
+ print(f"\n[RESULT]:")
|
|
|
|
|
+ if active_flags:
|
|
|
|
|
+ for flag in active_flags:
|
|
|
|
|
+ print(f" >> {flag}")
|
|
|
|
|
+ else:
|
|
|
|
|
+ print(" >> No active status flags.")
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+# ==========================================
|
|
|
|
|
+# MAIN LOOP
|
|
|
|
|
+# ==========================================
|
|
|
|
|
+if __name__ == "__main__":
|
|
|
|
|
+ print("--- PSU Status Decoder Tool ---")
|
|
|
|
|
+ while True:
|
|
|
|
|
+ user_input = input("\nEnter Hex value (e.g., 0xb) or 'q' to quit: ").strip()
|
|
|
|
|
+
|
|
|
|
|
+ if user_input.lower() == 'q':
|
|
|
|
|
+ print("Exiting...")
|
|
|
|
|
+ print("Made with ☕︎ by Parv")
|
|
|
|
|
+ break
|
|
|
|
|
+
|
|
|
|
|
+ if user_input:
|
|
|
|
|
+ decode_psu_status(user_input)
|