blob: f7a7aab15841dc218ff4f381d0b6755d2e230a57 [file] [log] [blame]
Norman James90baede2015-09-02 20:32:49 -05001#!/usr/bin/env python
2
3import sys
4import subprocess
Norman James5d78b4d2015-09-05 13:34:34 -05005from gi.repository import GObject
6
Norman James90baede2015-09-02 20:32:49 -05007import dbus
8import dbus.service
9import dbus.mainloop.glib
Norman James90baede2015-09-02 20:32:49 -050010import PropertyManager
11
12if (len(sys.argv) < 2):
13 print "Usage: ipmi_translator.py [system name]"
14 exit(1)
15
16System = __import__(sys.argv[1])
17import Openbmc
18
19DBUS_NAME = 'org.openbmc.managers.IpmiTranslator'
20OBJ_NAME = '/org/openbmc/managers/IpmiTranslator/'+sys.argv[1]
21ID_LOOKUP = {
22 'BUS_NAME' : {},
23 'FRU' : {},
24 'SENSOR' : {},
25}
26
27
28class IpmiTranslator(dbus.service.Object):
29 def __init__(self,bus,name):
30 dbus.service.Object.__init__(self,bus,name)
Norman James5d78b4d2015-09-05 13:34:34 -050031 self.property_manager = PropertyManager.PropertyManager(bus,System.CACHE_PATH)
Norman James90baede2015-09-02 20:32:49 -050032 bus.add_signal_receiver(self.UpdateFruHandler,
33 dbus_interface = 'org.openbmc.control.IpmiBt',
34 signal_name = "UpdateFru")
35 bus.add_signal_receiver(self.UpdateSensorHandler,
36 dbus_interface = 'org.openbmc.control.IpmiBt',
37 signal_name = "UpdateSensor")
38
39 ## generate fru and sensor id to dbus object path lookup
40 for bus_name in System.SYSTEM_CONFIG.keys():
41 obj_name = "/"+bus_name.replace('.','/')
42 for instances in System.SYSTEM_CONFIG[bus_name]['instances']:
43 obj_path = obj_name+"/"+instances['name']
44 if (instances.has_key('sensor_id')):
45 iid = instances['sensor_id']
46 ID_LOOKUP['BUS_NAME'][iid] = bus_name
47 ID_LOOKUP['SENSOR'][iid] = obj_path
48 if (instances.has_key('fru_id')):
49 iid = instances['fru_id']
50 ID_LOOKUP['BUS_NAME'][iid] = bus_name
51 ID_LOOKUP['FRU'][iid] = obj_path
52
53
54 ## TODO: Should be event driven instead of calling object methods because
55 ## object could be hung
56 def UpdateFruHandler(self,fru_id,data):
57 if (ID_LOOKUP['FRU'].has_key(fru_id)):
58 obj_path = ID_LOOKUP['FRU'][fru_id]
59 bus_name = ID_LOOKUP['BUS_NAME'][fru_id]
60 ## save fru object to object and disk
61 interface_name = 'org.openbmc.Fru'
62 cache = System.CACHED_INTERFACES.has_key(interface_name)
Norman James5d78b4d2015-09-05 13:34:34 -050063 self.property_manager.saveProperties(bus_name,obj_path,interface_name,cache,data)
Norman James90baede2015-09-02 20:32:49 -050064 else:
65 ## TODO: error handling
66 pass
67
68 def UpdateSensorHandler(self,sensor_id,value):
69 if (ID_LOOKUP['SENSOR'].has_key(sensor_id)):
70 obj_path = ID_LOOKUP['SENSOR'][sensor_id]
71 bus_name = ID_LOOKUP['BUS_NAME'][sensor_id]
Norman James5d78b4d2015-09-05 13:34:34 -050072
73 ## change to variant data type
74 ## comes in off dbus from ipmi_bt as a basic data type
75 dvalue = Openbmc.DbusProperty('value',value)
76 dvalue.setVariant(2)
77 data = { 'value' : dvalue.getValue() }
Norman James90baede2015-09-02 20:32:49 -050078 ## save sensor value
79 ## TODO: need to accomodate any sensor interface
Norman James5d78b4d2015-09-05 13:34:34 -050080 interface_name = 'org.openbmc.SensorValue'
81 cache = System.CACHED_INTERFACES.has_key(interface_name)
Norman James90baede2015-09-02 20:32:49 -050082 obj = bus.get_object(bus_name,obj_path)
83 intf = dbus.Interface(obj, interface_name)
Norman James5d78b4d2015-09-05 13:34:34 -050084 self.property_manager.saveProperties(bus_name,obj_path,interface_name,cache,data)
Norman James90baede2015-09-02 20:32:49 -050085 else:
86 ## TODO: error handling
87 pass
88
89 @dbus.service.method(DBUS_NAME,
Norman James5d78b4d2015-09-05 13:34:34 -050090 in_signature='i', out_signature='v')
Norman James90baede2015-09-02 20:32:49 -050091 def getSensor(self,sensor_id):
92 val = 0
93 if (ID_LOOKUP['SENSOR'].has_key(sensor_id)):
94 obj_path = ID_LOOKUP['SENSOR'][sensor_id]
95 bus_name = ID_LOOKUP['BUS_NAME'][sensor_id]
96 print "getSensor: "+obj_path+","+bus_name
97 ## TODO don't do hardcoding
98 obj = bus.get_object('org.openbmc.managers.Sensors',
99 '/org/openbmc/managers/Sensors/Barreleye')
100 intf = dbus.Interface(obj, 'org.openbmc.managers.Sensors' )
101 val = intf.getSensor(obj_path)
102 print "value = "+str(val)
103
104 return val
105
106
107if __name__ == '__main__':
108 dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
109 bus = dbus.SessionBus()
110 name = dbus.service.BusName(DBUS_NAME,bus)
111 obj = IpmiTranslator(bus,OBJ_NAME)
Norman James5d78b4d2015-09-05 13:34:34 -0500112 mainloop = GObject.MainLoop()
Norman James90baede2015-09-02 20:32:49 -0500113
114 print "Running IpmiTranslator"
115 mainloop.run()
116