lots of changes
diff --git a/bin/Barreleye.py b/bin/Barreleye.py
index 65d8683..50a3492 100644
--- a/bin/Barreleye.py
+++ b/bin/Barreleye.py
@@ -1,4 +1,6 @@
 #! /usr/bin/python
+
+## todos: event logger, 
 import dbus
 import Openbmc
 
@@ -12,6 +14,24 @@
 
 SYSTEM_CONFIG = {}
 
+SYSTEM_CONFIG['org.openbmc.watchdog.HostWatchdog'] = {
+		'start_process' : True,
+		'process_name' : 'host_watchdog.exe',
+		'heartbeat' : 'no',
+		'rest_name' : 'watchdog',
+		'instances' : [	
+			{
+				'name' : 'Watchdog1',
+				'user_label': 'Host Watchdog',
+				'properties' : { 
+					'org.openbmc.Watchdog' : {
+						'poll_interval': 300000,
+					}
+				}
+			}
+		]
+	}
+
 SYSTEM_CONFIG['org.openbmc.managers.Sensors'] = {
 		'start_process' : True,
 		'process_name' : 'sensor_manager.py',
@@ -59,6 +79,11 @@
 			{
 				'name' : 'PowerControl1',
 				'user_label': 'Power control',
+				'properties' : { 
+					'org.openbmc.Control': {
+						'poll_interval' : 3000
+					}
+				}
 			}
 		]
 	}
@@ -68,13 +93,15 @@
 		'process_name' : 'sensor_ambient.exe',
 		'heartbeat' : 'yes',
 		'init_methods' : ['org.openbmc.SensorValue'],
