blob: 2e1e96af2fa6b0d961385c55a65ff555105aa7be [file] [log] [blame]
Norman James90baede2015-09-02 20:32:49 -05001#!/usr/bin/env python
2
3import sys
Norman James6f8d0422015-09-14 18:48:00 -05004#from gi.repository import GObject
5import gobject
Norman James90baede2015-09-02 20:32:49 -05006import dbus
7import dbus.service
8import dbus.mainloop.glib
9
10if (len(sys.argv) < 2):
11 print "Usage: sensor_manager.py [system name]"
12 exit(1)
Norman James5d78b4d2015-09-05 13:34:34 -050013System = __import__(sys.argv[1])
Norman James90baede2015-09-02 20:32:49 -050014import Openbmc
15
16DBUS_NAME = 'org.openbmc.managers.Sensors'
Norman James362a80f2015-09-14 14:04:39 -050017OBJ_NAME = '/org/openbmc/managers/Sensors'
Norman James90baede2015-09-02 20:32:49 -050018
19class SensorManager(dbus.service.Object):
20 def __init__(self,bus,name):
21 dbus.service.Object.__init__(self,bus,name)
Norman James362a80f2015-09-14 14:04:39 -050022 bus.add_signal_receiver(self.SensorChangedHandler,
Norman James9e6acf92015-09-08 07:00:04 -050023 dbus_interface = 'org.openbmc.SensorValue',
24 signal_name = 'Changed', path_keyword='path')
Norman James90baede2015-09-02 20:32:49 -050025 bus.add_signal_receiver(self.NormalThreshold,
Norman James5d78b4d2015-09-05 13:34:34 -050026 dbus_interface = 'org.openbmc.SensorThreshold',
Norman James90baede2015-09-02 20:32:49 -050027 signal_name = 'Normal', path_keyword='path')
28 bus.add_signal_receiver(self.WarningThreshold,
Norman James5d78b4d2015-09-05 13:34:34 -050029 dbus_interface = 'org.openbmc.SensorThreshold',
Norman James90baede2015-09-02 20:32:49 -050030 signal_name = 'Warning', path_keyword='path')
31 bus.add_signal_receiver(self.CriticalThreshold,
Norman James5d78b4d2015-09-05 13:34:34 -050032 dbus_interface = 'org.openbmc.SensorThreshold',
Norman James90baede2015-09-02 20:32:49 -050033 signal_name = 'Critical', path_keyword='path')
34
35 self.sensor_cache = {}
Norman James362a80f2015-09-14 14:04:39 -050036
37 @dbus.service.method(DBUS_NAME,
38 in_signature='', out_signature='a{sv}')
39 def getSensorsAll(self):
40 return self.sensor_cache;
41
42 @dbus.service.method(DBUS_NAME,
43 in_signature='y', out_signature='v')
44 def getSensorFromId(self,ipmi_id):
45 intf_sys = Openbmc.getManagerInterface(bus,"System")
46 obj_info = intf_sys.getObjFromIpmi(ipmi_id)
47 intf_name = str(obj_info[0])
48 obj_name = str(obj_info[1])
49 return self.getSensor(obj_name)
50
51 @dbus.service.method(DBUS_NAME,
52 in_signature='yv', out_signature='')
53 def setSensorFromId(self,ipmi_id,value):
54 intf_sys = Openbmc.getManagerInterface(bus,"System")
55 obj_info = intf_sys.getObjFromIpmi(ipmi_id)
Norman James90baede2015-09-02 20:32:49 -050056
Norman James362a80f2015-09-14 14:04:39 -050057 obj = bus.get_object(obj_info[0],obj_info[1])
58 intf = dbus.Interface(obj,"org.openbmc.SensorValue")
59 intf.setValue(value)
60 return None
61
62
Norman James90baede2015-09-02 20:32:49 -050063 @dbus.service.method(DBUS_NAME,
Norman James5d78b4d2015-09-05 13:34:34 -050064 in_signature='s', out_signature='v')
Norman James90baede2015-09-02 20:32:49 -050065 def getSensor(self,path):
Norman James362a80f2015-09-14 14:04:39 -050066 val = 0
Norman James90baede2015-09-02 20:32:49 -050067 if (self.sensor_cache.has_key(path) == True):
68 val = self.sensor_cache[path]['value']
Norman James362a80f2015-09-14 14:04:39 -050069 else:
70 # TODO: error handling
71 print "Unknown sensor at: "+path
Norman James90baede2015-09-02 20:32:49 -050072 return val
Norman James362a80f2015-09-14 14:04:39 -050073
74 ## Signal handlers
75 def SensorChangedHandler(self,value,units,path = None):
Norman James9e6acf92015-09-08 07:00:04 -050076 self.initSensorEntry(path)
77 self.sensor_cache[path]['value'] = value
78 self.sensor_cache[path]['units'] = units
Norman James90baede2015-09-02 20:32:49 -050079
80 @dbus.service.signal(DBUS_NAME)
81 def CriticalThreshold(self, path = None):
82 print "Critical: "+path
Norman James5d78b4d2015-09-05 13:34:34 -050083 self.initSensorEntry(path)
Norman James90baede2015-09-02 20:32:49 -050084 self.sensor_cache[path]['threshold'] = "CRITICAL"
85
Norman James90baede2015-09-02 20:32:49 -050086 @dbus.service.signal(DBUS_NAME)
87 def WarningThreshold(self, path = None):
Norman James5d78b4d2015-09-05 13:34:34 -050088 print "Warning:"+path
89 self.initSensorEntry(path)
Norman James90baede2015-09-02 20:32:49 -050090 self.sensor_cache[path]['threshold'] = "WARNING"
91
Norman James90baede2015-09-02 20:32:49 -050092 @dbus.service.signal(DBUS_NAME)
93 def NormalThreshold(self, path = None):
94 print "Normal: "+path
Norman James5d78b4d2015-09-05 13:34:34 -050095 self.initSensorEntry(path)
Norman James90baede2015-09-02 20:32:49 -050096 self.sensor_cache[path]['threshold'] = "NORMAL"
97
Norman James5d78b4d2015-09-05 13:34:34 -050098 def initSensorEntry(self,path):
99 if (self.sensor_cache.has_key(path) == False):
100 self.sensor_cache[path] = {}
Norman James90baede2015-09-02 20:32:49 -0500101
Norman James5d78b4d2015-09-05 13:34:34 -0500102
Norman James90baede2015-09-02 20:32:49 -0500103if __name__ == '__main__':
104 dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
105 bus = dbus.SessionBus()
106 name = dbus.service.BusName(DBUS_NAME,bus)
107 obj = SensorManager(bus,OBJ_NAME)
Norman James6f8d0422015-09-14 18:48:00 -0500108 mainloop = gobject.MainLoop()
Norman James90baede2015-09-02 20:32:49 -0500109
110 print "Running Sensor Manager"
111 mainloop.run()
112