blob: f7a7aab15841dc218ff4f381d0b6755d2e230a57 [file] [log] [blame]
#!/usr/bin/env python
import sys
import subprocess
from gi.repository import GObject
import dbus
import dbus.service
import dbus.mainloop.glib
import PropertyManager
if (len(sys.argv) < 2):
print "Usage: ipmi_translator.py [system name]"
exit(1)
System = __import__(sys.argv[1])
import Openbmc
DBUS_NAME = 'org.openbmc.managers.IpmiTranslator'
OBJ_NAME = '/org/openbmc/managers/IpmiTranslator/'+sys.argv[1]
ID_LOOKUP = {
'BUS_NAME' : {},
'FRU' : {},
'SENSOR' : {},
}
class IpmiTranslator(dbus.service.Object):
def __init__(self,bus,name):
dbus.service.Object.__init__(self,bus,name)
self.property_manager = PropertyManager.PropertyManager(bus,System.CACHE_PATH)
bus.add_signal_receiver(self.UpdateFruHandler,
dbus_interface = 'org.openbmc.control.IpmiBt',
signal_name = "UpdateFru")
bus.add_signal_receiver(self.UpdateSensorHandler,
dbus_interface = 'org.openbmc.control.IpmiBt',
signal_name = "UpdateSensor")
## generate fru and sensor id to dbus object path lookup
for bus_name in System.SYSTEM_CONFIG.keys():
obj_name = "/"+bus_name.replace('.','/')
for instances in System.SYSTEM_CONFIG[bus_name]['instances']:
obj_path = obj_name+"/"+instances['name']
if (instances.has_key('sensor_id')):
iid = instances['sensor_id']
ID_LOOKUP['BUS_NAME'][iid] = bus_name
ID_LOOKUP['SENSOR'][iid] = obj_path
if (instances.has_key('fru_id')):
iid = instances['fru_id']
ID_LOOKUP['BUS_NAME'][iid] = bus_name
ID_LOOKUP['FRU'][iid] = obj_path
## TODO: Should be event driven instead of calling object methods because
## object could be hung
def UpdateFruHandler(self,fru_id,data):
if (ID_LOOKUP['FRU'].has_key(fru_id)):
obj_path = ID_LOOKUP['FRU'][fru_id]
bus_name = ID_LOOKUP['BUS_NAME'][fru_id]
## save fru object to object and disk
interface_name = 'org.openbmc.Fru'
cache = System.CACHED_INTERFACES.has_key(interface_name)
self.property_manager.saveProperties(bus_name,obj_path,interface_name,cache,data)
else:
## TODO: error handling
pass
def UpdateSensorHandler(self,sensor_id,value):
if (ID_LOOKUP['SENSOR'].has_key(sensor_id)):
obj_path = ID_LOOKUP['SENSOR'][sensor_id]
bus_name = ID_LOOKUP['BUS_NAME'][sensor_id]
## change to variant data type
## comes in off dbus from ipmi_bt as a basic data type
dvalue = Openbmc.DbusProperty('value',value)
dvalue.setVariant(2)
data = { 'value' : dvalue.getValue() }
## save sensor value
## TODO: need to accomodate any sensor interface
interface_name = 'org.openbmc.SensorValue'
cache = System.CACHED_INTERFACES.has_key(interface_name)
obj = bus.get_object(bus_name,obj_path)
intf = dbus.Interface(obj, interface_name)
self.property_manager.saveProperties(bus_name,obj_path,interface_name,cache,data)
else:
## TODO: error handling
pass
@dbus.service.method(DBUS_NAME,
in_signature='i', out_signature='v')
def getSensor(self,sensor_id):
val = 0
if (ID_LOOKUP['SENSOR'].has_key(sensor_id)):
obj_path = ID_LOOKUP['SENSOR'][sensor_id]
bus_name = ID_LOOKUP['BUS_NAME'][sensor_id]
print "getSensor: "+obj_path+","+bus_name
## TODO don't do hardcoding
obj = bus.get_object('org.openbmc.managers.Sensors',
'/org/openbmc/managers/Sensors/Barreleye')
intf = dbus.Interface(obj, 'org.openbmc.managers.Sensors' )
val = intf.getSensor(obj_path)
print "value = "+str(val)
return val
if __name__ == '__main__':
dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
bus = dbus.SessionBus()
name = dbus.service.BusName(DBUS_NAME,bus)
obj = IpmiTranslator(bus,OBJ_NAME)
mainloop = GObject.MainLoop()
print "Running IpmiTranslator"
mainloop.run()