lots of changes
diff --git a/bin/Barreleye.py b/bin/Barreleye.py
index ae48df0..6fb8fb3 100644
--- a/bin/Barreleye.py
+++ b/bin/Barreleye.py
@@ -43,10 +43,18 @@
 		'system_state' : 'STANDBY',
 		'start_process' : True,
 		'monitor_process' : True,
-		'process_name' : 'inventory_manager.py',
+		'process_name' : 'inventory_items.py',
 		'heartbeat' : 'no',
 		'instances' : [	{ 'name' : 'Barreleye' } ]
 	}
+SYSTEM_CONFIG['org.openbmc.control.PciePresent'] = {
+		'system_state' : 'POWERING_ON',
+		'start_process' : True,
+		'monitor_process' : False,
+		'process_name' : 'pcie_slot_present.exe',
+		'heartbeat' : 'no',
+		'instances' : [	{ 'name' : 'Slots_0' } ]
+	}
 
 
 SYSTEM_CONFIG['org.openbmc.managers.Sensors'] = {
@@ -140,15 +148,7 @@
 		'monitor_process' : True,
 		'process_name' : 'sensor_host_status.exe',
 		'heartbeat' : "no",
-		'instances' : [ { 'name' : 'HostStatus_0',
-				'properties' : { 
-					'org.openbmc.SensorIpmi': {
-						'sensor_id' : 43,
-					},
-				}
-
-			}
-		]
+		'instances' : [ { 'name' : 'HostStatus_0' } ]
 	}
 SYSTEM_CONFIG['org.openbmc.leds.ChassisIdentify'] = {
 		'system_state' : 'STANDBY',
@@ -224,80 +224,149 @@
 	'name'       : True,
 	'user_label' : True,
 	'location'   : True,
-	'state'   : True,
+	'state'      : True,
 	'cache'      : True
 }
