blob: f679feeca001f2e095fd9aef57f6ac56984f2b8b [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):
27 dbus.service.Object.__init__(self,bus,name)
28 self.objects = [ ]
29
30 def addItem(self,item):
31 self.objects.append(item)
32
33 @dbus.service.method("org.openbmc.managers.Inventory",
34 in_signature='', out_signature='a{sa{sv}}')
35 def getItems(self):
36 tmp_obj = {}
37 for item in self.objects:
38 tmp_obj[str(item.item['name'])]=item.getItemDict()
39 return tmp_obj
40
41
42
43class InventoryItem(dbus.service.Object):
44 def __init__(self,bus,name):
45 dbus.service.Object.__init__(self,bus,name)
46 ## store all properties in a dict so can easily
47 ## send on dbus
48 self.item = {
49 'name' : name,
50 'is_fru' : False,
51 'fru_type' : 0,
52 'state' : 0,
53 'data' : { 'manufacturer' : "" }
54 }
55 #self.name = name
56 #self.is_fru = False
57 #self.fru_type = 0
58 self.cache = True
59 #self.state = 0
60
61 def getItemDict(self):
62 return self.item
63
64 @dbus.service.signal('org.openbmc.EventLog')
65 def EventLog(self, priority, message, rc):
66 pass
67
68 @dbus.service.method('org.openbmc.InventoryItem',
69 in_signature='a{sv}', out_signature='')
70 def update(self,data):
71 ## translate dbus data into basic data types
72 for k in data.keys():
73 d = Openbmc.DbusProperty(k,data[k])
74 self.item['data'][str(k)] = d.getBaseValue()
75 self.saveToCache()
76
77 @dbus.service.method("org.openbmc.SensorValue",
78 in_signature='y', out_signature='')
79 def setValue(self,data):
80 self.item['state'] = data
81 #self.saveToCache()
82 print "Update Fru State: "+str(self.item['state'])
83
84 def isCached(self):
85 return self.cache
86
87 def getCacheFilename(self):
88 global FRU_PATH
89 name = self.item['name'].replace('/','.')
90 filename = FRU_PATH+name[1:]+".fru"
91 return filename
92
93 def saveToCache(self):
94 if (self.isCached() == False):
95 return
96 print "Caching: "+self.item['name']
97 # TODO: error handling
98 output = open(self.getCacheFilename(), 'wb')
99 ## just pickle dict not whole object
100 cPickle.dump(self.item['data'],output)
101 output.close()
102
103 def loadFromCache(self):
104 if (self.isCached() == False):
105 return;
106 ## overlay with pickled data
107 filename=self.getCacheFilename()
108 if (os.path.isfile(filename)):
109 print "Loading from cache: "+filename
110 # TODO: error handling
111 p = open(filename, 'rb')
112 data2 = cPickle.load(p)
113 for k in data2.keys():
114 self.item['data'][k] = data2[k]
115
116
117
118if __name__ == '__main__':
119 dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
120 bus = dbus.SessionBus()
121 name = dbus.service.BusName(DBUS_NAME,bus)
122 mainloop = gobject.MainLoop()
123 obj_parent = Inventory(bus, '/org/openbmc/managers/Inventory')
124
125 for f in FRUS.keys():
126 obj_path=f.replace("<inventory_root>",System.INVENTORY_ROOT)
127 obj = InventoryItem(bus,obj_path)
128 obj.is_fru = FRUS[f]['is_fru']
129 obj.fru_type = FRUS[f]['fru_type']
130 obj.loadFromCache();
131 obj_parent.addItem(obj)
132
133 print "Running Inventory Manager"
134 mainloop.run()
135