blob: da4ecff780cca031e31fbe6081096e8bb2459d90 [file] [log] [blame]
Norman Jamesce46e3e2015-08-30 22:25:55 -05001import dbus
Norman James9e6acf92015-09-08 07:00:04 -05002import xml.etree.ElementTree as ET
Norman Jamesce46e3e2015-08-30 22:25:55 -05003
4BUS_PREFIX = 'org.openbmc'
Norman James362a80f2015-09-14 14:04:39 -05005OBJ_PREFIX = "/org/openbmc"
Norman Jamesce46e3e2015-08-30 22:25:55 -05006GPIO_DEV = '/sys/class/gpio'
Norman James5e792e32015-10-07 17:36:17 -05007BUS = "system"
Norman Jamesce46e3e2015-08-30 22:25:55 -05008
Norman Jamesce46e3e2015-08-30 22:25:55 -05009ENUMS = {
10 'org.openbmc.SensorIntegerThreshold.state' :
11 ['NOT_SET','NORMAL','LOWER_CRITICAL','LOWER_WARNING','UPPER_WARNING','UPPER_CRITICAL'],
Norman James362a80f2015-09-14 14:04:39 -050012}
13
14DBUS_TO_BASE_TYPES = {
15 'dbus.Byte' : 'int',
16 'dbus.Double' : 'float',
17 'dbus.Int32' : 'int',
18 'dbus.UInt32' : 'long',
19 'dbus.String' : 'str',
20 'dbus.UInt64' : 'long',
21 'dbus.Boolean' : 'bool',
22}
23
24BASE_TO_DBUS_TYPES = {
25 'int' : 'dbus.Int32',
26 'float' : 'dbus.Double',
27 'str' : 'dbus.String',
28 'long' : 'dbus.Int64',
29 'bool' : 'dbus.Boolean'
Norman Jamesce46e3e2015-08-30 22:25:55 -050030}
Norman James90baede2015-09-02 20:32:49 -050031
Norman James969227c2015-10-08 15:10:47 -050032def getSystemName():
33 #use filename as system name, strip off path and ext
34 parts = __file__.replace('.pyc','').replace('.py','').split('/')
35 return parts[len(parts)-1]
36
37
Norman James5e792e32015-10-07 17:36:17 -050038def getDBus():
39 bus = None
40 if (BUS == "session"):
41 bus = dbus.SessionBus()
42 else:
43 bus = dbus.SystemBus()
44 return bus
45
Norman James5d78b4d2015-09-05 13:34:34 -050046
Norman James362a80f2015-09-14 14:04:39 -050047def getManagerInterface(bus,manager):
48 bus_name = "org.openbmc.managers."+manager
49 obj_name = "/org/openbmc/managers/"+manager
50 obj = bus.get_object(bus_name,obj_name)
51 return dbus.Interface(obj,bus_name)
Norman James5d78b4d2015-09-05 13:34:34 -050052
Norman James5d78b4d2015-09-05 13:34:34 -050053
Norman James362a80f2015-09-14 14:04:39 -050054def get_objs(bus,bus_name,path,objects):
Norman James19e45912015-10-04 20:19:41 -050055 tmp_path = path
56 if (path == ""):
57 tmp_path="/"
Norman James91dac392015-10-14 09:38:55 -050058
Norman James19e45912015-10-04 20:19:41 -050059 obj = bus.get_object(bus_name,tmp_path)
Norman James9e6acf92015-09-08 07:00:04 -050060 introspect_iface = dbus.Interface(obj,"org.freedesktop.DBus.Introspectable")
61 tree = ET.ElementTree(ET.fromstring(introspect_iface.Introspect()))
62 root = tree.getroot()
Norman James19e45912015-10-04 20:19:41 -050063 parent = True
Norman James362a80f2015-09-14 14:04:39 -050064 for node in root.iter('node'):
Norman James19e45912015-10-04 20:19:41 -050065 for intf in node.iter('interface'):
66 intf_name = intf.attrib['name']
Norman James19e45912015-10-04 20:19:41 -050067 parts=path.split('/')
68 instance = parts[len(parts)-1]
69 if (objects.has_key(instance) == False):
70 objects[instance] = {}
71 objects[instance]['PATH'] = path
72 objects[instance]['INIT'] = []
73 for method in intf.iter('method'):
74 if (method.attrib['name'] == "init"):
75 objects[instance]['INIT'].append(intf_name)
Norman James362a80f2015-09-14 14:04:39 -050076
Norman James19e45912015-10-04 20:19:41 -050077 if (node.attrib.has_key('name') == True):
Norman James362a80f2015-09-14 14:04:39 -050078 node_name = node.attrib['name']
Norman James19e45912015-10-04 20:19:41 -050079 if (parent == False):
80 get_objs(bus,bus_name,path+"/"+node_name,objects)
81 else:
82 if (node_name != "" and node_name != path):
83 get_objs(bus,bus_name,node_name,objects)
84
85 parent = False
Norman James362a80f2015-09-14 14:04:39 -050086
Norman Jamesa3e47c42015-10-18 14:43:10 -050087class DbusProperties(dbus.service.Object):
88 def __init__(self):
89 dbus.service.Object.__init__(self)
90 self.properties = {}
Norman James362a80f2015-09-14 14:04:39 -050091
Norman Jamesa3e47c42015-10-18 14:43:10 -050092 @dbus.service.method(dbus.PROPERTIES_IFACE,
93 in_signature='ss', out_signature='v')
94 def Get(self, interface_name, property_name):
95 d = self.GetAll(interface_name)
96 try:
97 v = d[property_name]
98 return v
99 except:
100 raise dbus.exceptions.DBusException(
101 "org.freedesktop.UnknownPropery: "+property_name)
102
103 @dbus.service.method(dbus.PROPERTIES_IFACE,
104 in_signature='s', out_signature='a{sv}')
105 def GetAll(self, interface_name):
106 try:
107 d = self.properties[interface_name]
108 return d
109 except:
110 raise dbus.exceptions.DBusException(
111 "org.freedesktop.UnknownInterface: "+interface_name)
112
113 @dbus.service.method(dbus.PROPERTIES_IFACE,
114 in_signature='ssv')
115 def Set(self, interface_name, property_name, new_value):
116 if (self.properties.has_key(interface_name) == False):
117 self.properties[interface_name] = {}
118 try:
119 old_value = self.properties[interface_name][property_name]
120 if (old_value != new_value):
121 self.properties[interface_name][property_name] = new_value
122 self.PropertiesChanged(interface_name,{ property_name: new_value }, [])
123
124 except:
125 self.properties[interface_name][property_name] = new_value
Norman Jamesf81d4982015-10-26 17:12:14 -0500126 self.PropertiesChanged(interface_name,{ property_name: new_value }, [])
Norman Jamesa3e47c42015-10-18 14:43:10 -0500127
Norman Jamesf81d4982015-10-26 17:12:14 -0500128 @dbus.service.method("org.openbmc.Object.Properties",
Norman James2656f332015-10-26 06:42:41 -0500129 in_signature='sa{sv}')
Norman Jamesf81d4982015-10-26 17:12:14 -0500130 def SetMultiple(self, interface_name, prop_dict):
Norman James2656f332015-10-26 06:42:41 -0500131 if (self.properties.has_key(interface_name) == False):
132 self.properties[interface_name] = {}
133
134 value_changed = False
135 for property_name in prop_dict:
136 new_value = prop_dict[property_name]
137 try:
138 old_value = self.properties[interface_name][property_name]
139 if (old_value != new_value):
140 self.properties[interface_name][property_name] = new_value
141 value_changed = True
142
143 except:
144 self.properties[interface_name][property_name] = new_value
145 value_changed = True
146 if (value_changed == True):
147 self.PropertiesChanged(interface_name, prop_dict, [])
148
149
Norman Jamesa3e47c42015-10-18 14:43:10 -0500150 @dbus.service.signal(dbus.PROPERTIES_IFACE,
151 signature='sa{sv}as')
152 def PropertiesChanged(self, interface_name, changed_properties,
153 invalidated_properties):
154 pass
155
156
157
158class DbusVariable:
Norman James90baede2015-09-02 20:32:49 -0500159 def __init__(self,name,value):
Norman James90baede2015-09-02 20:32:49 -0500160 self.name = str(name)
161 self.dbusType = str(type(value)).split("'")[1]
Norman James362a80f2015-09-14 14:04:39 -0500162 self.variant_level = 2
Norman James90baede2015-09-02 20:32:49 -0500163 self.value = None
Norman James362a80f2015-09-14 14:04:39 -0500164 if (BASE_TO_DBUS_TYPES.has_key(self.dbusType) == False):
165 self.variant_level = value.variant_level
166 try:
167 self.value = eval(DBUS_TO_BASE_TYPES[self.dbusType]+"(value)")
168 except:
169 raise Exception("Unknown dbus type: "+self.dbusType)
170 else:
171 self.dbusType = BASE_TO_DBUS_TYPES[self.dbusType]
172 self.value = value
Norman James90baede2015-09-02 20:32:49 -0500173
Norman James5d78b4d2015-09-05 13:34:34 -0500174 def setValue(self,value):
Norman James90baede2015-09-02 20:32:49 -0500175 try:
Norman James362a80f2015-09-14 14:04:39 -0500176 self.value = eval(DBUS_TO_BASE_TYPES[self.dbusType]+"(value)")
Norman James90baede2015-09-02 20:32:49 -0500177 except:
178 raise Exception("Unknown dbus type: "+self.dbusType)
179
Norman James5d78b4d2015-09-05 13:34:34 -0500180 def setVariant(self,variant_level):
181 self.variant_level = variant_level
Norman James90baede2015-09-02 20:32:49 -0500182
183 def getName(self):
184 return self.name
Norman James5d78b4d2015-09-05 13:34:34 -0500185
Norman James90baede2015-09-02 20:32:49 -0500186 def getValue(self):
Norman James5d78b4d2015-09-05 13:34:34 -0500187 e = self.dbusType+"(self.value, variant_level="+str(self.variant_level)+")"
Norman James90baede2015-09-02 20:32:49 -0500188 return eval(e)
189
Norman James362a80f2015-09-14 14:04:39 -0500190 def getBaseValue(self):
191 return self.value
Norman James90baede2015-09-02 20:32:49 -0500192
193 def __str__(self):
194 return self.dbusType+":"+str(self.value)