+INVENTORY_ROOT = '/org/openbmc/inventory/items'
 
 FRU_INSTANCES = {
-	'/system' :
+	'<inventory_root>/system' :
 	{
-		'ftype'        : Openbmc.FRU_TYPES['SYSTEM'],
-		'fru'	       : True,
+		'fru_type'        : Openbmc.FRU_TYPES['SYSTEM'],
+		'is_fru'       : True,
 	},
-	'/system/motherboard' :
+	'<inventory_root>/system/io_board' :
 	{
-		'ftype'        : Openbmc.FRU_TYPES['MAIN_PLANAR'],
+		'fru_type'        : Openbmc.FRU_TYPES['MAIN_PLANAR'],
 		'manufacturer' : 'FOXCONN',
-		'fru'	       : True,
-		'fru_id'       : 31,
-		'location' : 'C0',
+		'is_fru'       : True,
+		'location'     : 'C1',
 	},
-	'/system/fan0' :
+
+	'<inventory_root>/system/motherboard' :
 	{
-		'ftype'        : Openbmc.FRU_TYPES['FAN'],
+		'fru_type'        : Openbmc.FRU_TYPES['MAIN_PLANAR'],
+		'manufacturer' : 'FOXCONN',
+		'is_fru'       : True,
+		'location'     : 'C0',
+	},
+	'<inventory_root>/system/fan0' :
+	{
+		'fru_type'        : Openbmc.FRU_TYPES['FAN'],
 		'manufacturer' : 'DELTA',
-		'fru'	       : True,
-		'location' : 'F0',
+		'is_fru'       : True,
+		'location'     : 'F0',
 	},
-	'/system/fan1' :
+	'<inventory_root>/system/fan1' :
 	{
-		'ftype'        : Openbmc.FRU_TYPES['FAN'],
+		'fru_type'        : Openbmc.FRU_TYPES['FAN'],
 		'manufacturer' : 'DELTA',
-		'fru'	       : True,
-		'location' : 'F1',
+		'is_fru'       : True,
+		'location'     : 'F1',
 	},
-	'/system/motherboard/bmc' :
+	'<inventory_root>/system/io_board/bmc' :
 	{
-		'ftype'        : Openbmc.FRU_TYPES['BMC'],
+		'fru_type'        : Openbmc.FRU_TYPES['BMC'],
 		'manufacturer' : 'ASPEED',
-		'fru'	       : True,
+		'is_fru'       : False,
 	},
-	'/system/motherboard/cpu0' :
+	'<inventory_root>/system/motherboard/cpu0' :
 	{
-		'ftype'        : Openbmc.FRU_TYPES['CPU'],
+		'fru_type'        : Openbmc.FRU_TYPES['CPU'],
 		'manufacturer' : 'IBM',
-		'fru'	       : True,
-		'location' : 'P0',
-		'fru_id'   : 10,
+		'is_fru'       : True,
+		'location'     : 'P0',
 	},
-	'/system/motherboard/cpu0/core0' :
+	'<inventory_root>/system/motherboard/cpu0/core0' :
 	{
-		'ftype'        : Openbmc.FRU_TYPES['CORE'],
-		'fru'	       : False,
-		'sensor_id'    : 1,	
+		'fru_type'        : Openbmc.FRU_TYPES['CORE'],
+		'is_fru'       : False,
 	},
-	'/system/motherboard/cpu0/core1' :
+	'<inventory_root>/system/motherboard/cpu0/core1' :
 	{
-		'ftype'        : Openbmc.FRU_TYPES['CORE'],
-		'fru'	       : False,
-		'sensor_id'    : 2,	
+		'fru_type'        : Openbmc.FRU_TYPES['CORE'],
+		'is_fru'       : False,
 	},
-	'/system/motherboard/dimm0' :
+	'<inventory_root>/system/motherboard/dimm0' :
 	{
-		'ftype'        : Openbmc.FRU_TYPES['DIMM'],
-		'fru'	       : True,
-		'fru_id'       : 12,
-		'sensor_id'    : 20,	
+		'fru_type'        : Openbmc.FRU_TYPES['DIMM'],
+		'is_fru'       : True,
 	},
-	'/system/motherboard/dimm1' :
+	'<inventory_root>/system/motherboard/dimm1' :
 	{
-		'ftype'        : Openbmc.FRU_TYPES['DIMM'],
-		'fru'	       : True,
-		'fru_id'       : 13,
-		'sensor_id'    : 21,	
+		'fru_type'        : Openbmc.FRU_TYPES['DIMM'],
+		'is_fru'       : True,
 	},
+	'<inventory_root>/system/io_board/pcie_left_slot_riser' :
+	{
+		'fru_type'        : Openbmc.FRU_TYPES['RISER_CARD'],
+		'user_label'      : 'Left Slot Riser',
+		'is_fru'       : True,
+	},
+	'<inventory_root>/system/io_board/pcie_right_slot_riser' :
+	{
+		'fru_type'        : Openbmc.FRU_TYPES['RISER_CARD'],
+		'user_label'      : 'Right Slot Riser',
+		'is_fru'       : True,
+	},
+	'<inventory_root>/system/io_board/pcie_x16_slot_riser' :
+	{
+		'fru_type'        : Openbmc.FRU_TYPES['RISER_CARD'],
+		'user_label'      : 'PCIE x16 Slot Riser',
+		'is_fru'       : True,
+	},
+	'<inventory_root>/system/io_board/pcie_slot0' :
+	{
+		'fru_type'        : Openbmc.FRU_TYPES['PCIE_CARD'],
+		'user_label'      : 'OCP Mezz card 0',
+		'is_fru'       : True,
+	},
+	'<inventory_root>/system/io_board/pcie_slot1' :
+	{
+		'fru_type'        : Openbmc.FRU_TYPES['PCIE_CARD'],
+		'user_label'      : 'OCP Mezz card 1',
+		'is_fru'       : True,
+	},
+	'<inventory_root>/system/io_board/pcie_slot2' :
+	{
+		'fru_type'        : Openbmc.FRU_TYPES['PCIE_CARD'],
+		'user_label'      : 'OCP Mezz card 2',
+		'is_fru'       : True,
+	},
+	'<inventory_root>/system/io_board/pcie_mezz0' :
+	{
+		'fru_type'        : Openbmc.FRU_TYPES['PCIE_CARD'],
+		'user_label'      : 'OCP Mezz card 0',
+		'is_fru'       : True,
+	},
+	'<inventory_root>/system/io_board/pcie_mezz1' :
+	{
+		'fru_type'        : Openbmc.FRU_TYPES['PCIE_CARD'],
+		'user_label'      : 'OCP Mezz card 1',
+		'is_fru'       : True,
+	},
+
 }
 
