lots of changes
diff --git a/bin/inventory_manager.py b/bin/inventory_manager.py
new file mode 100644
index 0000000..dcc0114
--- /dev/null
+++ b/bin/inventory_manager.py
@@ -0,0 +1,162 @@
+#!/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
+		filename = FRU_PATH+self.fru.replace('/','.')
+		return filename
+	
+	def saveToCache(self):
+		if (self.isCached() == False):
+			return
+		print "Caching: "+self.fru
+		output = open(self.getCacheFilename(), 'wb')
+		## just pickle dict not whole object
+		print FRUS[self.fru]
+		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
+			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,
+					signal_name = 'UpdateFru')
+
+		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
+
+			
+	def UpdateFruHandler(self,fru_id,data):
+		self.updateFru(fru_id,data)		
+
+	@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):
+			# TODO: event log
+			print "fru id "+str(iid)+" not found"
+		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()
+