blob: 865a717cc9dfa2e9aa12d70f00bdc257c85c8044 [file] [log] [blame]
Norman James42c1be82015-10-22 14:34:26 -05001#!/usr/bin/python -u
Norman James19e45912015-10-04 20:19:41 -05002
3import os
4import sys
5import gobject
6import dbus
7import dbus.service
8import dbus.mainloop.glib
9import cPickle
10import json
Norman Jamesab777b12015-10-29 06:19:18 -050011import PropertyCacher
Norman James19e45912015-10-04 20:19:41 -050012
13if (len(sys.argv) < 2):
14 print "Usage: inventory_items.py [system name]"
15 exit(1)
16System = __import__(sys.argv[1])
17import Openbmc
18
19
20INTF_NAME = 'org.openbmc.InventoryItem'
21DBUS_NAME = 'org.openbmc.managers.Inventory'
Norman Jamesa3e47c42015-10-18 14:43:10 -050022ENUM_INTF = 'org.openbmc.Object.Enumerate'
Norman James19e45912015-10-04 20:19:41 -050023
24FRUS = System.FRU_INSTANCES
Norman James19e45912015-10-04 20:19:41 -050025
Norman Jamescfc2b442015-10-31 17:31:46 -050026class Inventory(Openbmc.DbusProperties):
Norman James19e45912015-10-04 20:19:41 -050027 def __init__(self,bus,name):
28 dbus.service.Object.__init__(self,bus,name)
29 self.objects = [ ]
Norman Jamescfc2b442015-10-31 17:31:46 -050030 self.ObjectAdded(name,ENUM_INTF)
Norman James19e45912015-10-04 20:19:41 -050031
32 def addItem(self,item):
33 self.objects.append(item)
34
Norman Jamesa3e47c42015-10-18 14:43:10 -050035 @dbus.service.method(ENUM_INTF,
Norman James19e45912015-10-04 20:19:41 -050036 in_signature='', out_signature='a{sa{sv}}')
Norman Jamesa3e47c42015-10-18 14:43:10 -050037 def enumerate(self):
Norman James19e45912015-10-04 20:19:41 -050038 tmp_obj = {}
39 for item in self.objects:
Norman Jamesa3e47c42015-10-18 14:43:10 -050040 tmp_obj[str(item.name)]=item.GetAll(INTF_NAME)
Norman James19e45912015-10-04 20:19:41 -050041 return tmp_obj
42
43
44
Norman Jamesa3e47c42015-10-18 14:43:10 -050045class InventoryItem(Openbmc.DbusProperties):
Norman James0a5fbf82015-12-03 17:56:55 -060046 def __init__(self,bus,name,data):
Norman Jamesa3e47c42015-10-18 14:43:10 -050047 Openbmc.DbusProperties.__init__(self)
Norman James19e45912015-10-04 20:19:41 -050048 dbus.service.Object.__init__(self,bus,name)
Norman Jamesb714eb22015-10-26 17:12:57 -050049
Norman Jamesa3e47c42015-10-18 14:43:10 -050050 self.name = name
Norman Jamescfc2b442015-10-31 17:31:46 -050051
Norman Jamesab777b12015-10-29 06:19:18 -050052 ## this will load properties from cache
Norman James0a5fbf82015-12-03 17:56:55 -060053 # PropertyCacher.load(name,INTF_NAME,self.properties)
54 if (data.has_key('present') == False):
55 data['present'] = 'False'
56 if (data.has_key('fault') == False):
57 data['fault'] = 'False'
58 if (data.has_key('version') == False):
59 data['version'] = ''
60
Norman Jamesb714eb22015-10-26 17:12:57 -050061 self.SetMultiple(INTF_NAME,data)
Norman Jamescfc2b442015-10-31 17:31:46 -050062 self.ObjectAdded(name,INTF_NAME)
Norman Jamesab777b12015-10-29 06:19:18 -050063
Norman Jamesa3e47c42015-10-18 14:43:10 -050064
65 @dbus.service.method(INTF_NAME,
Norman James19e45912015-10-04 20:19:41 -050066 in_signature='a{sv}', out_signature='')
67 def update(self,data):
Norman Jamesb714eb22015-10-26 17:12:57 -050068 self.SetMultiple(INTF_NAME,data)
Norman Jamesab777b12015-10-29 06:19:18 -050069 PropertyCacher.save(self.name,INTF_NAME,self.properties)
Norman James19e45912015-10-04 20:19:41 -050070
Norman Jamesa3e47c42015-10-18 14:43:10 -050071 @dbus.service.method(INTF_NAME,
Norman James96da5c22015-10-15 10:17:06 -050072 in_signature='s', out_signature='')
73 def setPresent(self,present):
Norman Jamesb714eb22015-10-26 17:12:57 -050074 self.Set(INTF_NAME,'present',present)
Norman James96da5c22015-10-15 10:17:06 -050075
Norman Jamesa3e47c42015-10-18 14:43:10 -050076 @dbus.service.method(INTF_NAME,
Norman James96da5c22015-10-15 10:17:06 -050077 in_signature='s', out_signature='')
78 def setFault(self,fault):
Norman Jamesb714eb22015-10-26 17:12:57 -050079 self.Set(INTF_NAME,'fault',fault)
Norman James19e45912015-10-04 20:19:41 -050080
81
Norman Jamesc9c92dc2015-11-17 08:59:07 -060082def getVersion():
83 version = "Error"
84 with open('/etc/os-release', 'r') as f:
85 for line in f:
86 p = line.rstrip('\n')
87 parts = line.rstrip('\n').split('=')
88 if (parts[0] == "BUILD_ID"):
89 version = parts[1]
90 return version
91
92
Norman James19e45912015-10-04 20:19:41 -050093if __name__ == '__main__':
94 dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
Norman James5e792e32015-10-07 17:36:17 -050095 bus = Openbmc.getDBus()
Norman James19e45912015-10-04 20:19:41 -050096 name = dbus.service.BusName(DBUS_NAME,bus)
97 mainloop = gobject.MainLoop()
Norman Jamesa3e47c42015-10-18 14:43:10 -050098 obj_parent = Inventory(bus, '/org/openbmc/inventory')
Norman James19e45912015-10-04 20:19:41 -050099
100 for f in FRUS.keys():
Norman James0a5fbf82015-12-03 17:56:55 -0600101 print f
Norman James19e45912015-10-04 20:19:41 -0500102 obj_path=f.replace("<inventory_root>",System.INVENTORY_ROOT)
Norman James0a5fbf82015-12-03 17:56:55 -0600103 obj = InventoryItem(bus,obj_path,FRUS[f])
Norman James19e45912015-10-04 20:19:41 -0500104 obj_parent.addItem(obj)
Norman Jamesc9c92dc2015-11-17 08:59:07 -0600105
106 ## TODO: this is a hack to update bmc inventory item with version
107 ## should be done by flash object
108 if (FRUS[f]['fru_type'] == "BMC"):
109 version = getVersion()
110 obj.update({'version': version})
111
Norman James19e45912015-10-04 20:19:41 -0500112 print "Running Inventory Manager"
113 mainloop.run()
114