lots of changes
diff --git a/bin/system_manager.py b/bin/system_manager.py
index 7d17da6..7b902c2 100644
--- a/bin/system_manager.py
+++ b/bin/system_manager.py
@@ -1,43 +1,54 @@
 #!/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 System
+
+if (len(sys.argv) < 2):
+	print "Usage:  system_manager.py [system name]"
+	exit(1)
+
+System = __import__(sys.argv[1])
+import Openbmc
 
 DBUS_NAME = 'org.openbmc.managers.System'
 OBJ_NAME = '/org/openbmc/managers/System'
-
-gpio_dev = '/sys/class/gpio'
-process_config = System.BarreleyeProcesses()
-gpio_config = System.BarreleyeGpios()
+HEARTBEAT_CHECK_INTERVAL = 20000
 
 def findConfigInstance(bus_name,obj_path):
 	line = obj_path.split('/')
 	instance_name = line[len(line)-1]
-	if (process_config.has_key(bus_name) == False):
+	if (System.SYSTEM_CONFIG.has_key(bus_name) == False):
 		return {}
-	for instance in process_config[bus_name]['instances']:
+	for instance in System.SYSTEM_CONFIG[bus_name]['instances']:
 		if (instance['name'] == instance_name):
 			return instance
 
-def parseIntrospection(bus_name,obj_name,interfaces):
+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)
-		elif (intf_name.find('org.openbmc') == 0):
+				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):
@@ -47,71 +58,99 @@
 					dbus_interface = 'org.freedesktop.DBus', 
 					signal_name = "NameOwnerChanged")
 		# launch dbus object processes
-		for bus_name in process_config.keys():
-			exe_name = process_config[bus_name]['exe_name']
-			cmdline = [ ]
-			cmdline.append(exe_name)
-			for instance in process_config[bus_name]['instances']:
-				cmdline.append(instance['name'])
-			subprocess.Popen(cmdline);
+		for bus_name in System.SYSTEM_CONFIG.keys():
+			self.start_process(bus_name)
 
-		gobject.timeout_add(5000, self.heartbeat_check)
+    		gobject.timeout_add(HEARTBEAT_CHECK_INTERVAL, self.heartbeat_check)
+
+	def start_process(self,bus_name):
+		exe_name = System.SYSTEM_CONFIG[bus_name]['exe_name']
+		cmdline = [ ]
+		cmdline.append(exe_name)
+		for instance in System.SYSTEM_CONFIG[bus_name]['instances']:
+			cmdline.append(instance['name'])
+		try:
+			print "Starting process: "+" ".join(cmdline)
+			System.SYSTEM_CONFIG[bus_name]['popen'] = subprocess.Popen(cmdline);
+		except Exception as e:
+			## TODO: error
+			print "Error starting process: "+" ".join(cmdline)
+
 
 	def heartbeat_check(self):
 		print "heartbeat check"
-		for bus_name in process_config.keys():
-			if (process_config[bus_name]['heartbeat'] == 'yes'):
-				if (process_config[bus_name]['heartbeat_count'] == 0):
+		for bus_name in System.SYSTEM_CONFIG.keys():
+			## even if process doesn't request heartbeat check, 
+			##   make sure process is still alive
+			p = System.SYSTEM_CONFIG[bus_name]['popen']
+			p.poll()
+			if (p.returncode != None):
+				print "Process for "+bus_name+" appears to be dead"
+				self.start_process(bus_name)
+
+			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']
+					p.poll()
+					if (p.returncode == None):
+						print "Process must be hung, so killing"
+						p.kill()
+						
+					self.start_process(bus_name)			
 				else:
-					process_config[bus_name]['heartbeat_count'] == 0
-					print "Heartbeat ok"
+					System.SYSTEM_CONFIG[bus_name]['heartbeat_count'] = 0
+					print "Heartbeat ok: "+bus_name
+					
+		return True
 
 	def heartbeat_update(self,bus_name):
-		process_config[bus_name]['heartbeat_count']=1	
+		System.SYSTEM_CONFIG[bus_name]['heartbeat_count']=1	
 
 	def setup_sensor(self,intf):
 		pass 
 
 	def request_name(self, bus_name, a, b):
-		if (len(b) > 0 and bus_name.find('org.openbmc') == 0):
-			try:
-				if (process_config.has_key(bus_name)):
-					process_config[bus_name]['heartbeat_count'] = 0
-					obj_name = "/"+bus_name.replace('.','/')
-					interfaces = {}
-					parseIntrospection(bus_name,obj_name,interfaces)
-					for obj_path in interfaces.keys():
-						instance = findConfigInstance(bus_name,obj_path)
-						for intf_name in interfaces[obj_path]:
-							obj = bus.get_object(bus_name,obj_path)
-							intf = dbus.Interface(obj,intf_name)
-							if (intf_name == 'org.openbmc.SensorIntegerThreshold'):
-								intf.set(instance['lower_critical'],
-								instance['lower_warning'],
-								instance['upper_warning'],
-								instance['upper_critical'])
-									
-							if (intf_name == 'org.openbmc.SensorInteger'):
-								if (process_config[bus_name]['heartbeat'] == 'yes'):
-									bus.add_signal_receiver(self.heartbeat_update,
-										dbus_interface = intf_name, 
-										signal_name = "Heartbeat")
+		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()
 
-								if (instance.has_key('parameters')):
-									intf.setConfigData(instance['parameters'])
 
-			except Exception as e:
-				print e
+	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)
 
-		if (len(b)==0  and bus_name.find('org.openbmc.sensors') == 0):
-			exe_name = process_config[bus_name]['exe_name']
-			cmdline = [ ]
-			cmdline.append(exe_name)
-			for instance in process_config[bus_name]['instances']:
-				cmdline.append(instance['name'])
- 
-			subprocess.Popen(cmdline);
+		## 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):
@@ -126,14 +165,14 @@
 	def gpioInit(self,name):
 		gpio_path = ''
 		gpio_num = 0
-		if (gpio_config.has_key(name) == False):
+		if (System.GPIO_CONFIG.has_key(name) == False):
 			# TODO: Error handling
 			print "ERROR: "+name+" not found in GPIO config table"
 			return ['',0,'']
 		else:
-			gpio_num = gpio_config[name]['gpio_num']
+			gpio_num = System.GPIO_CONFIG[name]['gpio_num']
 
-		return [gpio_dev, gpio_num, gpio_config[name]['direction']]
+		return [Openbmc.GPIO_DEV, gpio_num, System.GPIO_CONFIG[name]['direction']]
 
 
 if __name__ == '__main__':
@@ -143,7 +182,6 @@
     obj = SystemManager(bus,OBJ_NAME)
     mainloop = gobject.MainLoop()
 
-    
     print "Running SystemManager"
     mainloop.run()