blob: 456c2f3bb7e526bd055f15e29cc6391114557013 [file] [log] [blame]
Brad Bishopc91b0bf2016-08-30 20:03:48 -04001#!/usr/bin/env python
Norman James19e45912015-10-04 20:19:41 -05002
Brad Bishop0f608de2016-09-08 22:48:22 -04003import os
4import sys
Norman James19e45912015-10-04 20:19:41 -05005import gobject
6import dbus
7import dbus.service
8import dbus.mainloop.glib
Brad Bishopee1b1542016-05-12 16:55:00 -04009import obmc.dbuslib.propertycacher as PropertyCacher
Brad Bishop84e73b52016-05-12 15:57:52 -040010from obmc.dbuslib.bindings import get_dbus, DbusProperties, DbusObjectManager
Brad Bishop985b2a52016-08-30 20:06:23 -040011
12try:
13 import obmc_system_config as System
14 have_system = True
15except ImportError:
16 have_system = False
Norman James19e45912015-10-04 20:19:41 -050017
18INTF_NAME = 'org.openbmc.InventoryItem'
Norman James323ed972015-12-09 09:06:37 -060019DBUS_NAME = 'org.openbmc.Inventory'
Brad Bishop985b2a52016-08-30 20:06:23 -040020
21if have_system:
22 FRUS = System.FRU_INSTANCES
23else:
24 FRUS = {}
Norman James19e45912015-10-04 20:19:41 -050025
Brad Bishopc91b0bf2016-08-30 20:03:48 -040026
27class Inventory(DbusProperties, DbusObjectManager):
28 def __init__(self, bus, name):
29 DbusProperties.__init__(self)
30 DbusObjectManager.__init__(self)
31 dbus.service.Object.__init__(self, bus, name)
Norman James19e45912015-10-04 20:19:41 -050032
33
Brad Bishop84e73b52016-05-12 15:57:52 -040034class InventoryItem(DbusProperties):
Brad Bishopc91b0bf2016-08-30 20:03:48 -040035 def __init__(self, bus, name, data):
36 DbusProperties.__init__(self)
37 dbus.service.Object.__init__(self, bus, name)
Norman Jamesb714eb22015-10-26 17:12:57 -050038
Brad Bishopc91b0bf2016-08-30 20:03:48 -040039 self.name = name
Adriana Kobylak9baab4e2016-08-03 11:03:45 -050040
Brad Bishopc91b0bf2016-08-30 20:03:48 -040041 if 'present' not in data:
42 data['present'] = 'False'
43 if 'fault' not in data:
44 data['fault'] = 'False'
45 if 'version' not in data:
46 data['version'] = ''
Norman James0a5fbf82015-12-03 17:56:55 -060047
Brad Bishopc91b0bf2016-08-30 20:03:48 -040048 self.SetMultiple(INTF_NAME, data)
Adriana Kobylak9baab4e2016-08-03 11:03:45 -050049
Brad Bishopc91b0bf2016-08-30 20:03:48 -040050 ## this will load properties from cache
51 PropertyCacher.load(name, INTF_NAME, self.properties)
Norman James19e45912015-10-04 20:19:41 -050052
Brad Bishopc91b0bf2016-08-30 20:03:48 -040053 @dbus.service.method(
54 INTF_NAME, in_signature='a{sv}', out_signature='')
55 def update(self, data):
56 self.SetMultiple(INTF_NAME, data)
57 PropertyCacher.save(self.name, INTF_NAME, self.properties)
Norman James96da5c22015-10-15 10:17:06 -050058
Brad Bishopc91b0bf2016-08-30 20:03:48 -040059 @dbus.service.method(
60 INTF_NAME, in_signature='s', out_signature='')
61 def setPresent(self, present):
62 self.Set(INTF_NAME, 'present', present)
63 PropertyCacher.save(self.name, INTF_NAME, self.properties)
64
65 @dbus.service.method(
66 INTF_NAME, in_signature='s', out_signature='')
67 def setFault(self, fault):
68 self.Set(INTF_NAME, 'fault', fault)
69 PropertyCacher.save(self.name, INTF_NAME, self.properties)
Norman James19e45912015-10-04 20:19:41 -050070
71
Norman Jamesc9c92dc2015-11-17 08:59:07 -060072def getVersion():
Brad Bishopc91b0bf2016-08-30 20:03:48 -040073 version = "Error"
74 with open('/etc/os-release', 'r') as f:
75 for line in f:
76 p = line.rstrip('\n')
77 parts = line.rstrip('\n').split('=')
78 if (parts[0] == "VERSION_ID"):
79 version = parts[1]
80 version = version.strip('"')
81 return version
Norman Jamesc9c92dc2015-11-17 08:59:07 -060082
83
Norman James19e45912015-10-04 20:19:41 -050084if __name__ == '__main__':
85 dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
Brad Bishop84e73b52016-05-12 15:57:52 -040086 bus = get_dbus()
Norman James19e45912015-10-04 20:19:41 -050087 mainloop = gobject.MainLoop()
Norman Jamesa3e47c42015-10-18 14:43:10 -050088 obj_parent = Inventory(bus, '/org/openbmc/inventory')
Matt Spinler14c82862016-08-15 13:31:10 -050089 INVENTORY_FILE = os.path.join(sys.prefix, 'share',
90 'inventory', 'inventory.json')
91
92 if os.path.exists(INVENTORY_FILE):
93 with open(INVENTORY_FILE, 'r') as f:
94 try:
95 inv = json.load(f)
96 except ValueError:
97 print "Invalid JSON detected in " + INVENTORY_FILE
98 else:
99 FRUS = inv
Norman James19e45912015-10-04 20:19:41 -0500100
101 for f in FRUS.keys():
Brad Bishopc91b0bf2016-08-30 20:03:48 -0400102 obj_path = f.replace("<inventory_root>", System.INVENTORY_ROOT)
103 obj = InventoryItem(bus, obj_path, FRUS[f])
104 obj_parent.add(obj_path, obj)
Norman Jamesc9c92dc2015-11-17 08:59:07 -0600105
Brad Bishopc91b0bf2016-08-30 20:03:48 -0400106 ## 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})
Norman Jamesc9c92dc2015-11-17 08:59:07 -0600111
Brad Bishopf0f3efe2016-06-29 23:20:24 -0400112 obj_parent.unmask_signals()
Brad Bishopc91b0bf2016-08-30 20:03:48 -0400113 name = dbus.service.BusName(DBUS_NAME, bus)
Norman James19e45912015-10-04 20:19:41 -0500114 print "Running Inventory Manager"
115 mainloop.run()