1#!/usr/bin/env python 2 3import os 4import sys 5import gobject 6import dbus 7import dbus.service 8import dbus.mainloop.glib 9import obmc.dbuslib.propertycacher as PropertyCacher 10from obmc.dbuslib.bindings import get_dbus, DbusProperties, DbusObjectManager 11 12try: 13 import obmc_system_config as System 14 have_system = True 15except ImportError: 16 have_system = False 17 18INTF_NAME = 'org.openbmc.InventoryItem' 19DBUS_NAME = 'org.openbmc.Inventory' 20 21if have_system: 22 FRUS = System.FRU_INSTANCES 23else: 24 FRUS = {} 25 26 27class Inventory(DbusProperties, DbusObjectManager): 28 def __init__(self, bus, name): 29 super(Inventory, self).__init__( 30 conn=bus, 31 object_path=name) 32 33 34class InventoryItem(DbusProperties): 35 def __init__(self, bus, name, data): 36 super(InventoryItem, self).__init__( 37 conn=bus, 38 object_path=name) 39 40 self.name = name 41 42 if 'present' not in data: 43 data['present'] = 'False' 44 if 'fault' not in data: 45 data['fault'] = 'False' 46 if 'version' not in data: 47 data['version'] = '' 48 49 self.SetMultiple(INTF_NAME, data) 50 51 ## this will load properties from cache 52 PropertyCacher.load(name, INTF_NAME, self.properties) 53 54 @dbus.service.method( 55 INTF_NAME, in_signature='a{sv}', out_signature='') 56 def update(self, data): 57 self.SetMultiple(INTF_NAME, data) 58 PropertyCacher.save(self.name, INTF_NAME, self.properties) 59 60 @dbus.service.method( 61 INTF_NAME, in_signature='s', out_signature='') 62 def setPresent(self, present): 63 self.Set(INTF_NAME, 'present', present) 64 PropertyCacher.save(self.name, INTF_NAME, self.properties) 65 66 @dbus.service.method( 67 INTF_NAME, in_signature='s', out_signature='') 68 def setFault(self, fault): 69 self.Set(INTF_NAME, 'fault', fault) 70 PropertyCacher.save(self.name, INTF_NAME, self.properties) 71 72 73def getVersion(): 74 version = "Error" 75 with open('/etc/os-release', 'r') as f: 76 for line in f: 77 p = line.rstrip('\n') 78 parts = line.rstrip('\n').split('=') 79 if (parts[0] == "VERSION_ID"): 80 version = parts[1] 81 version = version.strip('"') 82 return version 83 84 85if __name__ == '__main__': 86 dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) 87 bus = get_dbus() 88 mainloop = gobject.MainLoop() 89 obj_parent = Inventory(bus, '/org/openbmc/inventory') 90 INVENTORY_FILE = os.path.join(sys.prefix, 'share', 91 'inventory', 'inventory.json') 92 93 if os.path.exists(INVENTORY_FILE): 94 with open(INVENTORY_FILE, 'r') as f: 95 try: 96 inv = json.load(f) 97 except ValueError: 98 print "Invalid JSON detected in " + INVENTORY_FILE 99 else: 100 FRUS = inv 101 102 for f in FRUS.keys(): 103 obj_path = f.replace("<inventory_root>", System.INVENTORY_ROOT) 104 obj = InventoryItem(bus, obj_path, FRUS[f]) 105 obj_parent.add(obj_path, obj) 106 107 ## TODO: this is a hack to update bmc inventory item with version 108 ## should be done by flash object 109 if (FRUS[f]['fru_type'] == "BMC"): 110 version = getVersion() 111 obj.update({'version': version}) 112 113 obj_parent.unmask_signals() 114 name = dbus.service.BusName(DBUS_NAME, bus) 115 print "Running Inventory Manager" 116 mainloop.run() 117