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