1#!/usr/bin/env python 2 3import dbus 4 5 6dbus_objects = { 7 "power": { 8 "bus_name": "org.openbmc.control.Power", 9 "object_name": "/org/openbmc/control/power0", 10 "interface_name": "org.openbmc.control.Power", 11 }, 12 "occstatus0": { 13 "bus_name": "org.openbmc.Sensors", 14 "object_name": "/org/openbmc/sensors/host/cpu0/OccStatus", 15 "interface_name": "org.openbmc.SensorValue", 16 }, 17 "occstatus1": { 18 "bus_name": "org.openbmc.Sensors", 19 "object_name": "/org/openbmc/sensors/host/cpu1/OccStatus", 20 "interface_name": "org.openbmc.SensorValue", 21 }, 22 "bootprogress": { 23 "bus_name": "org.openbmc.Sensors", 24 "object_name": "/org/openbmc/sensors/host/BootProgress", 25 "interface_name": "org.openbmc.SensorValue", 26 }, 27 "host": { 28 "bus_name": "xyz.openbmc_project.State.Host", 29 "object_name": "/xyz/openbmc_project/state/host0", 30 "interface_name": "xyz.openbmc_project.State.Host", 31 }, 32 "settings": { 33 "bus_name": "org.openbmc.settings.Host", 34 "object_name": "/org/openbmc/settings/host0", 35 "interface_name": "org.freedesktop.DBus.Properties", 36 }, 37 "system": { 38 "bus_name": "org.openbmc.managers.System", 39 "object_name": "/org/openbmc/managers/System", 40 "interface_name": "org.freedesktop.DBus.Properties", 41 }, 42 "powersupplyredundancy": { 43 "bus_name": "org.openbmc.Sensors", 44 "object_name": "/org/openbmc/sensors/host/PowerSupplyRedundancy", 45 "interface_name": "org.openbmc.SensorValue", 46 }, 47 "turboallowed": { 48 "bus_name": "org.openbmc.Sensors", 49 "object_name": "/org/openbmc/sensors/host/TurboAllowed", 50 "interface_name": "org.openbmc.SensorValue", 51 }, 52 "powersupplyderating": { 53 "bus_name": "org.openbmc.Sensors", 54 "object_name": "/org/openbmc/sensors/host/PowerSupplyDerating", 55 "interface_name": "org.openbmc.SensorValue", 56 }, 57} 58 59 60def getInterface(bus, objs, key): 61 obj = bus.get_object( 62 objs[key]["bus_name"], objs[key]["object_name"], introspect=False 63 ) 64 return dbus.Interface(obj, objs[key]["interface_name"]) 65 66 67def getProperty(bus, objs, key, prop): 68 obj = bus.get_object( 69 objs[key]["bus_name"], objs[key]["object_name"], introspect=False 70 ) 71 intf = dbus.Interface(obj, dbus.PROPERTIES_IFACE) 72 return intf.Get(objs[key]["interface_name"], prop) 73 74 75def setProperty(bus, objs, key, prop, prop_value): 76 obj = bus.get_object(objs[key]["bus_name"], objs[key]["object_name"]) 77 intf = dbus.Interface(obj, dbus.PROPERTIES_IFACE) 78 return intf.Set(objs[key]["interface_name"], prop, prop_value) 79 80 81bus = dbus.SystemBus() 82pgood = getProperty(bus, dbus_objects, "power", "pgood") 83 84if pgood == 1: 85 intf = getInterface(bus, dbus_objects, "bootprogress") 86 intf.setValue("FW Progress, Starting OS") 87 intf = getInterface(bus, dbus_objects, "occstatus0") 88 intf.setValue("Enabled") 89 intf = getInterface(bus, dbus_objects, "occstatus1") 90 intf.setValue("Enabled") 91else: 92 # Power is off, so check power policy 93 settings_intf = getInterface(bus, dbus_objects, "settings") 94 system_intf = getInterface(bus, dbus_objects, "system") 95 system_last_state = system_intf.Get( 96 "org.openbmc.managers.System", "system_last_state" 97 ) 98 power_policy = settings_intf.Get( 99 "org.openbmc.settings.Host", "power_policy" 100 ) 101 print( 102 "Last System State:" 103 + system_last_state 104 + "Power Policy:" 105 + power_policy 106 ) 107 108 if power_policy == "ALWAYS_POWER_ON" or ( 109 power_policy == "RESTORE_LAST_STATE" 110 and system_last_state == "HOST_POWERED_ON" 111 ): 112 setProperty( 113 bus, 114 dbus_objects, 115 "host", 116 "RequestedHostTransition", 117 "xyz.openbmc_project.State.Host.Transition.On", 118 ) 119 120# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4 121