lots of changes
diff --git a/bin/Openbmc.py b/bin/Openbmc.py
index cb2746a..87c5ae6 100755
--- a/bin/Openbmc.py
+++ b/bin/Openbmc.py
@@ -103,8 +103,55 @@
parent = False
+class DbusProperties(dbus.service.Object):
+ def __init__(self):
+ dbus.service.Object.__init__(self)
+ self.properties = {}
-class DbusProperty:
+ @dbus.service.method(dbus.PROPERTIES_IFACE,
+ in_signature='ss', out_signature='v')
+ def Get(self, interface_name, property_name):
+ d = self.GetAll(interface_name)
+ try:
+ v = d[property_name]
+ return v
+ except:
+ raise dbus.exceptions.DBusException(
+ "org.freedesktop.UnknownPropery: "+property_name)
+
+ @dbus.service.method(dbus.PROPERTIES_IFACE,
+ in_signature='s', out_signature='a{sv}')
+ def GetAll(self, interface_name):
+ try:
+ d = self.properties[interface_name]
+ return d
+ except:
+ raise dbus.exceptions.DBusException(
+ "org.freedesktop.UnknownInterface: "+interface_name)
+
+ @dbus.service.method(dbus.PROPERTIES_IFACE,
+ in_signature='ssv')
+ def Set(self, interface_name, property_name, new_value):
+ if (self.properties.has_key(interface_name) == False):
+ self.properties[interface_name] = {}
+ try:
+ old_value = self.properties[interface_name][property_name]
+ if (old_value != new_value):
+ self.properties[interface_name][property_name] = new_value
+ self.PropertiesChanged(interface_name,{ property_name: new_value }, [])
+
+ except:
+ self.properties[interface_name][property_name] = new_value
+
+ @dbus.service.signal(dbus.PROPERTIES_IFACE,
+ signature='sa{sv}as')
+ def PropertiesChanged(self, interface_name, changed_properties,
+ invalidated_properties):
+ pass
+
+
+
+class DbusVariable:
def __init__(self,name,value):
self.name = str(name)
self.dbusType = str(type(value)).split("'")[1]
diff --git a/bin/Palmetto.py b/bin/Palmetto.py
index db940b7..e7425d4 100755
--- a/bin/Palmetto.py
+++ b/bin/Palmetto.py
@@ -10,30 +10,51 @@
SYSTEM_NAME = "Palmetto"
+
+## System states
+## state can change to next state in 2 ways:
+## - a process emits a GotoSystemState signal with state name to goto
+## - objects specified in EXIT_STATE_DEPEND have started
SYSTEM_STATES = [
- 'INIT',
- 'STANDBY',
- 'POWERING_ON',
- 'POWERED_ON',
- 'BOOTING',
+ 'BMC_INIT',
+ 'BMC_STARTING',
+ 'BMC_READY',
+ 'HOST_POWERING_ON',
+ 'HOST_POWERED_ON',
+ 'HOST_BOOTING',
'HOST_UP',
- 'SHUTTING_DOWN',
- 'POWERING_DOWN'
+ 'HOST_POWERED_DOWN',
]
+EXIT_STATE_DEPEND = {
+ 'BMC_STARTING' : {
+ '/org/openbmc/control/chassis0': 0,
+ '/org/openbmc/control/power0' : 0,
+ '/org/openbmc/control/led/BMC_READY' : 0,
+ '/org/openbmc/control/Host_0' : 0,
+ }
+}
+
+## method will be called when state is entered
ENTER_STATE_CALLBACK = {
- 'POWERED_ON' : {
+ 'HOST_POWERED_ON' : {
'bus_name' : 'org.openbmc.control.Host',
'obj_name' : '/org/openbmc/control/Host_0',
'interface_name' : 'org.openbmc.control.Host',
'method_name' : 'boot'
+ },
+ 'BMC_READY' : {
+ 'bus_name' : 'org.openbmc.control.led',
+ 'obj_name' : '/org/openbmc/control/led/BMC_READY',
+ 'interface_name' : 'org.openbmc.Led',
+ 'method_name' : 'setOn'
}
}
SYSTEM_CONFIG = {}
SYSTEM_CONFIG['org.openbmc.control.Bmc'] = {
- 'system_state' : 'INIT',
+ 'system_state' : 'BMC_INIT',
'start_process' : True,
'monitor_process' : True,
'process_name' : 'control_bmc.exe',
@@ -42,7 +63,7 @@
}
SYSTEM_CONFIG['org.openbmc.managers.Inventory'] = {
- 'system_state' : 'STANDBY',
+ 'system_state' : 'BMC_STARTING',
'start_process' : True,
'monitor_process' : True,
'process_name' : 'inventory_items.py',
@@ -50,7 +71,7 @@
'instances' : [ { 'name' : SYSTEM_NAME } ]
}
SYSTEM_CONFIG['org.openbmc.control.PciePresent'] = {
- 'system_state' : 'POWERED_ON',
+ 'system_state' : 'HOST_POWERED_ON',
'start_process' : True,
'monitor_process' : False,
'process_name' : 'pcie_slot_present.exe',
@@ -58,16 +79,16 @@
'instances' : [ { 'name' : 'Slots_0' } ]
}
SYSTEM_CONFIG['org.openbmc.sensor.Power8Virtual'] = {
- 'system_state' : 'STANDBY',
+ 'system_state' : 'BMC_STARTING',
'start_process' : True,
'monitor_process' : True,
'process_name' : 'sensors_virtual_p8.py',
'heartbeat' : 'no',
- 'instances' : [ { 'name' : 'Dummy' } ]
+ 'instances' : [ { 'name' : 'virtual' } ]
}
SYSTEM_CONFIG['org.openbmc.managers.Sensors'] = {
- 'system_state' : 'STANDBY',
+ 'system_state' : 'BMC_STARTING',
'start_process' : True,
'monitor_process' : True,
'process_name' : 'sensor_manager.py',
@@ -76,7 +97,7 @@
}
SYSTEM_CONFIG['org.openbmc.watchdog.Host'] = {
- 'system_state' : 'STANDBY',
+ 'system_state' : 'BMC_STARTING',
'start_process' : True,
'monitor_process' : True,
'process_name' : 'host_watchdog.exe',
@@ -94,14 +115,14 @@
}
SYSTEM_CONFIG['org.openbmc.control.Power'] = {
- 'system_state' : 'STANDBY',
+ 'system_state' : 'BMC_STARTING',
'start_process' : True,
'monitor_process' : True,
'process_name' : 'power_control.exe',
'heartbeat' : 'no',
'instances' : [
{
- 'name' : 'SystemPower_0',
+ 'name' : 'power0',
'user_label': 'Power control',
'properties' : {
'org.openbmc.Control': {
@@ -116,7 +137,7 @@
}
SYSTEM_CONFIG['org.openbmc.sensors.Temperature.Ambient'] = {
- 'system_state' : 'STANDBY',
+ 'system_state' : 'BMC_STARTING',
'start_process' : True,
'monitor_process' : True,
'process_name' : 'sensor_ambient.exe',
@@ -144,31 +165,23 @@
]
}
SYSTEM_CONFIG['org.openbmc.buttons.Power'] = {
- 'system_state' : 'STANDBY',
+ 'system_state' : 'BMC_STARTING',
'start_process' : True,
'monitor_process' : True,
'process_name' : 'button_power.exe',
'heartbeat' : 'no',
'instances' : [ { 'name' : 'PowerButton_0' } ]
}
-SYSTEM_CONFIG['org.openbmc.sensors.HostStatus'] = {
- 'system_state' : 'STANDBY',
- 'start_process' : False,
- 'monitor_process' : False,
- 'process_name' : 'sensor_host_status.exe',
- 'heartbeat' : "no",
- 'instances' : [ { 'name' : 'HostStatus_0' } ]
- }
-SYSTEM_CONFIG['org.openbmc.leds.ChassisIdentify'] = {
- 'system_state' : 'STANDBY',
+SYSTEM_CONFIG['org.openbmc.control.led'] = {
+ 'system_state' : 'BMC_STARTING',
'start_process' : True,
'monitor_process' : True,
- 'process_name' : 'chassis_identify.exe',
+ 'process_name' : 'led_controller.exe',
'heartbeat' : 'no',
- 'instances' : [ { 'name' : 'ChassisIdentify_0' } ]
+ 'instances' : [ { 'name' : 'Dummy' } ]
}
SYSTEM_CONFIG['org.openbmc.flash.Bios'] = {
- 'system_state' : 'STANDBY',
+ 'system_state' : 'BMC_STARTING',
'start_process' : True,
'monitor_process' : True,
'process_name' : 'flash_bios.exe',
@@ -177,7 +190,7 @@
}
SYSTEM_CONFIG['org.openbmc.manager.Download'] = {
- 'system_state' : 'STANDBY',
+ 'system_state' : 'BMC_STARTING',
'start_process' : True,
'monitor_process' : True,
'process_name' : 'download_manager.py',
@@ -186,7 +199,7 @@
}
SYSTEM_CONFIG['org.openbmc.control.Host'] = {
- 'system_state' : 'STANDBY',
+ 'system_state' : 'BMC_STARTING',
'start_process' : True,
'monitor_process' : True,
'process_name' : 'control_host.exe',
@@ -194,17 +207,17 @@
'instances' : [ { 'name' : 'Host_0' } ]
}
SYSTEM_CONFIG['org.openbmc.control.Chassis'] = {
- 'system_state' : 'STANDBY',
+ 'system_state' : 'BMC_STARTING',
'start_process' : True,
'monitor_process' : True,
'process_name' : 'chassis_control.py',
'heartbeat' : 'no',
- 'instances' : [ { 'name' : 'Chassis' } ]
+ 'instances' : [ { 'name' : 'chassis0' } ]
}
SYSTEM_CONFIG['org.openbmc.vpd'] = {
- 'system_state' : 'POWERING_ON',
- 'start_process' : True,
+ 'system_state' : 'HOST_POWERED_ON',
+ 'start_process' : False,
'monitor_process' : False,
'process_name' : 'board_vpd.exe',
'heartbeat' : 'no',
@@ -212,9 +225,9 @@
}
SYSTEM_CONFIG['org.openbmc.sensors.Occ'] = {
- 'system_state' : 'BOOTED',
- 'start_process' : True,
- 'monitor_process' : True,
+ 'system_state' : 'BMC_STARTING',
+ 'start_process' : False,
+ 'monitor_process' : False,
'process_name' : 'sensor_occ.exe',
'heartbeat' : 'no',
'instances' : [
@@ -231,7 +244,7 @@
}
SYSTEM_CONFIG['org.openbmc.sensors.Fan'] = {
- 'system_state' : 'STANDBY',
+ 'system_state' : 'BMC_STARTING',
'start_process' : True,
'monitor_process' : True,
'process_name' : 'fan.exe',
@@ -246,7 +259,7 @@
'state' : True,
'cache' : True
}
-INVENTORY_ROOT = '/org/openbmc/inventory/items'
+INVENTORY_ROOT = '/org/openbmc/inventory'
FRU_INSTANCES = {
'<inventory_root>/system' :
@@ -386,11 +399,14 @@
ID_LOOKUP = {
'FRU' : {
+ 0x0d : '<inventory_root>/system',
0x01 : '<inventory_root>/system/motherboard/cpu0',
+ 0x02 : '<inventory_root>/system/motherboard/centaur0',
0x03 : '<inventory_root>/system/motherboard/dimm0',
0x04 : '<inventory_root>/system/motherboard/dimm1',
0x05 : '<inventory_root>/system/motherboard/dimm2',
0x06 : '<inventory_root>/system/motherboard/dimm3',
+ 0xff : '<inventory_root>/system',
},
'SENSOR' : {
0x2f : '<inventory_root>/system/motherboard/cpu0',
@@ -420,7 +436,6 @@
'GPIO_PRESENT' : {
'SLOT0_PRESENT' : '<inventory_root>/system/io_board/pcie_slot0',
'SLOT1_PRESENT' : '<inventory_root>/system/io_board/pcie_slot1',
- 'SLOT2_PRESENT' : '<inventory_root>/system/io_board/pcie_slot2',
}
}
@@ -432,6 +447,7 @@
GPIO_CONFIG['CRONUS_SEL'] = { 'gpio_num': 486, 'direction': 'out' }
GPIO_CONFIG['PGOOD'] = { 'gpio_num': 503, 'direction': 'in' }
GPIO_CONFIG['IDENTIFY'] = { 'gpio_num': 365, 'direction': 'out' }
+GPIO_CONFIG['BMC_READY'] = { 'gpio_num': 365, 'direction': 'out' }
GPIO_CONFIG['POWER_BUTTON'] = { 'gpio_num': 448, 'direction': 'falling' }
GPIO_CONFIG['SLOT0_RISER_PRESENT'] = { 'gpio_num': 104, 'direction': 'in' }
GPIO_CONFIG['SLOT1_RISER_PRESENT'] = { 'gpio_num': 105, 'direction': 'in' }
diff --git a/bin/PropertyManager.py b/bin/PropertyManager.py
index b89ed12..1fa8d87 100755
--- a/bin/PropertyManager.py
+++ b/bin/PropertyManager.py
@@ -23,7 +23,7 @@
for prop_interface in properties.keys():
for prop in properties[prop_interface]:
tmp_val = dbus_properties.Get(prop_interface,prop)
- dbus_prop = Openbmc.DbusProperty(prop,tmp_val)
+ dbus_prop = Openbmc.DbusVariable(prop,tmp_val)
value = properties[prop_interface][prop]
dbus_prop.setValue(value)
dbus_properties.Set(prop_interface,prop,dbus_prop.getValue())
@@ -66,7 +66,7 @@
print "Caching: "+obj_path
all_properties = prop_intf.GetAll(interface_name)
for prop in all_properties.keys():
- dbus_prop = Openbmc.DbusProperty(prop,all_properties[prop])
+ dbus_prop = Openbmc.DbusVariable(prop,all_properties[prop])
dbus_props.append(dbus_prop)
try:
diff --git a/bin/chassis_control.py b/bin/chassis_control.py
index 2770507..bf84a13 100755
--- a/bin/chassis_control.py
+++ b/bin/chassis_control.py
@@ -10,6 +10,7 @@
DBUS_NAME = 'org.openbmc.control.Chassis'
OBJ_NAME = '/org/openbmc/control/'+sys.argv[1]
+CONTROL_INTF = 'org.openbmc.Control'
POWER_OFF = 0
POWER_ON = 1
@@ -25,12 +26,12 @@
self.dbus_objects = {
'power_control' : {
'bus_name' : 'org.openbmc.control.Power',
- 'object_name' : '/org/openbmc/control/SystemPower_0',
+ 'object_name' : '/org/openbmc/control/power0',
'interface_name' : 'org.openbmc.control.Power'
},
'identify_led' : {
- 'bus_name' : 'org.openbmc.leds.ChassisIdentify',
- 'object_name' : '/org/openbmc/leds/ChassisIdentify_0',
+ 'bus_name' : 'org.openbmc.control.led',
+ 'object_name' : '/org/openbmc/led/IDENTIFY',
'interface_name' : 'org.openbmc.Led'
}
}
diff --git a/bin/inventory_items.py b/bin/inventory_items.py
index d337d95..d27abd3 100755
--- a/bin/inventory_items.py
+++ b/bin/inventory_items.py
@@ -18,6 +18,7 @@
INTF_NAME = 'org.openbmc.InventoryItem'
DBUS_NAME = 'org.openbmc.managers.Inventory'
+ENUM_INTF = 'org.openbmc.Object.Enumerate'
FRUS = System.FRU_INSTANCES
FRU_PATH = System.FRU_PATH
@@ -35,74 +36,70 @@
def addItem(self,item):
self.objects.append(item)
- @dbus.service.method("org.openbmc.managers.Inventory",
+ @dbus.service.method(ENUM_INTF,
in_signature='', out_signature='a{sa{sv}}')
- def getItems(self):
+ def enumerate(self):
tmp_obj = {}
for item in self.objects:
- tmp_obj[str(item.item['name'])]=item.getItemDict()
+ tmp_obj[str(item.name)]=item.GetAll(INTF_NAME)
return tmp_obj
-class InventoryItem(dbus.service.Object):
- def __init__(self,bus,name):
+class InventoryItem(Openbmc.DbusProperties):
+ def __init__(self,bus,name):
+ Openbmc.DbusProperties.__init__(self)
dbus.service.Object.__init__(self,bus,name)
- ## store all properties in a dict so can easily
- ## send on dbus
- self.item = {
- 'name' : name,
- 'is_fru' : False,
- 'fru_type' : 0,
- 'state' : 0,
- 'manufacturer' : "",
- }
+ self.name = name
self.cache = True
-
- def getItemDict(self):
- return self.item
-
- @dbus.service.method('org.openbmc.InventoryItem',
+ self.Set(INTF_NAME,'is_fru',False)
+ self.Set(INTF_NAME,'fru_type',0)
+ self.Set(INTF_NAME,'present',"INACTIVE")
+ self.Set(INTF_NAME,'fault',"NONE")
+
+
+
+ @dbus.service.method(INTF_NAME,
in_signature='a{sv}', out_signature='')
def update(self,data):
## translate dbus data into basic data types
for k in data.keys():
- d = Openbmc.DbusProperty(k,data[k])
- self.item[str(k)] = d.getBaseValue()
+ self.setField(k,data[k])
+
self.saveToCache()
- @dbus.service.method("org.openbmc.InventoryItem",
+ @dbus.service.method(INTF_NAME,
in_signature='s', out_signature='')
def setPresent(self,present):
- self.item['present'] = present
- print "Set Present: "+str(present)
+ self.setField('present',present)
- @dbus.service.method("org.openbmc.InventoryItem",
+ @dbus.service.method(INTF_NAME,
in_signature='s', out_signature='')
def setFault(self,fault):
- self.item['fault_state'] = fault
- print "Set Fault: "+str(fault)
+ self.setField('fault',fault)
def setField(self,field,value):
- self.item[field] = value
+ f = str(field)
+ d = Openbmc.DbusVariable(f,value)
+ self.Set(INTF_NAME,f,d.getBaseValue())
def isCached(self):
return self.cache
def getCacheFilename(self):
global FRU_PATH
- name = self.item['name'].replace('/','.')
+ name = self.name.replace('/','.')
filename = FRU_PATH+name[1:]+".fru"
return filename
def saveToCache(self):
if (self.isCached() == False):
return
- print "Caching: "+self.item['name']
+ print "Caching: "+self.name
try:
output = open(self.getCacheFilename(), 'wb')
- ## just pickle dict not whole object
- cPickle.dump(self.item,output)
+ ## save properties
+ cPickle.dump(self.properties[INTF_NAME],output)
except Exception as e:
print "ERROR: "+str(e)
finally:
@@ -119,7 +116,7 @@
p = open(filename, 'rb')
data2 = cPickle.load(p)
for k in data2.keys():
- self.item[k] = data2[k]
+ self.setField(k,data2[k])
except Exception as e:
print "No cache file found: " +str(e)
finally:
@@ -131,7 +128,7 @@
bus = Openbmc.getDBus()
name = dbus.service.BusName(DBUS_NAME,bus)
mainloop = gobject.MainLoop()
- obj_parent = Inventory(bus, '/org/openbmc/managers/Inventory')
+ obj_parent = Inventory(bus, '/org/openbmc/inventory')
for f in FRUS.keys():
obj_path=f.replace("<inventory_root>",System.INVENTORY_ROOT)
diff --git a/bin/ipmi_example.py b/bin/ipmi_example.py
index bc506fa..b998ba5 100755
--- a/bin/ipmi_example.py
+++ b/bin/ipmi_example.py
@@ -25,7 +25,7 @@
def getChassisControl():
obj = bus.get_object('org.openbmc.control.Chassis',
- '/org/openbmc/control/Chassis')
+ '/org/openbmc/control/chassis0')
intf = dbus.Interface(obj, 'org.openbmc.control.Chassis' )
return intf
@@ -76,18 +76,25 @@
d = { 'manufacturer' : data }
intf_sys = Openbmc.getManagerInterface(bus,"System")
c = chr(int(ipmi_id))
- obj_info = intf_sys.getObjectFromByteId("FRU",chr(int(ipmi_id)))
+ print c
+ obj_info = intf_sys.getObjectFromByteId("FRU",c)
+ intf_name = obj_info[2]
obj_path = obj_info[1]
bus_name = obj_info[0]
if (obj_path != "" and bus_name != ""):
obj = bus.get_object(bus_name,obj_path)
- intf = dbus.Interface(obj,"org.openbmc.InventoryItem")
+ intf = dbus.Interface(obj,intf_name)
intf.update(d)
elif (cmd == "getfrus"):
- intf_fru = Openbmc.getManagerInterface(bus,"Inventory")
- data = intf_fru.getItems()
+ obj = bus.get_object('org.openbmc.managers.Inventory',
+ '/org/openbmc/inventory')
+ intf_fru = dbus.Interface(obj,'org.openbmc.Object.Enumerate')
+
+ data = intf_fru.enumerate()
for i in data:
+ print ">>>>>>>>"
+ print i
for k in data[i].keys():
print k+" = "+str(data[i][k])
elif (cmd == "updatefwftp"):
diff --git a/bin/ipmid.py b/bin/ipmid.py
deleted file mode 100755
index 4f01421..0000000
--- a/bin/ipmid.py
+++ /dev/null
@@ -1,86 +0,0 @@
-#!/usr/bin/env python
-
-import sys
-import subprocess
-import dbus
-import string
-import os
-import fcntl
-import glib
-import gobject
-import dbus.service
-import dbus.mainloop.glib
-
-DBUS_NAME = 'org.openbmc.HostIpmi'
-OBJ_NAME = '/org/openbmc/HostIpmi/1'
-
-def print_packet(seq, netfn, cmd, data):
-# print 'seq: 0x%02x\nnetfn: 0x%02x\ncmd: 0x%02x\ndata: [%s]' % (
-# seq, netfn, cmd,
-# ", ".join(['0x%02x' % x for x in data]))
- new_str = ""
- for x in data:
- new_str += "0x%s " % (x.encode('hex'))
- print new_str
-
-
-class Ipmid(dbus.service.Object):
- def __init__(self, bus, name):
- dbus.service.Object.__init__(self,bus,name)
-
- def setReader(self, reader):
- self.reader = reader
-
- @dbus.service.signal(DBUS_NAME, "yyyay")
- def ReceivedMessage(self, seq, netfn, cmd, data):
- print("IPMI packet from host. Seq = 0x%x Netfn = 0x%x Cmd = 0x%x" %
- (ord(seq), ord(netfn), ord(cmd)))
- print_packet(seq, netfn, cmd, data)
-
- @dbus.service.method(DBUS_NAME, "", "")
- def test(self):
- print("TEST")
-
- @dbus.service.method(DBUS_NAME, "yyyay", "x")
- def sendMessage(self, seq, netfn, cmd, data):
- print("IPMI packet sent to host. Seq = 0x%x Netfn = 0x%x Cmd = 0x%x" %
- (int(seq), int(netfn), int(cmd)))
- #print_packet(seq, netfn, cmd, data)
-
- self.reader.write(seq, netfn, cmd, data)
-
- return 0
-
-class BtReader(object):
- def __init__(self, ipmi_obj):
- self.ipmi_obj = ipmi_obj
- flags = os.O_NONBLOCK | os.O_RDWR
- self.bt = os.open("/dev/bt", flags)
- glib.io_add_watch(self.bt, glib.IO_IN, self.io_callback)
- ipmi_obj.setReader(self)
-
- def write(self, seq, netfn, cmd, data):
- # Untested
- val = chr(netfn) + chr(seq) + chr(cmd)
- val += reduce(lambda a, b: a + chr(b), data, "")
- val = chr(len(val)) + val
- os.write(self.bt, val)
-
- def io_callback(self, fd, condition):
- data = os.read(self.bt, 128)
- if (len(data) > 2):
- self.ipmi_obj.ReceivedMessage(data[2], data[1], data[3], data[4:])
- return True
-
-def main():
- dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
- bus = dbus.SystemBus()
- name = dbus.service.BusName(DBUS_NAME, bus)
- obj = Ipmid(bus, OBJ_NAME)
- r = BtReader(obj)
- mainloop = gobject.MainLoop()
- print("Started")
- mainloop.run()
-
-if __name__ == '__main__':
- sys.exit(main())
diff --git a/bin/sensor_manager.py b/bin/sensor_manager.py
index 9f3ab56..a91235e 100755
--- a/bin/sensor_manager.py
+++ b/bin/sensor_manager.py
@@ -14,7 +14,8 @@
import Openbmc
DBUS_NAME = 'org.openbmc.managers.Sensors'
-OBJ_NAME = '/org/openbmc/managers/Sensors'
+OBJ_NAME = '/org/openbmc/sensors'
+ENUM_INTF = 'org.openbmc.Object.Enumerate'
class SensorManager(dbus.service.Object):
def __init__(self,bus,name):
@@ -37,9 +38,9 @@
self.sensor_cache = {}
- @dbus.service.method(DBUS_NAME,
+ @dbus.service.method(ENUM_INTF,
in_signature='', out_signature='a{sa{sv}}')
- def getSensors(self):
+ def enumerate(self):
return self.sensor_cache;
diff --git a/bin/sensors_virtual_p8.py b/bin/sensors_virtual_p8.py
index d8bf1ef..1488256 100755
--- a/bin/sensors_virtual_p8.py
+++ b/bin/sensors_virtual_p8.py
@@ -8,151 +8,80 @@
import dbus.mainloop.glib
import Openbmc
-SENSOR_INTERFACE = 'org.openbmc.SensorValue'
DBUS_NAME = 'org.openbmc.sensor.Power8Virtual'
OBJ_NAME = '/org/openbmc/sensor/virtual/'
-class BootProgress(dbus.service.Object):
+class SensorValue(Openbmc.DbusProperties):
+ IFACE_NAME = 'org.openbmc.SensorValue'
+ def __init__(self):
+ Openbmc.DbusProperties.__init__(self)
+ self.Set(SensorValue.IFACE_NAME,'units',"")
+
+ @dbus.service.method(IFACE_NAME,
+ in_signature='v', out_signature='')
+ def setValue(self,value):
+ changed = False
+ try:
+ old_value = self.Get(SensorValue.IFACE_NAME,'value')
+ if (value != old_value):
+ changed = True
+ except:
+ changed = True
+
+ if (changed == True):
+ self.Set(SensorValue.IFACE_NAME,'value',value)
+ self.Changed(self.getValue(),self.getUnits())
+
+
+
+ @dbus.service.method(IFACE_NAME,
+ in_signature='', out_signature='v')
+ def getValue(self):
+ return self.Get(SensorValue.IFACE_NAME,'value')
+
+ @dbus.service.method(IFACE_NAME,
+ in_signature='', out_signature='s')
+ def getUnits(self):
+ return self.Get(SensorValue.IFACE_NAME,'units')
+
+ @dbus.service.signal(IFACE_NAME,signature='vs')
+ def Changed(self,value,units):
+ pass
+
+
+
+
+
+class BootProgress(SensorValue):
def __init__(self,bus,name):
+ SensorValue.__init__(self)
self.object_name = "BootProgress"
- self.value = 0
- self.units = ""
dbus.service.Object.__init__(self,bus,name+self.object_name)
-
- @dbus.service.method(SENSOR_INTERFACE,
- in_signature='v', out_signature='')
- def setValue(self,value):
- if (value != self.value):
- self.value=value
- self.Changed()
-
- @dbus.service.method(SENSOR_INTERFACE,
- in_signature='', out_signature='v')
- def getValue(self):
- return self.value;
-
- @dbus.service.method(SENSOR_INTERFACE,
- in_signature='', out_signature='s')
- def getUnits(self):
- return self.units;
-
- @dbus.service.signal(SENSOR_INTERFACE,signature='vs')
- def Changed(self,value,units):
- pass
-class HostStatus(dbus.service.Object):
+class HostStatus(SensorValue):
def __init__(self,bus,name):
+ SensorValue.__init__(self)
self.object_name = "HostStatus"
- self.value = 0
- self.units = ""
dbus.service.Object.__init__(self,bus,name+self.object_name)
- @dbus.service.method(SENSOR_INTERFACE,
- in_signature='v', out_signature='')
- def setValue(self,value):
- if (value != self.value):
- self.value=value
- self.Changed(self.value,self.units)
-
- @dbus.service.method(SENSOR_INTERFACE,
- in_signature='', out_signature='v')
- def getValue(self):
- return self.value;
-
- @dbus.service.method(SENSOR_INTERFACE,
- in_signature='', out_signature='s')
- def getUnits(self):
- return self.units;
-
- @dbus.service.signal(SENSOR_INTERFACE,signature='vs')
- def Changed(self,value,units):
- pass
-
-class OsStatus(dbus.service.Object):
+class OsStatus(SensorValue):
def __init__(self,bus,name):
+ SensorValue.__init__(self)
self.object_name = "OperatingSystemStatus"
- self.value = 0
- self.units = ""
dbus.service.Object.__init__(self,bus,name+self.object_name)
- @dbus.service.method(SENSOR_INTERFACE,
- in_signature='v', out_signature='')
- def setValue(self,value):
- if (value != self.value):
- self.value=value
- self.Changed(self.value,self.units)
-
- @dbus.service.method(SENSOR_INTERFACE,
- in_signature='', out_signature='v')
- def getValue(self):
- return self.value;
-
- @dbus.service.method(SENSOR_INTERFACE,
- in_signature='', out_signature='s')
- def getUnits(self):
- return self.units;
-
- @dbus.service.signal(SENSOR_INTERFACE,signature='vs')
- def Changed(self,value,units):
- pass
-
-class BootCount(dbus.service.Object):
+class BootCount(SensorValue):
def __init__(self,bus,name):
+ SensorValue.__init__(self)
self.object_name = "BootCount"
- self.value = 0
- self.units = ""
dbus.service.Object.__init__(self,bus,name+self.object_name)
- @dbus.service.method(SENSOR_INTERFACE,
- in_signature='v', out_signature='')
- def setValue(self,value):
- if (value != self.value):
- self.value=value
- self.Changed(self.value,self.units)
-
- @dbus.service.method(SENSOR_INTERFACE,
- in_signature='', out_signature='v')
- def getValue(self):
- return self.value;
-
- @dbus.service.method(SENSOR_INTERFACE,
- in_signature='', out_signature='s')
- def getUnits(self):
- return self.units;
-
- @dbus.service.signal(SENSOR_INTERFACE,signature='vs')
- def Changed(self,value,units):
- pass
-
-
-class OccStatus(dbus.service.Object):
+class OccStatus(SensorValue):
def __init__(self,bus,name):
+ SensorValue.__init__(self)
self.object_name = "OccStatus"
- self.value = 0
- self.units = ""
dbus.service.Object.__init__(self,bus,name+self.object_name)
- @dbus.service.method(SENSOR_INTERFACE,
- in_signature='v', out_signature='')
- def setValue(self,value):
- if (value != self.value):
- self.value=value
- self.Changed(self.value,self.units)
-
- @dbus.service.method(SENSOR_INTERFACE,
- in_signature='', out_signature='v')
- def getValue(self):
- return self.value;
-
- @dbus.service.method(SENSOR_INTERFACE,
- in_signature='', out_signature='s')
- def getUnits(self):
- return self.units;
-
- @dbus.service.signal(SENSOR_INTERFACE,signature='vs')
- def Changed(self,value,units):
- pass
-
if __name__ == '__main__':
dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
@@ -164,6 +93,12 @@
boot_count = BootCount(bus,OBJ_NAME)
occ_status = OccStatus(bus,OBJ_NAME)
mainloop = gobject.MainLoop()
+
+ boot_progress.setValue("INACTIVE")
+ host_status.setValue("OFF")
+ os_status.setValue("OFF")
+ boot_count.setValue(0)
+ occ_status.setValue(0)
print "Starting virtual sensors"
mainloop.run()
diff --git a/bin/system_manager.py b/bin/system_manager.py
index 17285b2..441e957 100755
--- a/bin/system_manager.py
+++ b/bin/system_manager.py
@@ -25,7 +25,7 @@
STATE_START_TIMEOUT = 10
INTF_SENSOR = 'org.openbmc.SensorValue'
INTF_ITEM = 'org.openbmc.InventoryItem'
-
+INTF_CONTROL = 'org.openbmc.Control'
class SystemManager(dbus.service.Object):
def __init__(self,bus,name):
@@ -41,7 +41,6 @@
self.current_state = ""
self.system_states = {}
self.bus_name_lookup = {}
-
self.bin_path = os.path.dirname(os.path.realpath(sys.argv[0]))
for bus_name in System.SYSTEM_CONFIG.keys():
@@ -57,7 +56,7 @@
new_val = val.replace("<inventory_root>",System.INVENTORY_ROOT)
System.ID_LOOKUP[category][key] = new_val
- self.SystemStateHandler("INIT")
+ self.SystemStateHandler("BMC_INIT")
print "SystemManager Init Done"
def SystemStateHandler(self,state_name):
@@ -72,21 +71,30 @@
if (i == STATE_START_TIMEOUT):
print "ERROR: Timeout waiting for state to finish: "+self.current_state
return
+
+ ## clearing object started flags
+ try:
+ for obj_path in System.EXIT_STATE_DEPEND[self.current_state]:
+ System.EXIT_STATE_DEPEND[self.current_state][obj_path] = 0
+ except:
+ pass
print "Running System State: "+state_name
if (self.system_states.has_key(state_name)):
for bus_name in self.system_states[state_name]:
self.start_process(bus_name)
- if (state_name == "INIT"):
+ if (state_name == "BMC_INIT"):
## Add poll for heartbeat
gobject.timeout_add(HEARTBEAT_CHECK_INTERVAL, self.heartbeat_check)
- if (System.ENTER_STATE_CALLBACK.has_key(state_name)):
+ try:
cb = System.ENTER_STATE_CALLBACK[state_name]
obj = bus.get_object(cb['bus_name'],cb['obj_name'])
method = obj.get_dbus_method(cb['method_name'],cb['interface_name'])
method()
+ except:
+ pass
self.current_state = state_name
@@ -119,7 +127,7 @@
obj_path = System.ID_LOOKUP[category][byte]
bus_name = self.bus_name_lookup[obj_path]
parts = obj_path.split('/')
- if (parts[2] == 'sensor'):
+ if (parts[3] == 'sensor'):
intf_name = INTF_SENSOR
except Exception as e:
print "ERROR SystemManager: "+str(e)+" not found in lookup"
@@ -175,10 +183,14 @@
try:
Openbmc.get_objs(bus,bus_name,"",objects)
for instance_name in objects.keys():
- self.bus_name_lookup[objects[instance_name]['PATH']] = bus_name
+ obj_path = objects[instance_name]['PATH']
+ self.bus_name_lookup[obj_path] = bus_name
+ if (System.EXIT_STATE_DEPEND[self.current_state].has_key(obj_path) == True):
+ System.EXIT_STATE_DEPEND[self.current_state][obj_path] = 1
+
except:
pass
-
+
if (System.SYSTEM_CONFIG.has_key(bus_name)):
System.SYSTEM_CONFIG[bus_name]['heartbeat_count'] = 0
for instance_name in objects.keys():
@@ -195,6 +207,28 @@
print "Calling init method: " +obj_path+" : "+init_intf
intf.init()
+ ## check if all objects are started to move to next state
+ try:
+ state = 1
+ for obj_path in System.EXIT_STATE_DEPEND[self.current_state]:
+ if (System.EXIT_STATE_DEPEND[self.current_state][obj_path] == 0):
+ state = 0
+ if (state == 1):
+ s = 0
+ for i in range(len(System.SYSTEM_STATES)):
+ if (System.SYSTEM_STATES[i] == self.current_state):
+ s = i+1
+
+ if (s == len(System.SYSTEM_STATES)):
+ print "ERROR SystemManager: No more system states"
+ else:
+ new_state_name = System.SYSTEM_STATES[s]
+ print "SystemManager Goto System State: "+new_state_name
+ self.SystemStateHandler(new_state_name)
+ except:
+ pass
+
+
@dbus.service.method(DBUS_NAME,
in_signature='s', out_signature='sis')