xref: /openbmc/skeleton/pyinventorymgr/inventory_items.py (revision 4eab1dc7aa2486f251b5235a21851740eec8a733)
1#!/usr/bin/python -u
2
3import os
4import sys
5import gobject
6import dbus
7import dbus.service
8import dbus.mainloop.glib
9import cPickle
10import json
11import obmc.dbuslib.propertycacher as PropertyCacher
12from obmc.dbuslib.bindings import get_dbus, DbusProperties, DbusObjectManager
13import obmc_system_config as System
14
15INTF_NAME = 'org.openbmc.InventoryItem'
16DBUS_NAME = 'org.openbmc.Inventory'
17FRUS = System.FRU_INSTANCES
18
19class Inventory(DbusProperties,DbusObjectManager):
20	def __init__(self,bus,name):
21		DbusProperties.__init__(self)
22		DbusObjectManager.__init__(self)
23		dbus.service.Object.__init__(self,bus,name)
24
25
26class InventoryItem(DbusProperties):
27	def __init__(self,bus,name,data):
28		DbusProperties.__init__(self)
29		dbus.service.Object.__init__(self,bus,name)
30
31		self.name = name
32
33		if (data.has_key('present') == False):
34			data['present'] = 'False'
35		if (data.has_key('fault') == False):
36			data['fault'] = 'False'
37		if (data.has_key('version') == False):
38			data['version'] = ''
39
40		self.SetMultiple(INTF_NAME,data)
41
42		## this will load properties from cache
43		PropertyCacher.load(name, INTF_NAME, self.properties)
44
45
46	@dbus.service.method(INTF_NAME,
47		in_signature='a{sv}', out_signature='')
48	def update(self,data):
49		self.SetMultiple(INTF_NAME,data)
50		PropertyCacher.save(self.name,INTF_NAME,self.properties)
51
52	@dbus.service.method(INTF_NAME,
53		in_signature='s', out_signature='')
54	def setPresent(self,present):
55		self.Set(INTF_NAME,'present',present)
56
57	@dbus.service.method(INTF_NAME,
58		in_signature='s', out_signature='')
59	def setFault(self,fault):
60		self.Set(INTF_NAME,'fault',fault)
61
62
63def getVersion():
64	version = "Error"
65	with open('/etc/os-release', 'r') as f:
66		for line in f:
67			p = line.rstrip('\n')
68			parts = line.rstrip('\n').split('=')
69			if (parts[0] == "VERSION_ID"):
70				version = parts[1]
71	return version
72
73
74if __name__ == '__main__':
75    dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
76    bus = get_dbus()
77    mainloop = gobject.MainLoop()
78    obj_parent = Inventory(bus, '/org/openbmc/inventory')
79
80    for f in FRUS.keys():
81	obj_path=f.replace("<inventory_root>",System.INVENTORY_ROOT)
82    	obj = InventoryItem(bus,obj_path,FRUS[f])
83	obj_parent.add(obj_path,obj)
84
85    	## TODO:  this is a hack to update bmc inventory item with version
86    	## should be done by flash object
87	if (FRUS[f]['fru_type'] == "BMC"):
88		version = getVersion()
89		obj.update({'version': version})
90
91    obj_parent.unmask_signals()
92    name = dbus.service.BusName(DBUS_NAME,bus)
93    print "Running Inventory Manager"
94    mainloop.run()
95
96