#!/usr/bin/env python

import dbus


dbus_objects = {
    'power': {
        'bus_name': 'org.openbmc.control.Power',
        'object_name': '/org/openbmc/control/power0',
        'interface_name': 'org.openbmc.control.Power'
    },
    'occstatus0': {
        'bus_name': 'org.openbmc.Sensors',
        'object_name': '/org/openbmc/sensors/host/cpu0/OccStatus',
        'interface_name': 'org.openbmc.SensorValue'
    },
    'occstatus1': {
        'bus_name': 'org.openbmc.Sensors',
        'object_name': '/org/openbmc/sensors/host/cpu1/OccStatus',
        'interface_name': 'org.openbmc.SensorValue'
    },
    'bootprogress': {
        'bus_name': 'org.openbmc.Sensors',
        'object_name': '/org/openbmc/sensors/host/BootProgress',
        'interface_name': 'org.openbmc.SensorValue'
    },
    'host': {
        'bus_name': 'xyz.openbmc_project.State.Host',
        'object_name': '/xyz/openbmc_project/state/host0',
        'interface_name': 'xyz.openbmc_project.State.Host'
    },
    'settings': {
        'bus_name': 'org.openbmc.settings.Host',
        'object_name': '/org/openbmc/settings/host0',
        'interface_name': 'org.freedesktop.DBus.Properties'
    },
    'system': {
        'bus_name': 'org.openbmc.managers.System',
        'object_name': '/org/openbmc/managers/System',
        'interface_name': 'org.freedesktop.DBus.Properties'
    },
    'powersupplyredundancy': {
        'bus_name': 'org.openbmc.Sensors',
        'object_name': '/org/openbmc/sensors/host/PowerSupplyRedundancy',
        'interface_name': 'org.openbmc.SensorValue'
    },
    'turboallowed': {
        'bus_name': 'org.openbmc.Sensors',
        'object_name': '/org/openbmc/sensors/host/TurboAllowed',
        'interface_name': 'org.openbmc.SensorValue'
    },
    'powersupplyderating': {
        'bus_name': 'org.openbmc.Sensors',
        'object_name': '/org/openbmc/sensors/host/PowerSupplyDerating',
        'interface_name': 'org.openbmc.SensorValue'
    },
}


def getInterface(bus, objs, key):
    obj = bus.get_object(
        objs[key]['bus_name'], objs[key]['object_name'], introspect=False)
    return dbus.Interface(obj, objs[key]['interface_name'])


def getProperty(bus, objs, key, prop):
    obj = bus.get_object(
        objs[key]['bus_name'], objs[key]['object_name'], introspect=False)
    intf = dbus.Interface(obj, dbus.PROPERTIES_IFACE)
    return intf.Get(objs[key]['interface_name'], prop)

def setProperty(bus, objs, key, prop, prop_value):
    obj = bus.get_object(
        objs[key]['bus_name'], objs[key]['object_name'])
    intf = dbus.Interface(obj, dbus.PROPERTIES_IFACE)
    return intf.Set(objs[key]['interface_name'], prop, prop_value)

bus = dbus.SystemBus()
pgood = getProperty(bus, dbus_objects, 'power', 'pgood')

if (pgood == 1):
    intf = getInterface(bus, dbus_objects, 'bootprogress')
    intf.setValue("FW Progress, Starting OS")
    intf = getInterface(bus, dbus_objects, 'occstatus0')
    intf.setValue("Enabled")
    intf = getInterface(bus, dbus_objects, 'occstatus1')
    intf.setValue("Enabled")
else:
    # Power is off, so check power policy
    settings_intf = getInterface(bus, dbus_objects, 'settings')
    system_intf = getInterface(bus, dbus_objects, 'system')
    system_last_state = system_intf.Get("org.openbmc.managers.System",
                                        "system_last_state")
    power_policy = settings_intf.Get("org.openbmc.settings.Host",
                                     "power_policy")
    print "Last System State:"+system_last_state+"Power Policy:"+power_policy

    if (power_policy == "ALWAYS_POWER_ON" or
       (power_policy == "RESTORE_LAST_STATE" and
            system_last_state == "HOST_POWERED_ON")):
        setProperty(bus, dbus_objects, 'host', 'RequestedHostTransition',
                    'xyz.openbmc_project.State.Host.Transition.On')

# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4
