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')