blob: ec56057e27cbb93a59dca4b5f861b15a4393ebff [file] [log] [blame]
Norman James90baede2015-09-02 20:32:49 -05001#!/usr/bin/env python
2
3import sys
4import subprocess
5import gobject
6import dbus
7import dbus.service
8import dbus.mainloop.glib
9import xml.etree.ElementTree as ET
10import 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)
31 bus.add_signal_receiver(self.UpdateFruHandler,
32 dbus_interface = 'org.openbmc.control.IpmiBt',
33 signal_name = "UpdateFru")
34 bus.add_signal_receiver(self.UpdateSensorHandler,
35 dbus_interface = 'org.openbmc.control.IpmiBt',
36 signal_name = "UpdateSensor")
37
38 ## generate fru and sensor id to dbus object path lookup
39 for bus_name in System.SYSTEM_CONFIG.keys():
40 obj_name = "/"+bus_name.replace('.','/')
41 for instances in System.SYSTEM_CONFIG[bus_name]['instances']:
42 obj_path = obj_name+"/"+instances['name']
43 if (instances.has_key('sensor_id')):
44 iid = instances['sensor_id']
45 ID_LOOKUP['BUS_NAME'][iid] = bus_name
46 ID_LOOKUP['SENSOR'][iid] = obj_path
47 if (instances.has_key('fru_id')):
48 iid = instances['fru_id']
49 ID_LOOKUP['BUS_NAME'][iid] = bus_name
50 ID_LOOKUP['FRU'][iid] = obj_path
51
52
53 ## TODO: Should be event driven instead of calling object methods because
54 ## object could be hung
55 def UpdateFruHandler(self,fru_id,data):
56 if (ID_LOOKUP['FRU'].has_key(fru_id)):
57 obj_path = ID_LOOKUP['FRU'][fru_id]
58 bus_name = ID_LOOKUP['BUS_NAME'][fru_id]
59 ## save fru object to object and disk
60 interface_name = 'org.openbmc.Fru'
61 cache = System.CACHED_INTERFACES.has_key(interface_name)
62 PropertyManager.saveProperties(bus,bus_name,obj_path,interface_name,cache,data)
63 else:
64 ## TODO: error handling
65 pass
66
67 def UpdateSensorHandler(self,sensor_id,value):
68 if (ID_LOOKUP['SENSOR'].has_key(sensor_id)):
69 obj_path = ID_LOOKUP['SENSOR'][sensor_id]
70 bus_name = ID_LOOKUP['BUS_NAME'][sensor_id]
71 data = { 'value' : value }
72 ## save sensor value
73 ## TODO: need to accomodate any sensor interface
74 interface_name = 'org.openbmc.SensorInteger'
75 #cache = System.CACHED_INTERFACES.has_key(interface_name)
76 obj = bus.get_object(bus_name,obj_path)
77 intf = dbus.Interface(obj, interface_name)
78 #intf.setValue(value)
79 PropertyManager.saveProperties(bus,bus_name,obj_path,interface_name,cache,data)
80 else:
81 ## TODO: error handling
82 pass
83
84 @dbus.service.method(DBUS_NAME,
85 in_signature='i', out_signature='i')
86 def getSensor(self,sensor_id):
87 val = 0
88 if (ID_LOOKUP['SENSOR'].has_key(sensor_id)):
89 obj_path = ID_LOOKUP['SENSOR'][sensor_id]
90 bus_name = ID_LOOKUP['BUS_NAME'][sensor_id]
91 print "getSensor: "+obj_path+","+bus_name
92 ## TODO don't do hardcoding
93 obj = bus.get_object('org.openbmc.managers.Sensors',
94 '/org/openbmc/managers/Sensors/Barreleye')
95 intf = dbus.Interface(obj, 'org.openbmc.managers.Sensors' )
96 val = intf.getSensor(obj_path)
97 print "value = "+str(val)
98
99 return val
100
101
102if __name__ == '__main__':
103 dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
104 bus = dbus.SessionBus()
105 name = dbus.service.BusName(DBUS_NAME,bus)
106 obj = IpmiTranslator(bus,OBJ_NAME)
107 mainloop = gobject.MainLoop()
108
109 print "Running IpmiTranslator"
110 mainloop.run()
111