+ID_LOOKUP = {
+	'FRU' : {
+		'14' : '<inventory_root>/system/motherboard/dimm0',
+	},
+	'SENSOR' : {
+		'21' : '<inventory_root>/system/motherboard/dimm0',
+		'14' : '/org/openbmc/sensors/HostStatus_0',
+	},
+	'GPIO_PRESENT' : {
+		'SLOT0_RISER_PRESENT' : '<inventory_root>/system/io_board/pcie_left_slot_riser', 
+		'SLOT1_RISER_PRESENT' : '<inventory_root>/system/io_board/pcie_right_slot_riser', 
+		'SLOT2_RISER_PRESENT' : '<inventory_root>/system/io_board/pcie_x16_slot_riser',
+		'SLOT0_PRESENT' : '<inventory_root>/system/io_board/pcie_slot0', 
+		'SLOT1_PRESENT' : '<inventory_root>/system/io_board/pcie_slot1', 
+		'SLOT2_PRESENT' : '<inventory_root>/system/io_board/pcie_slot2',
+		'MEZZ0_PRESENT' : '<inventory_root>/system/io_board/pcie_mezz0', 
+		'MEZZ1_PRESENT' : '<inventory_root>/system/io_board/pcie_mezz1',
+	}
+}
 
 GPIO_CONFIG = {}
 GPIO_CONFIG['FSI_CLK']    = { 'gpio_num': 4, 'direction': 'out' }
@@ -307,5 +376,14 @@
 GPIO_CONFIG['CRONUS_SEL'] = { 'gpio_num': 6, 'direction': 'out'  }
 GPIO_CONFIG['PGOOD']      = { 'gpio_num': 23, 'direction': 'in'  }
 GPIO_CONFIG['IDENTIFY']   = { 'gpio_num': 34, 'direction': 'out' }
-GPIO_CONFIG['POWER_BUTTON'] = { 'gpio_num': 32, 'direction': 'in' }
+GPIO_CONFIG['POWER_BUTTON'] =  { 'gpio_num': 32, 'direction': 'in' }
+GPIO_CONFIG['SLOT0_RISER_PRESENT'] =   { 'gpio_num': 104, 'direction': 'in' }
+GPIO_CONFIG['SLOT1_RISER_PRESENT'] =   { 'gpio_num': 105, 'direction': 'in' }
+GPIO_CONFIG['SLOT2_RISER_PRESENT'] =   { 'gpio_num': 106, 'direction': 'in' }
+GPIO_CONFIG['SLOT0_PRESENT'] =  { 'gpio_num': 107, 'direction': 'in' }
+GPIO_CONFIG['SLOT1_PRESENT'] =  { 'gpio_num': 108, 'direction': 'in' }
+GPIO_CONFIG['SLOT2_PRESENT'] =  { 'gpio_num': 109, 'direction': 'in' }
+GPIO_CONFIG['MEZZ0_PRESENT'] =  { 'gpio_num': 112, 'direction': 'in' }
+GPIO_CONFIG['MEZZ1_PRESENT'] =  { 'gpio_num': 113, 'direction': 'in' }
+
 
diff --git a/bin/Openbmc.py b/bin/Openbmc.py
index 625f36c..af7e79b 100644
--- a/bin/Openbmc.py
+++ b/bin/Openbmc.py
@@ -15,6 +15,7 @@
 	'FAN' : 5,
 	'BMC' : 6,
 	'CORE' : 7,
