blob: bcf3fd8dfb168f4cb5bcdac78c17a9c8271949ba [file] [log] [blame]
Norman James90baede2015-09-02 20:32:49 -05001#!/usr/bin/env python
2
3import sys
Norman James5d78b4d2015-09-05 13:34:34 -05004from gi.repository import GObject
Norman James90baede2015-09-02 20:32:49 -05005import dbus
6import dbus.service
7import dbus.mainloop.glib
8
9if (len(sys.argv) < 2):
10 print "Usage: sensor_manager.py [system name]"
11 exit(1)
Norman James5d78b4d2015-09-05 13:34:34 -050012System = __import__(sys.argv[1])
Norman James90baede2015-09-02 20:32:49 -050013import Openbmc
14
15DBUS_NAME = 'org.openbmc.managers.Sensors'
Norman James362a80f2015-09-14 14:04:39 -050016OBJ_NAME = '/org/openbmc/managers/Sensors'
Norman James90baede2015-09-02 20:32:49 -050017
18class SensorManager(dbus.service.Object):
19 def __init__(self,bus,name):
20 dbus.service.Object.__init__(self,bus,name)
Norman James362a80f2015-09-14 14:04:39 -050021 bus.add_signal_receiver(self.SensorChangedHandler,
Norman James9e6acf92015-09-08 07:00:04 -050022 dbus_interface = 'org.openbmc.SensorValue',
23 signal_name = 'Changed', path_keyword='path')
Norman James90baede2015-09-02 20:32:49 -050024 bus.add_signal_receiver(self.NormalThreshold,
Norman James5d78b4d2015-09-05 13:34:34 -050025 dbus_interface = 'org.openbmc.SensorThreshold',
Norman James90baede2015-09-02 20:32:49 -050026 signal_name = 'Normal', path_keyword='path')
27 bus.add_signal_receiver(self.WarningThreshold,
Norman James5d78b4d2015-09-05 13:34:34 -050028 dbus_interface = 'org.openbmc.SensorThreshold',
Norman James90baede2015-09-02 20:32:49 -050029 signal_name = 'Warning', path_keyword='path')
30 bus.add_signal_receiver(self.CriticalThreshold,
Norman James5d78b4d2015-09-05 13:34:34 -050031 dbus_interface = 'org.openbmc.SensorThreshold',
Norman James90baede2015-09-02 20:32:49 -050032 signal_name = 'Critical', path_keyword='path')
33
34 self.sensor_cache = {}
Norman James362a80f2015-09-14 14:04:39 -050035
36 @dbus.service.method(DBUS_NAME,
37 in_signature='', out_signature='a{sv}')
38 def getSensorsAll(self):
39 return self.sensor_cache;
40
41 @dbus.service.method(DBUS_NAME,
42 in_signature='y', out_signature='v')
43 def getSensorFromId(self,ipmi_id):
44 intf_sys = Openbmc.getManagerInterface(bus,"System")
45 obj_info = intf_sys.getObjFromIpmi(ipmi_id)
46 intf_name = str(obj_info[0])
47 obj_name = str(obj_info[1])
48 return self.getSensor(obj_name)
49
50 @dbus.service.method(DBUS_NAME,
51 in_signature='yv', out_signature='')
52 def setSensorFromId(self,ipmi_id,value):
53 intf_sys = Openbmc.getManagerInterface(bus,"System")
54 obj_info = intf_sys.getObjFromIpmi(ipmi_id)
Norman James90baede2015-09-02 20:32:49 -050055
Norman James362a80f2015-09-14 14:04:39 -050056 obj = bus.get_object(obj_info[0],obj_info[1])
57 intf = dbus.Interface(obj,"org.openbmc.SensorValue")
58 intf.setValue(value)
59 return None
60
61
Norman James90baede2015-09-02 20:32:49 -050062 @dbus.service.method(DBUS_NAME,
Norman James5d78b4d2015-09-05 13:34:34 -050063 in_signature='s', out_signature='v')
Norman James90baede2015-09-02 20:32:49 -050064 def getSensor(self,path):
Norman James362a80f2015-09-14 14:04:39 -050065 val = 0
Norman James90baede2015-09-02 20:32:49 -050066 if (self.sensor_cache.has_key(path) == True):
67 val = self.sensor_cache[path]['value']
Norman James362a80f2015-09-14 14:04:39 -050068 else:
69 # TODO: error handling
70 print "Unknown sensor at: "+path
Norman James90baede2015-09-02 20:32:49 -050071 return val
Norman James362a80f2015-09-14 14:04:39 -050072
73 ## Signal handlers
74 def SensorChangedHandler(self,value,units,path = None):
Norman James9e6acf92015-09-08 07:00:04 -050075 self.initSensorEntry(path)
76 self.sensor_cache[path]['value'] = value
77 self.sensor_cache[path]['units'] = units
Norman James90baede2015-09-02 20:32:49 -050078
79 @dbus.service.signal(DBUS_NAME)
80 def CriticalThreshold(self, path = None):
81 print "Critical: "+path
Norman James5d78b4d2015-09-05 13:34:34 -050082 self.initSensorEntry(path)
Norman James90baede2015-09-02 20:32:49 -050083 self.sensor_cache[path]['threshold'] = "CRITICAL"
84
Norman James90baede2015-09-02 20:32:49 -050085 @dbus.service.signal(DBUS_NAME)
86 def WarningThreshold(self, path = None):
Norman James5d78b4d2015-09-05 13:34:34 -050087 print "Warning:"+path
88 self.initSensorEntry(path)
Norman James90baede2015-09-02 20:32:49 -050089 self.sensor_cache[path]['threshold'] = "WARNING"
90
Norman James90baede2015-09-02 20:32:49 -050091 @dbus.service.signal(DBUS_NAME)
92 def NormalThreshold(self, path = None):
93 print "Normal: "+path
Norman James5d78b4d2015-09-05 13:34:34 -050094 self.initSensorEntry(path)
Norman James90baede2015-09-02 20:32:49 -050095 self.sensor_cache[path]['threshold'] = "NORMAL"
96
Norman James5d78b4d2015-09-05 13:34:34 -050097 def initSensorEntry(self,path):
98 if (self.sensor_cache.has_key(path) == False):
99 self.sensor_cache[path] = {}
Norman James90baede2015-09-02 20:32:49 -0500100
Norman James5d78b4d2015-09-05 13:34:34 -0500101
Norman James90baede2015-09-02 20:32:49 -0500102if __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 = SensorManager(bus,OBJ_NAME)
Norman James5d78b4d2015-09-05 13:34:34 -0500107 mainloop = GObject.MainLoop()
Norman James90baede2015-09-02 20:32:49 -0500108
109 print "Running Sensor Manager"
110 mainloop.run()
111