blob: 87c5ae6c55c20ff571a9f4654acd1ebe9a2a75ad [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
9FRU_TYPES = {
Norman James88872672015-09-21 16:51:35 -050010 'SYSTEM' : 0,
Norman James90baede2015-09-02 20:32:49 -050011 'CPU' : 1,
12 'DIMM' : 2,
Norman James88872672015-09-21 16:51:35 -050013 'MAIN_PLANAR' : 3,
Norman James90baede2015-09-02 20:32:49 -050014 'RISER_CARD' : 4,
Norman James88872672015-09-21 16:51:35 -050015 'FAN' : 5,
16 'BMC' : 6,
17 'CORE' : 7,
Norman James19e45912015-10-04 20:19:41 -050018 'PCIE_CARD' : 8,
Norman Jamesce46e3e2015-08-30 22:25:55 -050019}
Norman James362a80f2015-09-14 14:04:39 -050020FRU_STATES = {
21 'NORMAL' : 0,
22 'RECOVERABLE_ERROR' : 1,
23 'FATAL_ERROR' : 2,
24 'NOT_PRESENT' : 3,
25}
Norman James32e74e22015-09-15 21:28:06 -050026
Norman James32e74e22015-09-15 21:28:06 -050027
Norman Jamesce46e3e2015-08-30 22:25:55 -050028ENUMS = {
29 'org.openbmc.SensorIntegerThreshold.state' :
30 ['NOT_SET','NORMAL','LOWER_CRITICAL','LOWER_WARNING','UPPER_WARNING','UPPER_CRITICAL'],
Norman James362a80f2015-09-14 14:04:39 -050031}
32
33DBUS_TO_BASE_TYPES = {
34 'dbus.Byte' : 'int',
35 'dbus.Double' : 'float',
36 'dbus.Int32' : 'int',
37 'dbus.UInt32' : 'long',
38 'dbus.String' : 'str',
39 'dbus.UInt64' : 'long',
40 'dbus.Boolean' : 'bool',
41}
42
43BASE_TO_DBUS_TYPES = {
44 'int' : 'dbus.Int32',
45 'float' : 'dbus.Double',
46 'str' : 'dbus.String',
47 'long' : 'dbus.Int64',
48 'bool' : 'dbus.Boolean'
Norman Jamesce46e3e2015-08-30 22:25:55 -050049}
Norman James90baede2015-09-02 20:32:49 -050050
Norman James969227c2015-10-08 15:10:47 -050051def getSystemName():
52 #use filename as system name, strip off path and ext
53 parts = __file__.replace('.pyc','').replace('.py','').split('/')
54 return parts[len(parts)-1]
55
56
Norman James5e792e32015-10-07 17:36:17 -050057def getDBus():
58 bus = None
59 if (BUS == "session"):
60 bus = dbus.SessionBus()
61 else:
62 bus = dbus.SystemBus()
63 return bus
64
Norman James5d78b4d2015-09-05 13:34:34 -050065
Norman James362a80f2015-09-14 14:04:39 -050066def getManagerInterface(bus,manager):
67 bus_name = "org.openbmc.managers."+manager
68 obj_name = "/org/openbmc/managers/"+manager
69 obj = bus.get_object(bus_name,obj_name)
70 return dbus.Interface(obj,bus_name)
Norman James5d78b4d2015-09-05 13:34:34 -050071
Norman James5d78b4d2015-09-05 13:34:34 -050072
Norman James362a80f2015-09-14 14:04:39 -050073def get_objs(bus,bus_name,path,objects):
Norman James19e45912015-10-04 20:19:41 -050074 tmp_path = path
75 if (path == ""):
76 tmp_path="/"
Norman James91dac392015-10-14 09:38:55 -050077
Norman James19e45912015-10-04 20:19:41 -050078 obj = bus.get_object(bus_name,tmp_path)
Norman James9e6acf92015-09-08 07:00:04 -050079 introspect_iface = dbus.Interface(obj,"org.freedesktop.DBus.Introspectable")
80 tree = ET.ElementTree(ET.fromstring(introspect_iface.Introspect()))
81 root = tree.getroot()
Norman James19e45912015-10-04 20:19:41 -050082 parent = True
Norman James362a80f2015-09-14 14:04:39 -050083 for node in root.iter('node'):
Norman James19e45912015-10-04 20:19:41 -050084 for intf in node.iter('interface'):
85 intf_name = intf.attrib['name']
Norman James19e45912015-10-04 20:19:41 -050086 parts=path.split('/')
87 instance = parts[len(parts)-1]
88 if (objects.has_key(instance) == False):
89 objects[instance] = {}
90 objects[instance]['PATH'] = path
91 objects[instance]['INIT'] = []
92 for method in intf.iter('method'):
93 if (method.attrib['name'] == "init"):
94 objects[instance]['INIT'].append(intf_name)
Norman James362a80f2015-09-14 14:04:39 -050095
Norman James19e45912015-10-04 20:19:41 -050096 if (node.attrib.has_key('name') == True):
Norman James362a80f2015-09-14 14:04:39 -050097 node_name = node.attrib['name']
Norman James19e45912015-10-04 20:19:41 -050098 if (parent == False):
99 get_objs(bus,bus_name,path+"/"+node_name,objects)
100 else:
101 if (node_name != "" and node_name != path):
102 get_objs(bus,bus_name,node_name,objects)
103
104 parent = False
Norman James362a80f2015-09-14 14:04:39 -0500105
Norman Jamesa3e47c42015-10-18 14:43:10 -0500106class DbusProperties(dbus.service.Object):
107 def __init__(self):
108 dbus.service.Object.__init__(self)
109 self.properties = {}
Norman James362a80f2015-09-14 14:04:39 -0500110
Norman Jamesa3e47c42015-10-18 14:43:10 -0500111 @dbus.service.method(dbus.PROPERTIES_IFACE,
112 in_signature='ss', out_signature='v')
113 def Get(self, interface_name, property_name):
114 d = self.GetAll(interface_name)
115 try:
116 v = d[property_name]
117 return v
118 except:
119 raise dbus.exceptions.DBusException(
120 "org.freedesktop.UnknownPropery: "+property_name)
121
122 @dbus.service.method(dbus.PROPERTIES_IFACE,
123 in_signature='s', out_signature='a{sv}')
124 def GetAll(self, interface_name):
125 try:
126 d = self.properties[interface_name]
127 return d
128 except:
129 raise dbus.exceptions.DBusException(
130 "org.freedesktop.UnknownInterface: "+interface_name)
131
132 @dbus.service.method(dbus.PROPERTIES_IFACE,
133 in_signature='ssv')
134 def Set(self, interface_name, property_name, new_value):
135 if (self.properties.has_key(interface_name) == False):
136 self.properties[interface_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 self.PropertiesChanged(interface_name,{ property_name: new_value }, [])
142
143 except:
144 self.properties[interface_name][property_name] = new_value
145
146 @dbus.service.signal(dbus.PROPERTIES_IFACE,
147 signature='sa{sv}as')
148 def PropertiesChanged(self, interface_name, changed_properties,
149 invalidated_properties):
150 pass
151
152
153
154class DbusVariable:
Norman James90baede2015-09-02 20:32:49 -0500155 def __init__(self,name,value):
Norman James90baede2015-09-02 20:32:49 -0500156 self.name = str(name)
157 self.dbusType = str(type(value)).split("'")[1]
Norman James362a80f2015-09-14 14:04:39 -0500158 self.variant_level = 2
Norman James90baede2015-09-02 20:32:49 -0500159 self.value = None
Norman James362a80f2015-09-14 14:04:39 -0500160 if (BASE_TO_DBUS_TYPES.has_key(self.dbusType) == False):
161 self.variant_level = value.variant_level
162 try:
163 self.value = eval(DBUS_TO_BASE_TYPES[self.dbusType]+"(value)")
164 except:
165 raise Exception("Unknown dbus type: "+self.dbusType)
166 else:
167 self.dbusType = BASE_TO_DBUS_TYPES[self.dbusType]
168 self.value = value
Norman James90baede2015-09-02 20:32:49 -0500169
Norman James5d78b4d2015-09-05 13:34:34 -0500170 def setValue(self,value):
Norman James90baede2015-09-02 20:32:49 -0500171 try:
Norman James362a80f2015-09-14 14:04:39 -0500172 self.value = eval(DBUS_TO_BASE_TYPES[self.dbusType]+"(value)")
Norman James90baede2015-09-02 20:32:49 -0500173 except:
174 raise Exception("Unknown dbus type: "+self.dbusType)
175
Norman James5d78b4d2015-09-05 13:34:34 -0500176 def setVariant(self,variant_level):
177 self.variant_level = variant_level
Norman James90baede2015-09-02 20:32:49 -0500178
179 def getName(self):
180 return self.name
Norman James5d78b4d2015-09-05 13:34:34 -0500181
Norman James90baede2015-09-02 20:32:49 -0500182 def getValue(self):
Norman James5d78b4d2015-09-05 13:34:34 -0500183 e = self.dbusType+"(self.value, variant_level="+str(self.variant_level)+")"
Norman James90baede2015-09-02 20:32:49 -0500184 return eval(e)
185
Norman James362a80f2015-09-14 14:04:39 -0500186 def getBaseValue(self):
187 return self.value
Norman James90baede2015-09-02 20:32:49 -0500188
189 def __str__(self):
190 return self.dbusType+":"+str(self.value)