-		'poll_interval': 5000,    
 		'instances' : [	
 			{
 				'name' : 'AmbientTemperature1',
 				'user_label': 'Ambient Temperature 1',
 				'sensor_id' : 41,
 				'properties' : { 
+					'org.openbmc.SensorValue': {
+						'poll_interval' : 5000
+					},
 					'org.openbmc.SensorThreshold' : {
 						'lower_critical': 5,
 						'lower_warning' : 10,
@@ -91,6 +118,9 @@
 				'name' : 'AmbientTemperature2',
 				'user_label': 'Ambient Temperature 2',
  				'properties' : { 
+					'org.openbmc.SensorValue': {
+						'poll_interval' : 5000
+					},
 					'org.openbmc.SensorThreshold' : {
 						'lower_critical': 5,
 						'lower_warning' : 10,
diff --git a/bin/Openbmc.py b/bin/Openbmc.py
index 4b10739..12f93c7 100644
--- a/bin/Openbmc.py
+++ b/bin/Openbmc.py
@@ -1,4 +1,5 @@
 import dbus
+import xml.etree.ElementTree as ET
 
 BUS_PREFIX = 'org.openbmc'
 GPIO_DEV = '/sys/class/gpio'
@@ -28,6 +29,19 @@
 def bus_to_object_name(bus_name):
 	return "/"+bus_name.replace('.','/')
 
+def get_methods(obj):
+	methods = {}
+	introspect_iface = dbus.Interface(obj,"org.freedesktop.DBus.Introspectable")
+ 	tree = ET.ElementTree(ET.fromstring(introspect_iface.Introspect()))
+ 	root = tree.getroot()
+	for intf in root.iter('interface'):
+ 		intf_name = intf.attrib['name']
+		if (intf_name.find(BUS_PREFIX)==0):
+			methods[intf_name] = {}
+			for method in intf.iter('method'):
+				methods[intf_name][method.attrib['name']] = True
+		
+	return methods
 
 class DbusProperty:
 	def __init__(self,name,value):
diff --git a/bin/PropertyManager.py b/bin/PropertyManager.py
index ff0e200..6af3af7 100644
--- a/bin/PropertyManager.py
+++ b/bin/PropertyManager.py
@@ -57,7 +57,6 @@
 		for prop in properties.keys():
 			print "Saving properties: "+prop
 			## convert property to correct dbus type
-			print type(properties[prop])
 			prop_intf.Set(interface_name,prop,properties[prop])
 
 		dbus_props = []
diff --git a/bin/chassis_control.py b/bin/chassis_control.py
index 15a8feb..4be1afc 100644
--- a/bin/chassis_control.py
+++ b/bin/chassis_control.py
@@ -12,10 +12,13 @@
 POWER_OFF = 0
 POWER_ON = 1
 
+BOOTED = 100
+
 class ChassisControlObject(dbus.service.Object):
 	def __init__(self,bus,name):
 		self.dbus_objects = { }
 
+		dbus.service.Object.__init__(self,bus,name)
 		## load utilized objects
 		self.dbus_busses = {
 			'org.openbmc.control.Power' : 
@@ -26,16 +29,10 @@
 				[ { 'name' : 'HostControl1',     'intf' : 'org.openbmc.control.Host' } ]
 		}
 		self.power_sequence = 0
-		dbus.service.Object.__init__(self,bus,name)
-		bus = dbus.SessionBus()
-		try: 
-			for bus_name in self.dbus_busses.keys():
-				self.request_name(bus_name,"",bus_name)
+		self.reboot = 0	
+		self.last_power_state = 0
 
-		except:
-			## its ok if this fails.  hotplug will detect too
-			print "Warning: One of processes not started yet."
-			pass
+		bus = dbus.SessionBus()
 
 		## add signal handler to detect when new objects show up on dbus
 		bus.add_signal_receiver(self.request_name,
@@ -46,9 +43,23 @@
 					dbus_interface = "org.openbmc.Button", signal_name = "ButtonPressed", 
 					path="/org/openbmc/buttons/ButtonPower/PowerButton1" )
     		bus.add_signal_receiver(self.power_good_signal_handler, 
-					dbus_interface = "org.openbmc.control.Power", signal_name = "PowerGood",
-					path="/org/openbmc/control/Power/PowerControl1")
+					dbus_interface = "org.openbmc.control.Power", signal_name = "PowerGood")
+   		bus.add_signal_receiver(self.power_lost_signal_handler, 
+					dbus_interface = "org.openbmc.control.Power", signal_name = "PowerLost")
+    		bus.add_signal_receiver(self.host_watchdog_signal_handler, 
+					dbus_interface = "org.openbmc.Watchdog", signal_name = "WatchdogError")
+   		bus.add_signal_receiver(self.host_status_signal_handler, 
+					dbus_interface = "org.openbmc.SensorMatch", signal_name = "SensorMatch",
+					path="/org/openbmc/sensors/HostStatus/HostStatus1")
 
+		try: 
+			for bus_name in self.dbus_busses.keys():
+				self.request_name(bus_name,"",bus_name)
+
+		except:
+			## its ok if this fails.  hotplug will detect too
+			print "Warning: One of processes not started yet."
+			pass
 
 	
 	def request_name(self, bus_name, a, b):
@@ -60,6 +71,7 @@
 				obj_path = "/"+bus_name.replace('.','/')
 				for objs in self.dbus_busses[bus_name]:
 					inst_name = objs['name']
+					print "Chassis control: "+inst_name
 					obj =  bus.get_object(bus_name,obj_path+"/"+inst_name)
 					self.dbus_objects[inst_name] = dbus.Interface(obj, objs['intf'])
 	
@@ -69,7 +81,6 @@
 	def getID(self):
 		return id
 
-
 	@dbus.service.method(DBUS_NAME,
 		in_signature='', out_signature='')
 	def setIdentify(self):
@@ -77,7 +88,6 @@
 		self.dbus_objects['ChassisIdentify1'].setOn()
 		return None
 
-
 	@dbus.service.method(DBUS_NAME,
 		in_signature='', out_signature='')
 	def clearIdentify(self):
@@ -90,6 +100,7 @@
 	def setPowerOn(self):
 		print "Turn on power and boot"
 		self.power_sequence = 0
+		self.reboot = 0
 		if (self.getPowerState()==0):
 			self.dbus_objects['PowerControl1'].setPowerState(POWER_ON)
 			self.power_sequence = 1
@@ -98,6 +109,7 @@
 	@dbus.service.method(DBUS_NAME,
 		in_signature='', out_signature='')
 	def setPowerOff(self):
+		self.power_sequence = 0
 		print "Turn off power"
 		self.dbus_objects['PowerControl1'].setPowerState(POWER_OFF);
 		return None
@@ -118,9 +130,10 @@
 	def setPowerPolicy(self,policy):
 		return None
 
+
 	## Signal handler
 	def power_button_signal_handler(self):
-		# only power on if not currently powered on
+		# toggle power
 		state = self.getPowerState()
 		if state == POWER_OFF:
 			self.setPowerOn()
@@ -129,13 +142,27 @@
 		
 		# TODO: handle long press and reset
 
-	## Signal handler
+	## Signal handlers
 	def power_good_signal_handler(self):
 		if (self.power_sequence==1):
 			self.dbus_objects['HostControl1'].boot()
 			self.power_sequence = 2
 
+	def host_status_signal_handler(self,value):
+		if (value == BOOTED and self.power_sequence==2):
+			self.power_sequence=0
+			print "Host booted"
 
+	def power_lost_signal_handler(self):
+		## Reboot if power is lost but reboot requested
+		if (self.reboot == 1):
+			self.setPowerOn()
+
+	def host_watchdog_signal_handler(self):
+		print "Watchdog Error, Rebooting"
+		self.reboot = 1
+		self.setPowerOff()
+		
 
 if __name__ == '__main__':
     dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
diff --git a/bin/ipmi_bt.py b/bin/ipmi_bt.py
index 375eb2a..d3e79cd 100644
--- a/bin/ipmi_bt.py
+++ b/bin/ipmi_bt.py
@@ -39,7 +39,7 @@
 
 	@dbus.service.method(DBUS_NAME)
 	def emitUpdateSensor(self,ipmi_id,data):
-        	self.UpdateSensor(ipmi_id,int(data))
+        	self.UpdateSensor(ipmi_id,dbus.Byte(int(data)))
 		print "update sensor emitted"
         	return 'Signal emitted'
 
@@ -49,11 +49,31 @@
 		intf = dbus.Interface(obj, 'org.openbmc.managers.IpmiTranslator' )
 		return intf.getSensor(ipmi_id)
 
+	def pokeHostWatchdog(self):
+		obj =  bus.get_object('org.openbmc.managers.IpmiTranslator',
+				'/org/openbmc/managers/IpmiTranslator/Barreleye')
+		intf = dbus.Interface(obj, 'org.openbmc.managers.IpmiTranslator' )
+		intf.pokeHostWatchdog()
+
+	def startHostWatchdog(self):
+		obj =  bus.get_object('org.openbmc.managers.IpmiTranslator',
+				'/org/openbmc/managers/IpmiTranslator/Barreleye')
+		intf = dbus.Interface(obj, 'org.openbmc.managers.IpmiTranslator' )
+		intf.startHostWatchdog()
+
+
+
+
 
 if __name__ == '__main__':
-
-	cmd = sys.argv[2]
-	ipmi_id = int(sys.argv[3])
+	
+	cmd = ""
+	data = None
+	ipmi_id = 0
+	if (len(sys.argv) > 2):
+		cmd = sys.argv[2]
+	if (len(sys.argv) > 3):
+		ipmi_id = int(sys.argv[3])
 	if (len(sys.argv)>4):
 		data = sys.argv[4]
 
@@ -69,7 +89,13 @@
 		obj.emitUpdateSensor(ipmi_id,data)
 	elif (cmd == 'getsensor'):
 		print obj.getSensor(ipmi_id)
-		
+	elif (cmd == 'pokewatchdog'):
+		print obj.pokeHostWatchdog()
+	elif (cmd == 'startwatchdog'):
+		print obj.startHostWatchdog()
+	else:
+		print "ERROR: Invalid command"
+		print "Valid commands: updatefru, setsensor, getsensor, startwatchdog, pokewatchdog"		
 
     #mainloop.run()
 
diff --git a/bin/ipmi_translator.py b/bin/ipmi_translator.py
index f7a7aab..2f3d0bb 100644
--- a/bin/ipmi_translator.py
+++ b/bin/ipmi_translator.py
@@ -73,15 +73,13 @@
 			## change to variant data type
 			## comes in off dbus from ipmi_bt as a basic data type
 			dvalue = Openbmc.DbusProperty('value',value)
-			dvalue.setVariant(2)
-			data = { 'value' : dvalue.getValue() }
+			dvalue.setVariant(1)
 			## save sensor value
-			## TODO:  need to accomodate any sensor interface
 			interface_name = 'org.openbmc.SensorValue'
 			cache = System.CACHED_INTERFACES.has_key(interface_name)
 			obj = bus.get_object(bus_name,obj_path)
 			intf = dbus.Interface(obj, interface_name)
-			self.property_manager.saveProperties(bus_name,obj_path,interface_name,cache,data)
+			intf.setValue(dvalue.getValue())
 		else:
 			## TODO: error handling
 			pass
@@ -99,10 +97,34 @@
 					'/org/openbmc/managers/Sensors/Barreleye')
 			intf = dbus.Interface(obj, 'org.openbmc.managers.Sensors' )
 			val = intf.getSensor(obj_path)
-			print "value = "+str(val)
 
 		return val
 
+	@dbus.service.method(DBUS_NAME,
+		in_signature='', out_signature='')
+	def pokeHostWatchdog(self):
+		## TODO don't do hardcoding
+		obj =  bus.get_object('org.openbmc.watchdog.HostWatchdog',
+				'/org/openbmc/watchdog/HostWatchdog/Watchdog1')
+		intf = dbus.Interface(obj, 'org.openbmc.Watchdog' )
+		intf.poke()
+
+		return None
+
+	@dbus.service.method(DBUS_NAME,
+		in_signature='', out_signature='')
+	def startHostWatchdog(self):
+		## TODO don't do hardcoding
+		obj =  bus.get_object('org.openbmc.watchdog.HostWatchdog',
+				'/org/openbmc/watchdog/HostWatchdog/Watchdog1')
+		intf = dbus.Interface(obj, 'org.openbmc.Watchdog' )
+		intf.start()
+
+		return None
+
+
+
+
 
 if __name__ == '__main__':
     dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
diff --git a/bin/sensor_manager.py b/bin/sensor_manager.py
index 2314a7f..cb0904e 100644
--- a/bin/sensor_manager.py
+++ b/bin/sensor_manager.py
@@ -19,8 +19,8 @@
 	def __init__(self,bus,name):
 		dbus.service.Object.__init__(self,bus,name)
 		bus.add_signal_receiver(self.UpdateSensor,
-					dbus_interface = 'org.freedesktop.DBus.Properties', 
-					signal_name = 'PropertiesChanged', path_keyword='path')
+					dbus_interface = 'org.openbmc.SensorValue', 
+					signal_name = 'Changed', path_keyword='path')
 		bus.add_signal_receiver(self.NormalThreshold,
 					dbus_interface = 'org.openbmc.SensorThreshold', 
 					signal_name = 'Normal', path_keyword='path')
@@ -41,11 +41,10 @@
 			val = self.sensor_cache[path]['value']
 		return val
 		
-	def UpdateSensor(self,interface,prop_dict,props, path = None):
-		if (interface == "org.openbmc.SensorValue"):
-			self.initSensorEntry(path)
-			for p in prop_dict.keys():	
-				self.sensor_cache[path][p] = prop_dict[p]
+	def UpdateSensor(self,value,units,path = None):
+		self.initSensorEntry(path)
+		self.sensor_cache[path]['value'] = value
+		self.sensor_cache[path]['units'] = units
 
 	@dbus.service.signal(DBUS_NAME)
 	def CriticalThreshold(self, path = None):
@@ -68,10 +67,6 @@
 	def initSensorEntry(self,path):
 		if (self.sensor_cache.has_key(path) == False):
 			self.sensor_cache[path] = {}
-			obj = bus.get_object(Openbmc.object_to_bus_name(path),path)
-			intf = dbus.Interface(obj,'org.freedesktop.DBus.Properties')
-			self.sensor_cache[path]['units'] = intf.Get('org.openbmc.SensorValue','units')
-			
 
 				
 if __name__ == '__main__':
diff --git a/bin/system_manager.py b/bin/system_manager.py
index e96e547..cb37c41 100644
--- a/bin/system_manager.py
+++ b/bin/system_manager.py
@@ -3,13 +3,14 @@
 import sys
 import subprocess
 from gi.repository import GObject
-
 import dbus
 import dbus.service
 import dbus.mainloop.glib
 import os
 import PropertyManager
 
+import Openbmc
+
 if (len(sys.argv) < 2):
 	print "Usage:  system_manager.py [system name]"
 	exit(1)
@@ -25,15 +26,15 @@
 class SystemManager(dbus.service.Object):
 	def __init__(self,bus,name):
 		dbus.service.Object.__init__(self,bus,name)
-		
 		self.property_manager = PropertyManager.PropertyManager(bus,System.CACHE_PATH)
+
 		## Signal handlers
 		bus.add_signal_receiver(self.NewBusHandler,
 					dbus_interface = 'org.freedesktop.DBus', 
 					signal_name = "NameOwnerChanged")
 		bus.add_signal_receiver(self.CacheMeHandler,
 					signal_name = 'CacheMe', path_keyword='path',interface_keyword='interface')
-
+		bus.add_signal_receiver(self.HeartbeatHandler, signal_name = "Heartbeat")
 
 		try:
 			# launch dbus object processes
@@ -43,8 +44,9 @@
 			## TODO: error handling
 			pass
 		
-		bus.add_signal_receiver(self.HeartbeatHandler, signal_name = "Heartbeat")
+		## Add poll for heartbeat
     		GObject.timeout_add(HEARTBEAT_CHECK_INTERVAL, self.heartbeat_check)
+		
 
 	def CacheMeHandler(self,busname,path=None,interface=None):
 		#interface_name = 'org.openbmc.Fru'
@@ -115,15 +117,21 @@
 					obj_path = obj_root+'/'+instance['name']
 					obj_paths.append(obj_path)
 					if (instance.has_key('properties')):
+						print "load props: "+obj_path
 						self.property_manager.loadProperties(bus_name,obj_path,												instance['properties'])
 
+				## scan all used interfaces and get interfaces with init method
+				
+
 				## 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
+				#if (System.SYSTEM_CONFIG[bus_name].has_key('init_methods')):
+				for obj_path in obj_paths:
+					obj = bus.get_object(bus_name,obj_path)
+					methods = Openbmc.get_methods(obj)
+					for intf_name in methods.keys():
+						if (methods[intf_name].has_key('init')):
+							intf = dbus.Interface(obj,intf_name)
+							print "Calling init: " +intf_name
 							intf.init()