blob: bf7f414cedb3af2a0d7978ae8a2226386987a41f [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
Brad Bishop84e73b52016-05-12 15:57:52 -040012from obmc.dbuslib.bindings import get_dbus, DbusProperties, DbusObjectManager
Norman James19e45912015-10-04 20:19:41 -050013
14if (len(sys.argv) < 2):
15 print "Usage: inventory_items.py [system name]"
16 exit(1)
17System = __import__(sys.argv[1])
Norman James19e45912015-10-04 20:19:41 -050018
19
20INTF_NAME = 'org.openbmc.InventoryItem'
Norman James323ed972015-12-09 09:06:37 -060021DBUS_NAME = 'org.openbmc.Inventory'
Norman James19e45912015-10-04 20:19:41 -050022FRUS = System.FRU_INSTANCES
Norman James19e45912015-10-04 20:19:41 -050023
Brad Bishop84e73b52016-05-12 15:57:52 -040024class Inventory(DbusProperties,DbusObjectManager):
Norman James19e45912015-10-04 20:19:41 -050025 def __init__(self,bus,name):
Brad Bishop84e73b52016-05-12 15:57:52 -040026 DbusProperties.__init__(self)
27 DbusObjectManager.__init__(self)
Norman James19e45912015-10-04 20:19:41 -050028 dbus.service.Object.__init__(self,bus,name)
Norman James323ed972015-12-09 09:06:37 -060029 self.InterfacesAdded(name,self.properties)
Norman James19e45912015-10-04 20:19:41 -050030
31
Brad Bishop84e73b52016-05-12 15:57:52 -040032class InventoryItem(DbusProperties):
Norman James0a5fbf82015-12-03 17:56:55 -060033 def __init__(self,bus,name,data):
Brad Bishop84e73b52016-05-12 15:57:52 -040034 DbusProperties.__init__(self)
Norman James19e45912015-10-04 20:19:41 -050035 dbus.service.Object.__init__(self,bus,name)
Norman Jamesb714eb22015-10-26 17:12:57 -050036
Norman Jamesa3e47c42015-10-18 14:43:10 -050037 self.name = name
Norman Jamescfc2b442015-10-31 17:31:46 -050038
Norman Jamesab777b12015-10-29 06:19:18 -050039 ## this will load properties from cache
Norman James0a5fbf82015-12-03 17:56:55 -060040 # PropertyCacher.load(name,INTF_NAME,self.properties)
41 if (data.has_key('present') == False):
42 data['present'] = 'False'
43 if (data.has_key('fault') == False):
44 data['fault'] = 'False'
45 if (data.has_key('version') == False):
46 data['version'] = ''
47
Norman Jamesb714eb22015-10-26 17:12:57 -050048 self.SetMultiple(INTF_NAME,data)
Norman Jamesab777b12015-10-29 06:19:18 -050049
Norman Jamesa3e47c42015-10-18 14:43:10 -050050
51 @dbus.service.method(INTF_NAME,
Norman James19e45912015-10-04 20:19:41 -050052 in_signature='a{sv}', out_signature='')
53 def update(self,data):
Norman Jamesb714eb22015-10-26 17:12:57 -050054 self.SetMultiple(INTF_NAME,data)
Norman Jamesab777b12015-10-29 06:19:18 -050055 PropertyCacher.save(self.name,INTF_NAME,self.properties)
Norman James19e45912015-10-04 20:19:41 -050056
Norman Jamesa3e47c42015-10-18 14:43:10 -050057 @dbus.service.method(INTF_NAME,
Norman James96da5c22015-10-15 10:17:06 -050058 in_signature='s', out_signature='')
59 def setPresent(self,present):
Norman Jamesb714eb22015-10-26 17:12:57 -050060 self.Set(INTF_NAME,'present',present)
Norman James96da5c22015-10-15 10:17:06 -050061
Norman Jamesa3e47c42015-10-18 14:43:10 -050062 @dbus.service.method(INTF_NAME,
Norman James96da5c22015-10-15 10:17:06 -050063 in_signature='s', out_signature='')
64 def setFault(self,fault):
Norman Jamesb714eb22015-10-26 17:12:57 -050065 self.Set(INTF_NAME,'fault',fault)
Norman James19e45912015-10-04 20:19:41 -050066
67
Norman Jamesc9c92dc2015-11-17 08:59:07 -060068def getVersion():
69 version = "Error"
70 with open('/etc/os-release', 'r') as f:
71 for line in f:
72 p = line.rstrip('\n')
73 parts = line.rstrip('\n').split('=')
Adriana Kobylak4e13e9f2016-04-25 15:08:01 -050074 if (parts[0] == "VERSION_ID"):
Norman Jamesc9c92dc2015-11-17 08:59:07 -060075 version = parts[1]
76 return version
77
78
Norman James19e45912015-10-04 20:19:41 -050079if __name__ == '__main__':
80 dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
Brad Bishop84e73b52016-05-12 15:57:52 -040081 bus = get_dbus()
Norman James19e45912015-10-04 20:19:41 -050082 mainloop = gobject.MainLoop()
Norman Jamesa3e47c42015-10-18 14:43:10 -050083 obj_parent = Inventory(bus, '/org/openbmc/inventory')
Norman James19e45912015-10-04 20:19:41 -050084
85 for f in FRUS.keys():
86 obj_path=f.replace("<inventory_root>",System.INVENTORY_ROOT)
Norman James0a5fbf82015-12-03 17:56:55 -060087 obj = InventoryItem(bus,obj_path,FRUS[f])
Norman James323ed972015-12-09 09:06:37 -060088 obj_parent.add(obj_path,obj)
Norman Jamesc9c92dc2015-11-17 08:59:07 -060089
90 ## TODO: this is a hack to update bmc inventory item with version
91 ## should be done by flash object
92 if (FRUS[f]['fru_type'] == "BMC"):
93 version = getVersion()
94 obj.update({'version': version})
95
Brad Bishopa81e98a2016-05-02 23:07:36 -040096 name = dbus.service.BusName(DBUS_NAME,bus)
Norman James19e45912015-10-04 20:19:41 -050097 print "Running Inventory Manager"
98 mainloop.run()
99