lots of changes
diff --git a/bin/Barreleye.py b/bin/Barreleye.py
index ce24a0b..7d0bf12 100644
--- a/bin/Barreleye.py
+++ b/bin/Barreleye.py
@@ -2,20 +2,61 @@
import dbus
import Openbmc
+CACHED_INTERFACES = {
+ 'org.openbmc.Fru' : True
+}
+
SYSTEM_CONFIG = {}
+SYSTEM_CONFIG['org.openbmc.managers.Sensors'] = {
+ 'exe_name' : 'bin/sensor_manager.py',
+ 'heartbeat' : 'no',
+ 'rest_name' : 'sensors',
+ 'instances' : [
+ {
+ 'name' : 'Barreleye',
+ 'user_label': 'Sensor Manager',
+ }
+ ]
+ }
+
+#SYSTEM_CONFIG['org.openbmc.managers.Frus'] = {
+# 'exe_name' : 'bin/fru_manager.py',
+# 'heartbeat' : 'no',
+# 'rest_name' : 'frus',
+# 'instances' : [
+# {
+# 'name' : 'Barreleye',
+# 'user_label': 'Fru Manager',
+# }
+# ]
+# }
+
+
SYSTEM_CONFIG['org.openbmc.loggers.EventLogger'] = {
'exe_name' : 'bin/eventlogger.py',
'heartbeat' : 'no',
'rest_name' : 'events',
'instances' : [
{
- 'name' : 'Chassis',
- 'user_label': 'Chassis Control',
+ 'name' : 'Barreleye',
+ 'user_label': 'Event Logger',
}
]
}
+SYSTEM_CONFIG['org.openbmc.managers.IpmiTranslator'] = {
+ 'exe_name' : 'bin/ipmi_translator.py',
+ 'heartbeat' : 'no',
+ 'instances' : [
+ {
+ 'name' : 'Barreleye',
+ 'user_label': 'IPMI Translator',
+ }
+ ]
+ }
+
+
SYSTEM_CONFIG['org.openbmc.control.Power'] = {
'exe_name' : 'bin/power_control.exe',
'heartbeat' : 'yes',
@@ -30,35 +71,41 @@
SYSTEM_CONFIG['org.openbmc.sensors.Temperature.Ambient'] = {
'exe_name' : 'bin/sensor_ambient.exe',
'heartbeat' : 'yes',
+ 'init_methods' : ['org.openbmc.SensorInteger'],
+ 'poll_interval': 5000,
'instances' : [
{
'name' : 'AmbientTemperature1',
'user_label': 'Ambient Temperature 1',
- 'parameters': ['/dev/i2c0','0xA0'],
- 'poll_interval': 5000,
+ 'sensor_id' : 41,
'properties' : {
'org.openbmc.SensorIntegerThreshold' : {
'lower_critical': 5,
'lower_warning' : 10,
'upper_warning' : 15,
'upper_critical': 20
+ },
+ 'org.openbmc.SensorI2c' : {
+ 'dev_path' : '/dev/i2c/i2c0',
+ 'address' : '0xA0'
}
}
},
{
'name' : 'AmbientTemperature2',
'user_label': 'Ambient Temperature 2',
- 'parameters': ['/dev/i2c0','0xA2'],
- 'poll_interval': 5000,
'properties' : {
'org.openbmc.SensorIntegerThreshold' : {
'lower_critical': 5,
'lower_warning' : 10,
'upper_warning' : 15,
'upper_critical': 20
+ },
+ 'org.openbmc.SensorI2c' : {
+ 'dev_path' : '/dev/i2c/i2c0',
+ 'address' : '0xA2'
}
}
-
}
]
}
@@ -79,6 +126,7 @@
{
'name' : 'HostStatus1',
'user_label': 'Host Status',
+ 'sensor_id' : 43,
}
]
}
@@ -204,13 +252,50 @@
]
}
+SYSTEM_CONFIG['org.openbmc.frus.Board'] = {
+ 'exe_name' : 'bin/fru_board.exe',
+ 'init_methods' : ['org.openbmc.Fru'],
+ 'heartbeat' : 'no',
+ 'instances' : [
+ {
+ 'name' : 'IO_Planer',
+ 'user_label': 'IO Planar',
+ 'fru_id' : 61,
+ 'properties' : {
+ 'org.openbmc.Fru' : {
+ 'label' : 'IO Planar',
+ 'location' : 'IO_PLANAR',
+ 'type' : Openbmc.FRU_TYPES['BACKPLANE']
+ },
+ 'org.openbmc.Fru.Eeprom' : {
+ 'i2c_address' : '0xA8',
+ 'i2c_dev_path' : '/dev/i2c/i2c5'
+ }
+ }
+ }
+ ]
+ }
+
SYSTEM_CONFIG['org.openbmc.frus.Fru'] = {
'exe_name' : 'bin/fru_generic.exe',
'heartbeat' : 'no',
- 'instances' : [
+ 'instances' : [
+ {
+ 'name' : 'Backplane',
+ 'user_label': '2S Motherboard',
+ 'fru_id' : 60,
+ 'properties' : {
+ 'org.openbmc.Fru' : {
+ 'label' : 'MAIN_PLANAR',
+ 'location' : 'C0',
+ 'type' : Openbmc.FRU_TYPES['BACKPLANE'],
+ }
+ }
+ },
{
'name' : 'DIMM0',
'user_label': 'DIMM A0 Slot 0',
+ 'fru_id' : 12,
'properties' : {
'org.openbmc.Fru' : {
'label' : 'DIMM0',
diff --git a/bin/Openbmc.py b/bin/Openbmc.py
index c250bdf..ffa38dd 100644
--- a/bin/Openbmc.py
+++ b/bin/Openbmc.py
@@ -5,17 +5,56 @@
FRU_TYPES = {
- 'CPU' : dbus.Byte(1),
- 'DIMM' : dbus.Byte(2),
- 'BACKPLANE' : dbus.Byte(3),
- 'RISER_CARD' : dbus.Byte(4),
- 'FAN' : dbus.Byte(4)
+ 'CPU' : 1,
+ 'DIMM' : 2,
+ 'BACKPLANE' : 3,
+ 'RISER_CARD' : 4,
+ 'FAN' : 5
}
-
ENUMS = {
'org.openbmc.SensorIntegerThreshold.state' :
['NOT_SET','NORMAL','LOWER_CRITICAL','LOWER_WARNING','UPPER_WARNING','UPPER_CRITICAL'],
'org.openbmc.Fru.type' :
['NONE','CPU','DIMM','BACKPLANE','RISER_CARD','FAN']
}
-
+
+class DbusProperty:
+ def __init__(self,name,value):
+ self.dbusBaseType = {
+ 'dbus.Byte' : 'int',
+ 'dbus.Float' : 'float',
+ 'dbus.Int32' : 'int',
+ 'dbus.UInt32' : 'long',
+ 'dbus.String' : 'str',
+ 'dbus.UInt64' : 'long',
+ }
+ self.name = str(name)
+ self.dbusType = str(type(value)).split("'")[1]
+ self.value = None
+ try:
+ self.value = eval(self.dbusBaseType[self.dbusType]+"(value)")
+ except:
+ raise Exception("Unknown dbus type: "+self.dbusType)
+
+ def changeValue(self,value):
+ try:
+ self.value = eval(self.dbusBaseType[self.dbusType]+"(value)")
+ except:
+ raise Exception("Unknown dbus type: "+self.dbusType)
+
+
+ def getName(self):
+ return self.name
+ def getValue(self):
+ e = self.dbusType+"(self.value)"
+ return eval(e)
+
+ #def __getstate__(self):
+ # odict = self.__dict__.copy() # copy the dict since we change it
+ # return odict
+
+ ##def __setstate__(self, dict):
+ # self.__dict__.update(dict) # update attributes
+
+ def __str__(self):
+ return self.dbusType+":"+str(self.value)
diff --git a/bin/chassis_control.py b/bin/chassis_control.py
index c319527..ccea354 100644
--- a/bin/chassis_control.py
+++ b/bin/chassis_control.py
@@ -15,10 +15,15 @@
class ChassisControlObject(dbus.service.Object):
def __init__(self,bus,name):
self.dbus_objects = { }
+
+ ## load utilized objects
self.dbus_busses = {
- 'org.openbmc.control.Power' : [ { 'name' : 'PowerControl1' , 'intf' : 'org.openbmc.control.Power' } ],
- 'org.openbmc.leds.ChassisIdentify' : [ { 'name' : 'ChassisIdentify1', 'intf' : 'org.openbmc.control.Chassis' } ],
- 'org.openbmc.control.Host' : [ { 'name' : 'HostControl1', 'intf' : 'org.openbmc.control.Host' } ]
+ 'org.openbmc.control.Power' :
+ [ { 'name' : 'PowerControl1' , 'intf' : 'org.openbmc.control.Power' } ],
+ 'org.openbmc.leds.ChassisIdentify' :
+ [ { 'name' : 'ChassisIdentify1', 'intf' : 'org.openbmc.control.Chassis' } ],
+ 'org.openbmc.control.Host' :
+ [ { 'name' : 'HostControl1', 'intf' : 'org.openbmc.control.Host' } ]
}
self.power_sequence = 0
dbus.service.Object.__init__(self,bus,name)
@@ -26,12 +31,16 @@
try:
for bus_name in self.dbus_busses.keys():
self.request_name(bus_name,"",bus_name)
- bus.add_signal_receiver(self.request_name,
- dbus_interface = 'org.freedesktop.DBus',
- signal_name = "NameOwnerChanged")
- except dbus.exceptions.DBusException, e:
- # TODO: not sure what to do if can't find other services
- print e
+
+ except:
+ ## its ok if this fails. hotplug will detect too
+ print "Warning: One of processes not started yet."
+ pass
+
+ ## add signal handler to detect when new objects show up on dbus
+ bus.add_signal_receiver(self.request_name,
+ dbus_interface = 'org.freedesktop.DBus',
+ signal_name = "NameOwnerChanged")
bus.add_signal_receiver(self.power_button_signal_handler,
dbus_interface = "org.openbmc.Button", signal_name = "ButtonPressed",
@@ -45,12 +54,13 @@
def request_name(self, bus_name, a, b):
# bus added
if (len(b) > 0 ):
+ ## if bus in required list for this object, then save a pointer to interface
+ ## for method calls
if (self.dbus_busses.has_key(bus_name)):
obj_path = "/"+bus_name.replace('.','/')
for objs in self.dbus_busses[bus_name]:
inst_name = objs['name']
obj = bus.get_object(bus_name,obj_path+"/"+inst_name)
- print "Interface: "+inst_name+","+objs['intf']
self.dbus_objects[inst_name] = dbus.Interface(obj, objs['intf'])
diff --git a/bin/eventlogger.py b/bin/eventlogger.py
new file mode 100644
index 0000000..113bd03
--- /dev/null
+++ b/bin/eventlogger.py
@@ -0,0 +1,37 @@
+#!/usr/bin/env python
+
+import sys
+import gobject
+import dbus
+import dbus.service
+import dbus.mainloop.glib
+import syslog
+import json
+
+DBUS_NAME = 'org.openbmc.loggers.EventLogger'
+OBJ_NAME = '/org/openbmc/loggers/EventLogger/'+sys.argv[1]
+
+class EventLogger(dbus.service.Object):
+ def __init__(self,bus,name):
+ dbus.service.Object.__init__(self,bus,name)
+ bus = dbus.SessionBus()
+ syslog.openlog('openbmc')
+
+ bus.add_signal_receiver(self.event_log_signal_handler,
+ dbus_interface = "org.openbmc.EventLog", signal_name = "EventLog" )
+
+ ## Signal handler
+ def event_log_signal_handler(self,message):
+ syslog.syslog(json.dumps(message))
+
+if __name__ == '__main__':
+ dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
+
+ bus = dbus.SessionBus()
+ name = dbus.service.BusName(DBUS_NAME, bus)
+ obj = EventLogger(bus, OBJ_NAME)
+ mainloop = gobject.MainLoop()
+
+ print "Running EventLogger"
+ mainloop.run()
+
diff --git a/bin/ipmi_bt.py b/bin/ipmi_bt.py
new file mode 100644
index 0000000..8e4566e
--- /dev/null
+++ b/bin/ipmi_bt.py
@@ -0,0 +1,76 @@
+#!/usr/bin/env python
+
+import sys
+import subprocess
+import gobject
+import dbus
+import dbus.service
+import dbus.mainloop.glib
+import xml.etree.ElementTree as ET
+
+if (len(sys.argv) < 2):
+ print "Usage: ipmi_bt.py [system name]"
+ exit(1)
+
+System = __import__(sys.argv[1])
+import Openbmc
+
+DBUS_NAME = 'org.openbmc.control.IpmiBt'
+OBJ_NAME = '/org/openbmc/control/IpmiBt'
+
+class IpmiBt(dbus.service.Object):
+ def __init__(self,bus,name):
+ dbus.service.Object.__init__(self,bus,name)
+
+ @dbus.service.signal(DBUS_NAME)
+ def UpdateFru(self, iid, message):
+ pass
+
+ @dbus.service.signal(DBUS_NAME)
+ def UpdateSensor(self, iid, message):
+ pass
+
+ @dbus.service.method(DBUS_NAME)
+ def emitUpdateFru(self,ipmi_id,mfg):
+ data = {
+ 'manufacturer' : mfg
+ }
+ self.UpdateFru(ipmi_id,data)
+ return 'Signal emitted'
+
+ @dbus.service.method(DBUS_NAME)
+ def emitUpdateSensor(self,ipmi_id,data):
+ self.UpdateSensor(ipmi_id,int(data))
+ print "update sensor emitted"
+ return 'Signal emitted'
+
+ def getSensor(self,ipmi_id):
+ obj = bus.get_object('org.openbmc.managers.IpmiTranslator',
+ '/org/openbmc/managers/IpmiTranslator/Barreleye')
+ intf = dbus.Interface(obj, 'org.openbmc.managers.IpmiTranslator' )
+ return intf.getSensor(ipmi_id)
+
+
+if __name__ == '__main__':
+
+ cmd = sys.argv[2]
+ ipmi_id = int(sys.argv[3])
+ if (len(sys.argv)>4):
+ data = sys.argv[4]
+
+ dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
+ bus = dbus.SessionBus()
+ name = dbus.service.BusName(DBUS_NAME,bus)
+ obj = IpmiBt(bus,OBJ_NAME)
+ mainloop = gobject.MainLoop()
+
+ if (cmd == 'updatefru'):
+ obj.emitUpdateFru(ipmi_id,data)
+ elif (cmd == 'setsensor'):
+ obj.emitUpdateSensor(ipmi_id,data)
+ elif (cmd == 'getsensor'):
+ print obj.getSensor(ipmi_id)
+
+
+ #mainloop.run()
+
diff --git a/bin/ipmi_translator.py b/bin/ipmi_translator.py
new file mode 100644
index 0000000..ec56057
--- /dev/null
+++ b/bin/ipmi_translator.py
@@ -0,0 +1,111 @@
+#!/usr/bin/env python
+
+import sys
+import subprocess
+import gobject
+import dbus
+import dbus.service
+import dbus.mainloop.glib
+import xml.etree.ElementTree as ET
+import PropertyManager
+
+if (len(sys.argv) < 2):
+ print "Usage: ipmi_translator.py [system name]"
+ exit(1)
+
+System = __import__(sys.argv[1])
+import Openbmc
+
+DBUS_NAME = 'org.openbmc.managers.IpmiTranslator'
+OBJ_NAME = '/org/openbmc/managers/IpmiTranslator/'+sys.argv[1]
+ID_LOOKUP = {
+ 'BUS_NAME' : {},
+ 'FRU' : {},
+ 'SENSOR' : {},
+}
+
+
+class IpmiTranslator(dbus.service.Object):
+ def __init__(self,bus,name):
+ dbus.service.Object.__init__(self,bus,name)
+ bus.add_signal_receiver(self.UpdateFruHandler,
+ dbus_interface = 'org.openbmc.control.IpmiBt',
+ signal_name = "UpdateFru")
+ bus.add_signal_receiver(self.UpdateSensorHandler,
+ dbus_interface = 'org.openbmc.control.IpmiBt',
+ signal_name = "UpdateSensor")
+
+ ## generate fru and sensor id to dbus object path lookup
+ for bus_name in System.SYSTEM_CONFIG.keys():
+ obj_name = "/"+bus_name.replace('.','/')
+ for instances in System.SYSTEM_CONFIG[bus_name]['instances']:
+ obj_path = obj_name+"/"+instances['name']
+ if (instances.has_key('sensor_id')):
+ iid = instances['sensor_id']
+ ID_LOOKUP['BUS_NAME'][iid] = bus_name
+ ID_LOOKUP['SENSOR'][iid] = obj_path
+ if (instances.has_key('fru_id')):
+ iid = instances['fru_id']
+ ID_LOOKUP['BUS_NAME'][iid] = bus_name
+ ID_LOOKUP['FRU'][iid] = obj_path
+
+
+ ## TODO: Should be event driven instead of calling object methods because
+ ## object could be hung
+ def UpdateFruHandler(self,fru_id,data):
+ if (ID_LOOKUP['FRU'].has_key(fru_id)):
+ obj_path = ID_LOOKUP['FRU'][fru_id]
+ bus_name = ID_LOOKUP['BUS_NAME'][fru_id]
+ ## save fru object to object and disk
+ interface_name = 'org.openbmc.Fru'
+ cache = System.CACHED_INTERFACES.has_key(interface_name)
+ PropertyManager.saveProperties(bus,bus_name,obj_path,interface_name,cache,data)
+ else:
+ ## TODO: error handling
+ pass
+
+ def UpdateSensorHandler(self,sensor_id,value):
+ if (ID_LOOKUP['SENSOR'].has_key(sensor_id)):
+ obj_path = ID_LOOKUP['SENSOR'][sensor_id]
+ bus_name = ID_LOOKUP['BUS_NAME'][sensor_id]
+ data = { 'value' : value }
+ ## save sensor value
+ ## TODO: need to accomodate any sensor interface
+ interface_name = 'org.openbmc.SensorInteger'
+ #cache = System.CACHED_INTERFACES.has_key(interface_name)
+ obj = bus.get_object(bus_name,obj_path)
+ intf = dbus.Interface(obj, interface_name)
+ #intf.setValue(value)
+ PropertyManager.saveProperties(bus,bus_name,obj_path,interface_name,cache,data)
+ else:
+ ## TODO: error handling
+ pass
+
+ @dbus.service.method(DBUS_NAME,
+ in_signature='i', out_signature='i')
+ def getSensor(self,sensor_id):
+ val = 0
+ if (ID_LOOKUP['SENSOR'].has_key(sensor_id)):
+ obj_path = ID_LOOKUP['SENSOR'][sensor_id]
+ bus_name = ID_LOOKUP['BUS_NAME'][sensor_id]
+ print "getSensor: "+obj_path+","+bus_name
+ ## TODO don't do hardcoding
+ obj = bus.get_object('org.openbmc.managers.Sensors',
+ '/org/openbmc/managers/Sensors/Barreleye')
+ intf = dbus.Interface(obj, 'org.openbmc.managers.Sensors' )
+ val = intf.getSensor(obj_path)
+ print "value = "+str(val)
+
+ return val
+
+
+if __name__ == '__main__':
+ dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
+ bus = dbus.SessionBus()
+ name = dbus.service.BusName(DBUS_NAME,bus)
+ obj = IpmiTranslator(bus,OBJ_NAME)
+ mainloop = gobject.MainLoop()
+
+ print "Running IpmiTranslator"
+ mainloop.run()
+
diff --git a/bin/sensor_manager.py b/bin/sensor_manager.py
new file mode 100644
index 0000000..33feebf
--- /dev/null
+++ b/bin/sensor_manager.py
@@ -0,0 +1,85 @@
+#!/usr/bin/env python
+
+import sys
+import gobject
+import dbus
+import dbus.service
+import dbus.mainloop.glib
+
+if (len(sys.argv) < 2):
+ print "Usage: sensor_manager.py [system name]"
+ exit(1)
+
+import Openbmc
+
+DBUS_NAME = 'org.openbmc.managers.Sensors'
+OBJ_NAME = '/org/openbmc/managers/Sensors/'+sys.argv[1]
+
+class SensorManager(dbus.service.Object):
+ def __init__(self,bus,name):
+ dbus.service.Object.__init__(self,bus,name)
+ bus.add_signal_receiver(self.UpdateSensor,
+ dbus_interface = 'org.openbmc.SensorInteger',
+ signal_name = 'Changed', path_keyword='path')
+ bus.add_signal_receiver(self.NormalThreshold,
+ dbus_interface = 'org.openbmc.SensorIntegerThreshold',
+ signal_name = 'Normal', path_keyword='path')
+ bus.add_signal_receiver(self.WarningThreshold,
+ dbus_interface = 'org.openbmc.SensorIntegerThreshold',
+ signal_name = 'Warning', path_keyword='path')
+ bus.add_signal_receiver(self.CriticalThreshold,
+ dbus_interface = 'org.openbmc.SensorIntegerThreshold',
+ signal_name = 'Critical', path_keyword='path')
+
+ self.sensor_cache = {}
+
+ @dbus.service.method(DBUS_NAME,
+ in_signature='s', out_signature='i')
+ def getSensor(self,path):
+ val = None
+ if (self.sensor_cache.has_key(path) == True):
+ val = self.sensor_cache[path]['value']
+ return val
+
+ def UpdateSensor(self,value, units, path = None):
+ if (self.sensor_cache.has_key(path) == False):
+ self.sensor_cache[path] = {}
+ self.sensor_cache[path]['value'] = value
+ self.sensor_cache[path]['units'] = units
+
+ @dbus.service.signal(DBUS_NAME)
+ def CriticalThreshold(self, path = None):
+ print "Critical: "+path
+ if (self.sensor_cache.has_key(path) == False):
+ self.sensor_cache[path] = {}
+ self.sensor_cache[path]['threshold'] = "CRITICAL"
+
+
+ @dbus.service.signal(DBUS_NAME)
+ def WarningThreshold(self, path = None):
+ print "Warning: "+path
+ if (self.sensor_cache.has_key(path) == False):
+ self.sensor_cache[path] = {}
+ self.sensor_cache[path]['threshold'] = "WARNING"
+
+
+ @dbus.service.signal(DBUS_NAME)
+ def NormalThreshold(self, path = None):
+ print "Normal: "+path
+ if (self.sensor_cache.has_key(path) == False):
+ self.sensor_cache[path] = {}
+ self.sensor_cache[path]['threshold'] = "NORMAL"
+
+
+
+
+if __name__ == '__main__':
+ dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
+ bus = dbus.SessionBus()
+ name = dbus.service.BusName(DBUS_NAME,bus)
+ obj = SensorManager(bus,OBJ_NAME)
+ mainloop = gobject.MainLoop()
+
+ print "Running Sensor Manager"
+ mainloop.run()
+
diff --git a/bin/system_manager.py b/bin/system_manager.py
index 7b902c2..3275dc9 100644
--- a/bin/system_manager.py
+++ b/bin/system_manager.py
@@ -6,7 +6,9 @@
import dbus
import dbus.service
import dbus.mainloop.glib
-import xml.etree.ElementTree as ET
+#import xml.etree.ElementTree as ET
+import os
+import PropertyManager
if (len(sys.argv) < 2):
print "Usage: system_manager.py [system name]"
@@ -19,50 +21,47 @@
OBJ_NAME = '/org/openbmc/managers/System'
HEARTBEAT_CHECK_INTERVAL = 20000
-def findConfigInstance(bus_name,obj_path):
- line = obj_path.split('/')
- instance_name = line[len(line)-1]
- if (System.SYSTEM_CONFIG.has_key(bus_name) == False):
- return {}
- for instance in System.SYSTEM_CONFIG[bus_name]['instances']:
- if (instance['name'] == instance_name):
- return instance
-
-def parseIntrospection(bus_name,obj_name,interfaces,init_interfaces):
- obj = bus.get_object(bus_name, obj_name)
- introspect_iface = dbus.Interface(obj,'org.freedesktop.DBus.Introspectable')
- tree = ET.ElementTree(ET.fromstring(introspect_iface.Introspect()))
- root = tree.getroot()
- interfaces[obj_name] = []
- init_interfaces[obj_name] = {}
- for intf in root.iter('interface'):
- intf_name = intf.attrib['name']
- if (intf_name == 'org.freedesktop.DBus.ObjectManager'):
- manager = dbus.Interface(obj,'org.freedesktop.DBus.ObjectManager')
- for managed_obj in manager.GetManagedObjects():
- parseIntrospection(bus_name,managed_obj,interfaces,init_interfaces)
- elif (intf_name.find(Openbmc.BUS_PREFIX) == 0):
- interfaces[obj_name].append(intf_name)
- for method in intf.iter('method'):
- if (method.attrib['name'] == 'init'):
- #print "Init: "+obj_name+" : "+intf_name
- init_interfaces[obj_name][intf_name]=1
-
-
-
class SystemManager(dbus.service.Object):
def __init__(self,bus,name):
dbus.service.Object.__init__(self,bus,name)
- bus.add_signal_receiver(self.request_name,
+ #self.sensor_manager_running = False
+ #self.fru_manager_running = False
+ #self.inited = False
+
+ ## Signal handlers
+ bus.add_signal_receiver(self.NewBusHandler,
dbus_interface = 'org.freedesktop.DBus',
signal_name = "NameOwnerChanged")
- # launch dbus object processes
- for bus_name in System.SYSTEM_CONFIG.keys():
- self.start_process(bus_name)
+ #bus.add_signal_receiver(self.FruRunningHandler,
+ # dbus_interface = 'org.openbmc.managers.Frus'
+ # signal_name = "OpenBmcRunning")
+ #bus.add_signal_receiver(self.SensorRunningHandler,
+ # dbus_interface = 'org.openbmc.managers.Sensors'
+ # signal_name = "OpenBmcRunning")
+ bus.add_signal_receiver(self.CacheMeHandler,
+ signal_name = 'CacheMe', path_keyword='path',interface_keyword='interface')
+
+ try:
+ # launch dbus object processes
+ for bus_name in System.SYSTEM_CONFIG.keys():
+ self.start_process(bus_name)
+ except Exception as e:
+ ## TODO: error handling
+ pass
+
+ bus.add_signal_receiver(self.HeartbeatHandler, signal_name = "Heartbeat")
gobject.timeout_add(HEARTBEAT_CHECK_INTERVAL, self.heartbeat_check)
+ def CacheMeHandler(self,busname,path=None,interface=None):
+ #interface_name = 'org.openbmc.Fru'
+ print "CacheME: "+busname+","+path+","+interface
+ data = {}
+ cache = System.CACHED_INTERFACES.has_key(interface)
+ PropertyManager.saveProperties(bus,busname,path,interface,cache,data)
+
+
def start_process(self,bus_name):
exe_name = System.SYSTEM_CONFIG[bus_name]['exe_name']
cmdline = [ ]
@@ -76,7 +75,6 @@
## TODO: error
print "Error starting process: "+" ".join(cmdline)
-
def heartbeat_check(self):
print "heartbeat check"
for bus_name in System.SYSTEM_CONFIG.keys():
@@ -88,10 +86,13 @@
print "Process for "+bus_name+" appears to be dead"
self.start_process(bus_name)
+ ## process is alive, now check if heartbeat received
+ ## during previous interval
elif (System.SYSTEM_CONFIG[bus_name]['heartbeat'] == 'yes'):
if (System.SYSTEM_CONFIG[bus_name]['heartbeat_count'] == 0):
print "Heartbeat error: "+bus_name
p = System.SYSTEM_CONFIG[bus_name]['popen']
+ ## TODO: error checking
p.poll()
if (p.returncode == None):
print "Process must be hung, so killing"
@@ -104,61 +105,34 @@
return True
- def heartbeat_update(self,bus_name):
+ def HeartbeatHandler(self,bus_name):
System.SYSTEM_CONFIG[bus_name]['heartbeat_count']=1
- def setup_sensor(self,intf):
- pass
-
- def request_name(self, bus_name, a, b):
+ def NewBusHandler(self, bus_name, a, b):
if (len(b) > 0 and bus_name.find(Openbmc.BUS_PREFIX) == 0):
if (System.SYSTEM_CONFIG.has_key(bus_name)):
System.SYSTEM_CONFIG[bus_name]['heartbeat_count'] = 0
- obj_name = "/"+bus_name.replace('.','/')
- interfaces = {}
- init_interfaces = {}
- # introspect object to get used interfaces
- parseIntrospection(bus_name,obj_name,interfaces,init_interfaces)
- for obj_path in interfaces.keys():
- # find instance in system config
- instance = findConfigInstance(bus_name,obj_path)
- for intf_name in interfaces[obj_path]:
- self.initObject(bus_name,obj_path,intf_name,instance)
- for init_intf in init_interfaces[obj_path].keys():
- obj = bus.get_object(bus_name,obj_path)
- intf = dbus.Interface(obj,init_intf)
- intf.init()
+ obj_root = "/"+bus_name.replace('.','/')
+ obj_paths = []
+
+ ## Loads object properties from system config file
+ ## then overlays saved properties from file
+ for instance in System.SYSTEM_CONFIG[bus_name]['instances']:
+ obj_path = obj_root+'/'+instance['name']
+ obj_paths.append(obj_path)
+ if (instance.has_key('properties')):
+ PropertyManager.loadProperties(bus,bus_name,obj_path, instance['properties'])
+
+ ## After object properties are setup, call init method if requested
+ if (System.SYSTEM_CONFIG[bus_name].has_key('init_methods')):
+ for obj_path in obj_paths:
+ for init_interface in System.SYSTEM_CONFIG[bus_name]['init_methods']:
+ obj = bus.get_object(bus_name,obj_path)
+ intf = dbus.Interface(obj,init_interface)
+ print "calling init:" +init_interface
+ intf.init()
- def initObject(self,bus_name,obj_path,intf_name,instance):
- obj = bus.get_object(bus_name,obj_path)
- intf = dbus.Interface(obj,intf_name)
- if (instance.has_key('properties')):
- properties = dbus.Interface(obj, 'org.freedesktop.DBus.Properties')
- for prop_intf in instance['properties']:
- for prop in instance['properties'][prop_intf]:
- value = instance['properties'][prop_intf][prop]
- properties.Set(prop_intf,prop,value)
-
- ## TODO: fix this explicit check
- if (intf_name == 'org.openbmc.Control' or intf_name == 'org.openbmc.SensorInteger'):
- if (System.SYSTEM_CONFIG[bus_name]['heartbeat'] == 'yes'):
- print "Add heartbeat: "+intf_name;
- bus.add_signal_receiver(self.heartbeat_update,
- dbus_interface = intf_name,
- signal_name = "Heartbeat")
-
- if (instance.has_key('parameters')):
- intf.setConfigData(instance['parameters'])
-
-
- @dbus.service.signal(DBUS_NAME)
- def CriticalThreshold(self, obj):
- print "Critical: "+obj
-
- @dbus.service.signal(DBUS_NAME)
- def WarningThreshold(self, obj):
- print "Warning: "+obj
@dbus.service.method(DBUS_NAME,
in_signature='s', out_signature='sis')