xref: /openbmc/skeleton/pyinventorymgr/inventory_items.py (revision f47f5faad52af399946d375e3650ac26b664baf1)
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