blob: d337d954ff5562e505fd72f1a5627b8bc0a9cc70 [file] [log] [blame]
Norman James19e45912015-10-04 20:19:41 -05001#!/usr/bin/env python
2
3import os
4import sys
5import gobject
6import dbus
7import dbus.service
8import dbus.mainloop.glib
9import cPickle
10import json
11
12if (len(sys.argv) < 2):
13 print "Usage: inventory_items.py [system name]"
14 exit(1)
15System = __import__(sys.argv[1])
16import Openbmc
17
18
19INTF_NAME = 'org.openbmc.InventoryItem'
20DBUS_NAME = 'org.openbmc.managers.Inventory'
21
22FRUS = System.FRU_INSTANCES
23FRU_PATH = System.FRU_PATH
24
25class Inventory(dbus.service.Object):
26 def __init__(self,bus,name):
Norman James5e792e32015-10-07 17:36:17 -050027 global FRU_PATH
Norman James19e45912015-10-04 20:19:41 -050028 dbus.service.Object.__init__(self,bus,name)
Norman James5e792e32015-10-07 17:36:17 -050029 if not os.path.exists(FRU_PATH):
30 os.makedirs(FRU_PATH)
31
32
Norman James19e45912015-10-04 20:19:41 -050033 self.objects = [ ]
34
35 def addItem(self,item):
36 self.objects.append(item)
37
38 @dbus.service.method("org.openbmc.managers.Inventory",
39 in_signature='', out_signature='a{sa{sv}}')
40 def getItems(self):
41 tmp_obj = {}
42 for item in self.objects:
43 tmp_obj[str(item.item['name'])]=item.getItemDict()
44 return tmp_obj
45
46
47
48class InventoryItem(dbus.service.Object):
49 def __init__(self,bus,name):
50 dbus.service.Object.__init__(self,bus,name)
51 ## store all properties in a dict so can easily
52 ## send on dbus
53 self.item = {
54 'name' : name,
55 'is_fru' : False,
56 'fru_type' : 0,
57 'state' : 0,
Norman James2891c532015-10-06 08:01:56 -050058 'manufacturer' : "",
Norman James19e45912015-10-04 20:19:41 -050059 }
Norman James19e45912015-10-04 20:19:41 -050060 self.cache = True
Norman James19e45912015-10-04 20:19:41 -050061
62 def getItemDict(self):
63 return self.item
64
Norman James19e45912015-10-04 20:19:41 -050065 @dbus.service.method('org.openbmc.InventoryItem',
66 in_signature='a{sv}', out_signature='')
67 def update(self,data):
68 ## translate dbus data into basic data types
69 for k in data.keys():
70 d = Openbmc.DbusProperty(k,data[k])
Norman James2891c532015-10-06 08:01:56 -050071 self.item[str(k)] = d.getBaseValue()
Norman James19e45912015-10-04 20:19:41 -050072 self.saveToCache()
73
Norman James96da5c22015-10-15 10:17:06 -050074 @dbus.service.method("org.openbmc.InventoryItem",
75 in_signature='s', out_signature='')
76 def setPresent(self,present):
77 self.item['present'] = present
78 print "Set Present: "+str(present)
79
80 @dbus.service.method("org.openbmc.InventoryItem",
81 in_signature='s', out_signature='')
82 def setFault(self,fault):
83 self.item['fault_state'] = fault
84 print "Set Fault: "+str(fault)
Norman James19e45912015-10-04 20:19:41 -050085
Norman James8c6d8382015-10-06 07:47:16 -050086 def setField(self,field,value):
Norman James2891c532015-10-06 08:01:56 -050087 self.item[field] = value
Norman James8c6d8382015-10-06 07:47:16 -050088
Norman James19e45912015-10-04 20:19:41 -050089 def isCached(self):
90 return self.cache
91
92 def getCacheFilename(self):
93 global FRU_PATH
94 name = self.item['name'].replace('/','.')
95 filename = FRU_PATH+name[1:]+".fru"
96 return filename
97
98 def saveToCache(self):
99 if (self.isCached() == False):
100 return
101 print "Caching: "+self.item['name']
Norman James8c6d8382015-10-06 07:47:16 -0500102 try:
103 output = open(self.getCacheFilename(), 'wb')
104 ## just pickle dict not whole object
Norman James2891c532015-10-06 08:01:56 -0500105 cPickle.dump(self.item,output)
Norman James8c6d8382015-10-06 07:47:16 -0500106 except Exception as e:
107 print "ERROR: "+str(e)
108 finally:
109 output.close()
Norman James19e45912015-10-04 20:19:41 -0500110
111 def loadFromCache(self):
112 if (self.isCached() == False):
113 return;
114 ## overlay with pickled data
115 filename=self.getCacheFilename()
116 if (os.path.isfile(filename)):
117 print "Loading from cache: "+filename
Norman James8c6d8382015-10-06 07:47:16 -0500118 try:
119 p = open(filename, 'rb')
120 data2 = cPickle.load(p)
121 for k in data2.keys():
Norman James2891c532015-10-06 08:01:56 -0500122 self.item[k] = data2[k]
Norman James8c6d8382015-10-06 07:47:16 -0500123 except Exception as e:
Norman James5e792e32015-10-07 17:36:17 -0500124 print "No cache file found: " +str(e)
Norman James8c6d8382015-10-06 07:47:16 -0500125 finally:
126 p.close()
Norman James19e45912015-10-04 20:19:41 -0500127
128
129if __name__ == '__main__':
130 dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
Norman James5e792e32015-10-07 17:36:17 -0500131 bus = Openbmc.getDBus()
Norman James19e45912015-10-04 20:19:41 -0500132 name = dbus.service.BusName(DBUS_NAME,bus)
133 mainloop = gobject.MainLoop()
134 obj_parent = Inventory(bus, '/org/openbmc/managers/Inventory')
135
136 for f in FRUS.keys():
137 obj_path=f.replace("<inventory_root>",System.INVENTORY_ROOT)
138 obj = InventoryItem(bus,obj_path)
Norman James8c6d8382015-10-06 07:47:16 -0500139 obj.setField('is_fru',FRUS[f]['is_fru'])
140 obj.setField('fru_type',FRUS[f]['fru_type'])
Norman James19e45912015-10-04 20:19:41 -0500141 obj.loadFromCache();
142 obj_parent.addItem(obj)
143
144 print "Running Inventory Manager"
145 mainloop.run()
146