lots of changes
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')