blob: 2f3d0bb0a3d100b719ac84dc4bce9d3fe7fdc9aa [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)
Norman James9e6acf92015-09-08 07:00:04 -050076 dvalue.setVariant(1)
Norman James90baede2015-09-02 20:32:49 -050077 ## save sensor value
Norman James5d78b4d2015-09-05 13:34:34 -050078 interface_name = 'org.openbmc.SensorValue'
79 cache = System.CACHED_INTERFACES.has_key(interface_name)
Norman James90baede2015-09-02 20:32:49 -050080 obj = bus.get_object(bus_name,obj_path)
81 intf = dbus.Interface(obj, interface_name)
Norman James9e6acf92015-09-08 07:00:04 -050082 intf.setValue(dvalue.getValue())
Norman James90baede2015-09-02 20:32:49 -050083 else:
84 ## TODO: error handling
85 pass
86
87 @dbus.service.method(DBUS_NAME,
Norman James5d78b4d2015-09-05 13:34:34 -050088 in_signature='i', out_signature='v')
Norman James90baede2015-09-02 20:32:49 -050089 def getSensor(self,sensor_id):
90 val = 0
91 if (ID_LOOKUP['SENSOR'].has_key(sensor_id)):
92 obj_path = ID_LOOKUP['SENSOR'][sensor_id]
93 bus_name = ID_LOOKUP['BUS_NAME'][sensor_id]
94 print "getSensor: "+obj_path+","+bus_name
95 ## TODO don't do hardcoding
96 obj = bus.get_object('org.openbmc.managers.Sensors',
97 '/org/openbmc/managers/Sensors/Barreleye')
98 intf = dbus.Interface(obj, 'org.openbmc.managers.Sensors' )
99 val = intf.getSensor(obj_path)
Norman James90baede2015-09-02 20:32:49 -0500100
101 return val
102
Norman James9e6acf92015-09-08 07:00:04 -0500103 @dbus.service.method(DBUS_NAME,
104 in_signature='', out_signature='')
105 def pokeHostWatchdog(self):
106 ## TODO don't do hardcoding
107 obj = bus.get_object('org.openbmc.watchdog.HostWatchdog',
108 '/org/openbmc/watchdog/HostWatchdog/Watchdog1')
109 intf = dbus.Interface(obj, 'org.openbmc.Watchdog' )
110 intf.poke()
111
112 return None
113
114 @dbus.service.method(DBUS_NAME,
115 in_signature='', out_signature='')
116 def startHostWatchdog(self):
117 ## TODO don't do hardcoding
118 obj = bus.get_object('org.openbmc.watchdog.HostWatchdog',
119 '/org/openbmc/watchdog/HostWatchdog/Watchdog1')
120 intf = dbus.Interface(obj, 'org.openbmc.Watchdog' )
121 intf.start()
122
123 return None
124
125
126
127
Norman James90baede2015-09-02 20:32:49 -0500128
129if __name__ == '__main__':
130 dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
131 bus = dbus.SessionBus()
132 name = dbus.service.BusName(DBUS_NAME,bus)
133 obj = IpmiTranslator(bus,OBJ_NAME)
Norman James5d78b4d2015-09-05 13:34:34 -0500134 mainloop = GObject.MainLoop()
Norman James90baede2015-09-02 20:32:49 -0500135
136 print "Running IpmiTranslator"
137 mainloop.run()
138