+	'PCIE_CARD' : 8,
 }
 FRU_STATES = {
 	'NORMAL'            : 0,
@@ -56,30 +57,39 @@
 
 
 def get_objs(bus,bus_name,path,objects):
-	obj = bus.get_object(bus_name,path)
+	#print ">>>>>>>>>>>>>>>>>>>>>>>>>>>> "+bus_name+"; "+path
+	tmp_path = path
+	if (path == ""):
+		tmp_path="/"
+	obj = bus.get_object(bus_name,tmp_path)
 	introspect_iface = dbus.Interface(obj,"org.freedesktop.DBus.Introspectable")
 	#print introspect_iface.Introspect()
  	tree = ET.ElementTree(ET.fromstring(introspect_iface.Introspect()))
  	root = tree.getroot()
+	parent = True
 	for node in root.iter('node'):
-		if (node.attrib.has_key('name') == False):
-			for intf in node.iter('interface'):
-				intf_name = intf.attrib['name']
-				if (intf_name.find(BUS_PREFIX)==0):
-					parts=path.split('/')
-					instance = parts[len(parts)-1]
-					if (objects.has_key(instance) == False):
-						objects[instance] = {}
-						objects[instance]['PATH'] = path
-						objects[instance]['INIT'] = []
-					for method in intf.iter('method'):
-						if (method.attrib['name'] == "init"):
-							objects[instance]['INIT'].append(intf_name)
+		for intf in node.iter('interface'):
+			intf_name = intf.attrib['name']
+			#if (intf_name.find(BUS_PREFIX)==0):
+			parts=path.split('/')
+			instance = parts[len(parts)-1]
+			if (objects.has_key(instance) == False):
+				objects[instance] = {}
+				objects[instance]['PATH'] = path
+				objects[instance]['INIT'] = []
+			for method in intf.iter('method'):
+				if (method.attrib['name'] == "init"):
+					objects[instance]['INIT'].append(intf_name)
 
-		else:
+		if (node.attrib.has_key('name') == True):
 			node_name = node.attrib['name']
-			if (node_name != path):
-				get_objs(bus,bus_name,path+"/"+node.attrib['name'],objects)
+			if (parent == False):
+				get_objs(bus,bus_name,path+"/"+node_name,objects)
+			else:
+				if (node_name != "" and node_name != path):
+					get_objs(bus,bus_name,node_name,objects)
+			
+		parent = False
 
 
 class DbusProperty:
diff --git a/bin/inventory_items.py b/bin/inventory_items.py
new file mode 100644
index 0000000..f679fee
--- /dev/null
+++ b/bin/inventory_items.py
@@ -0,0 +1,135 @@
+#!/usr/bin/env python
+
+import os
+import sys
+import gobject
+import dbus
+import dbus.service
+import dbus.mainloop.glib
+import cPickle
+import json
+
+if (len(sys.argv) < 2):
+	print "Usage:  inventory_items.py [system name]"
+	exit(1)
+System = __import__(sys.argv[1])
+import Openbmc
+
+
+INTF_NAME = 'org.openbmc.InventoryItem'
+DBUS_NAME = 'org.openbmc.managers.Inventory'
+
+FRUS = System.FRU_INSTANCES
+FRU_PATH = System.FRU_PATH
+
+class Inventory(dbus.service.Object):
+	def __init__(self,bus,name):
+		dbus.service.Object.__init__(self,bus,name)
+		self.objects = [ ]
+
+	def addItem(self,item):
+		self.objects.append(item)
+
+	@dbus.service.method("org.openbmc.managers.Inventory",
+		in_signature='', out_signature='a{sa{sv}}')
+	def getItems(self):
+		tmp_obj = {}
+		for item in self.objects:
+			tmp_obj[str(item.item['name'])]=item.getItemDict()
+		return tmp_obj
+			
+
+
+class InventoryItem(dbus.service.Object):
+	def __init__(self,bus,name):
+		dbus.service.Object.__init__(self,bus,name)
+		## store all properties in a dict so can easily
+		## send on dbus
+		self.item = {
+			'name' : name,
+			'is_fru' : False,
+			'fru_type' : 0,
+			'state'  : 0,
+			'data' : { 'manufacturer' : "" }
+		}
+		#self.name = name
+		#self.is_fru = False
+		#self.fru_type = 0
+		self.cache = True
+		#self.state = 0
+
+	def getItemDict(self):
+		return self.item
+
+	@dbus.service.signal('org.openbmc.EventLog')
+	def EventLog(self, priority, message, rc):
+        	pass
+		
+	@dbus.service.method('org.openbmc.InventoryItem',
+		in_signature='a{sv}', out_signature='')
+	def update(self,data):
+		## translate dbus data into basic data types
+		for k in data.keys():
+			d = Openbmc.DbusProperty(k,data[k])
+			self.item['data'][str(k)] = d.getBaseValue()
+		self.saveToCache()
+
+	@dbus.service.method("org.openbmc.SensorValue",
+		in_signature='y', out_signature='')
+	def setValue(self,data):
+		self.item['state'] = data
+		#self.saveToCache()
+		print "Update Fru State: "+str(self.item['state'])
+
+	def isCached(self):
+		return self.cache
+
+	def getCacheFilename(self):
+		global FRU_PATH
+		name = self.item['name'].replace('/','.')
+		filename = FRU_PATH+name[1:]+".fru"
+		return filename
+	
+	def saveToCache(self):
+		if (self.isCached() == False):
+			return
+		print "Caching: "+self.item['name']
+		# TODO: error handling
+		output = open(self.getCacheFilename(), 'wb')
+		## just pickle dict not whole object
+		cPickle.dump(self.item['data'],output)
+		output.close()
+
+	def loadFromCache(self):
+		if (self.isCached() == False):
+			return;
+		## overlay with pickled data
+		filename=self.getCacheFilename()
+		if (os.path.isfile(filename)):
+			print "Loading from cache: "+filename
+			# TODO: error handling
+			p = open(filename, 'rb')
+			data2 = cPickle.load(p)
+			for k in data2.keys():
+				self.item['data'][k] = data2[k]
+
+
+
+if __name__ == '__main__':
+    dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
+    bus = dbus.SessionBus()
+    name = dbus.service.BusName(DBUS_NAME,bus)
+    mainloop = gobject.MainLoop()
+    obj_parent = Inventory(bus, '/org/openbmc/managers/Inventory')
+
+    for f in FRUS.keys():
+	obj_path=f.replace("<inventory_root>",System.INVENTORY_ROOT)
+    	obj = InventoryItem(bus,obj_path)
+	obj.is_fru = FRUS[f]['is_fru']
+	obj.fru_type = FRUS[f]['fru_type']
+	obj.loadFromCache();
+	obj_parent.addItem(obj)
+	
+    print "Running Inventory Manager"
+    mainloop.run()
+
diff --git a/bin/inventory_manager.py b/bin/inventory_manager.py
deleted file mode 100644
index 75cc390..0000000
--- a/bin/inventory_manager.py
+++ /dev/null
@@ -1,177 +0,0 @@
-#!/usr/bin/env python
-
-import os
-import sys
-import gobject
-import dbus
-import dbus.service
-import dbus.mainloop.glib
-import cPickle
-import json
-
-if (len(sys.argv) < 2):
-	print "Usage:  inventory_manager.py [system name]"
-	exit(1)
-System = __import__(sys.argv[1])
-import Openbmc
-
-DBUS_NAME = 'org.openbmc.managers.Inventory'
-OBJ_NAME = '/org/openbmc/managers/Inventory'
-FRUS = System.FRU_INSTANCES
-FRU_PATH = System.FRU_PATH
-
-## accessor class to FRU data structure
-class Fru:
-	def __init__(self,fru):
-		## validation
-		if (FRUS.has_key(fru) == False):
-			# TODO: event log
-			raise Exception("Invalid FRU path: "+fru)
-		
-		self.fru = fru
-	
-	def getField(self,field):
-		if (FRUS[self.fru].has_key(field) == False):
-			# TODO: event log
-			raise Exception("Invalid field: "+field)
-			
-		return FRUS[self.fru][field]
-
-	def isFru(self):
-		return FRUS[self.fru]['fru']
-
-	def update(self,data):
-		for k in data.keys():
-			FRUS[self.fru][k] = data[k]
-
-	def isCached(self):
-		return True
-
-	def getCacheFilename(self):
-		global FRU_PATH
-		name = self.fru.replace('/','.')
-		filename = FRU_PATH+name[1:]+".fru"
-		return filename
-	
-	def saveToCache(self):
-		if (self.isCached() == False):
-			return
-		print "Caching: "+self.fru
-		# TODO: error handling
-		output = open(self.getCacheFilename(), 'wb')
-		## just pickle dict not whole object
-		cPickle.dump(FRUS[self.fru],output)
-		output.close()
-
-	def loadFromCache(self):
-		if (self.isCached() == False):
-			return;
-		## overlay with pickled data
-		filename=self.getCacheFilename()
-		if (os.path.isfile(filename)):
-			print "Loading from cache: "+filename
-			# TODO: error handling
-			p = open(filename, 'rb')
-			data2 = cPickle.load(p)
-			for k in data2.keys():
-				FRUS[self.fru][k] = data2[k]
-
-	def __str__(self):	
-		r = "Fru: "+str(self.fru_id)+"\n"
-		for f in self.data.keys():
-			r = r+f+" = "+str(self.data[f])+"\n"
-		return r
-
-		
-
-class InventoryManager(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.sensors.IpmiBt", 
-					signal_name = 'UpdateFru')
-
-		bus.add_signal_receiver(self.SetSensorHandler, 
-					dbus_interface = "org.openbmc.sensors.IpmiBt", 
-					signal_name = "SetSensor")
-
-		self.fru_db = {}
-		self.fru_id_lookup = {}
-		self.sensor_id_lookup = {}
-
-		for fru_path in FRUS.keys():
-			self.addFru(fru_path)
-			f = FRUS[fru_path]
-			if (f.has_key('fru_id')):
-				self.fru_id_lookup[f['fru_id']] = fru_path
-			if (f.has_key('sensor_id')):
-				self.sensor_id_lookup[f['sensor_id']] = fru_path
-
-	@dbus.service.signal('org.openbmc.EventLog')
-	def EventLog(self, priority, message, rc):
-        	pass
-		
-	def UpdateFruHandler(self,fru_id,data):
-		self.updateFruFromId(fru_id,data)		
-
-	def SetSensorHandler(self,sensor_id,data):
-		fru_path = self.getFruSensor(sensor_id)
-		if (fru_path != ""):
-			state = { 'state' : data }
-			self.updateFru(fru_path,state)
-			
-	@dbus.service.method(DBUS_NAME,
-		in_signature='y', out_signature='s')	
-	def getFruSensor(self,sensor_id):
-		if (self.sensor_id_lookup.has_key(sensor_id) == False):
-			return ""
-		return self.sensor_id_lookup[sensor_id]
-		
-	def addFru(self,fru_path):
-		new_fru = Fru(fru_path)
-		new_fru.loadFromCache()
-		self.fru_db[fru_path] = new_fru
-				
-	@dbus.service.method(DBUS_NAME,
-		in_signature='ia{sv}', out_signature='')
-	def updateFruFromId(self,fru_id,data):
-		iid = int(fru_id)
-		if (self.fru_id_lookup.has_key(iid) == False):
-			self.EventLog(1,"FRU ID not found: "+str(iid),1)
-		else:
-			self.updateFru(self.fru_id_lookup[iid],data)
-		
-
-	@dbus.service.method(DBUS_NAME,
-		in_signature='sa{sv}', out_signature='')
-	def updateFru(self,fru_path,data):
-		## translate dbus data into basic data types
-		clean_data = {}
-		for k in data.keys():
-			d = Openbmc.DbusProperty(k,data[k])
-			clean_data[str(k)] = d.getBaseValue()
-
-		if (self.fru_db.has_key(fru_path)):
-			## update properties then save to cache
-			print "Updating FRU: "+fru_path
-			self.fru_db[fru_path].update(clean_data)
-			self.fru_db[fru_path].saveToCache()
-
-
-	@dbus.service.method(DBUS_NAME,
-		in_signature='', out_signature='a{sa{sv}}')
-	def getFrus(self):
-		return FRUS
-
-
-if __name__ == '__main__':
-    dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
-    bus = dbus.SessionBus()
-    name = dbus.service.BusName(DBUS_NAME,bus)
-    obj = InventoryManager(bus,OBJ_NAME)
-    mainloop = gobject.MainLoop()
-
-    print "Running Inventory Manager"
-    mainloop.run()
-
diff --git a/bin/ipmi_example.py b/bin/ipmi_example.py
index 1d0061d..290fc33 100644
--- a/bin/ipmi_example.py
+++ b/bin/ipmi_example.py
@@ -10,21 +10,12 @@
 
 import Openbmc
 
-DBUS_NAME = 'org.openbmc.sensors.IpmiBt'
-OBJ_NAME = '/org/openbmc/sensors/IpmiBt'
+SENSOR_INTERFACE = "org.openbmc.SensorValue"
 
 class IpmiBt(dbus.service.Object):
 	def __init__(self,bus,name):
 		dbus.service.Object.__init__(self,bus,name)
 
-	@dbus.service.signal('org.openbmc.sensors.IpmiBt')
-	def SetSensor(self, ipmi_id, value):
-        	pass
-
-	@dbus.service.signal('org.openbmc.sensors.IpmiBt')
-	def UpdateFru(self, ipmi_id, data):
-        	pass
-
 
 def getWatchdog():
 	obj =  bus.get_object('org.openbmc.watchdog.Host',
@@ -47,17 +38,16 @@
 
 
 if __name__ == '__main__':
-	dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
+	#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()
+	#name = dbus.service.BusName(DBUS_NAME,bus)
+	#mainloop = gobject.MainLoop()
 
 	cmd = sys.argv[1]
 	data = None
 	ipmi_id = dbus.Byte(0)
 	if (len(sys.argv) > 2):
-		ipmi_id = dbus.Byte(int(sys.argv[2]))
+		ipmi_id = sys.argv[2]
 	if (len(sys.argv)>3):
 		data = sys.argv[3]
 
@@ -68,18 +58,36 @@
 		intf = getChassisControl()
 		intf.powerOff()
 	elif (cmd == "setsensor"):
-		obj.SetSensor(ipmi_id,dbus.Byte(int(data)))
+		intf_sys = Openbmc.getManagerInterface(bus,"System")
+		obj_info = intf_sys.getObjectFromId("SENSOR",ipmi_id)
+		obj_path = obj_info['obj_path']
+		bus_name = obj_info['bus_name']
+		if (obj_path != "" and bus_name != ""):
+			obj = bus.get_object(bus_name,obj_path)
+			intf = dbus.Interface(obj,SENSOR_INTERFACE)
+			intf.setValue(dbus.Byte(int(data)))	
+			
 	elif (cmd == "getsensors"):
 		intf_sens = Openbmc.getManagerInterface(bus,"Sensors")
 		data = intf_sens.getSensors()
 		prettyPrint(data)
 	elif (cmd == "updatefru"):
 		d = { 'manufacturer' : data }	
-		obj.UpdateFru(ipmi_id,d)
+		intf_sys = Openbmc.getManagerInterface(bus,"System")
+		obj_info = intf_sys.getObjectFromId("FRU",ipmi_id)
+		obj_path = obj_info['obj_path']
+		bus_name = obj_info['bus_name']
+		if (obj_path != "" and bus_name != ""):
+			obj = bus.get_object(bus_name,obj_path)
+			intf = dbus.Interface(obj,"org.openbmc.InventoryItem")
+			intf.update(d)	
+
 	elif (cmd == "getfrus"):
 		intf_fru = Openbmc.getManagerInterface(bus,"Inventory")
-		data = intf_fru.getFrus()
-		prettyPrint(data)
+		data = intf_fru.getItems()
+		for i in data:
+			for k in data[i].keys():
+				print k+" = "+str(data[i][k]) 
 	elif (cmd == "pokewatchdog"):
 		intf = self.getWatchdog()
 		intf.poke()
diff --git a/bin/system_manager.py b/bin/system_manager.py
index 1bc90a3..a5b8023 100644
--- a/bin/system_manager.py
+++ b/bin/system_manager.py
@@ -2,7 +2,6 @@
 
 import sys
 import subprocess
-#from gi.repository import GObject
 import gobject
 import dbus
 import dbus.service
@@ -41,15 +40,23 @@
 					signal_name = "EventLog",
 					path_keyword='path')
 
-
-
 		self.current_state = ""
 		self.system_states = {}
+		self.bus_name_lookup = {}
+
 		for bus_name in System.SYSTEM_CONFIG.keys():
 			sys_state = System.SYSTEM_CONFIG[bus_name]['system_state']
 			if (self.system_states.has_key(sys_state) == False):
 				self.system_states[sys_state] = []
 			self.system_states[sys_state].append(bus_name)
+	
+		## replace symbolic path in ID_LOOKUP
+		for category in System.ID_LOOKUP:
+			for key in System.ID_LOOKUP[category]:
+				val = System.ID_LOOKUP[category][key]
+				new_val = val.replace("<inventory_root>",System.INVENTORY_ROOT)
+				System.ID_LOOKUP[category][key] = new_val
+	
 		self.SystemStateHandler("INIT")
 		print "SystemManager Init Done"
 
@@ -86,7 +93,27 @@
 			method()
 
 		self.current_state = state_name
-			
+		
+	@dbus.service.method(DBUS_NAME,
+		in_signature='ss', out_signature='a{ss}')
+	def getObjectFromId(self,category,key):
+		bus_name = ""
+		obj_path = ""
+
+		if (System.ID_LOOKUP.has_key(category)):
+			if (System.ID_LOOKUP[category].has_key(key)):
+				obj_path = System.ID_LOOKUP[category][key]
+		else:
+			print "ERROR: key not found: "+category+","+key
+
+		if (self.bus_name_lookup.has_key(obj_path)):
+			bus_name = self.bus_name_lookup[obj_path]
+		else:
+			print "ERROR: bus name not found for: "+obj_path
+		r = { 'bus_name' : bus_name, 'obj_path' : obj_path }
+		return r
+	
+	
 	def start_process(self,bus_name):
 		if (System.SYSTEM_CONFIG[bus_name]['start_process'] == True):
 			process_name = System.BIN_PATH+System.SYSTEM_CONFIG[bus_name]['process_name']
@@ -154,11 +181,13 @@
 
 	def NewBusHandler(self, bus_name, a, b):
 		if (len(b) > 0 and bus_name.find(Openbmc.BUS_PREFIX) == 0):
+			objects = {}
+			Openbmc.get_objs(bus,bus_name,"",objects)
+			for instance_name in objects.keys():
+				self.bus_name_lookup[objects[instance_name]['PATH']] = bus_name
+			
 			if (System.SYSTEM_CONFIG.has_key(bus_name)):
 				System.SYSTEM_CONFIG[bus_name]['heartbeat_count'] = 0
-				objects = {}
-				Openbmc.get_objs(bus,bus_name,Openbmc.OBJ_PREFIX,objects)				
-	
 				for instance_name in objects.keys(): 
 					obj_path = objects[instance_name]['PATH']
 					for instance in System.SYSTEM_CONFIG[bus_name]['instances']: