blob: 5a36e9e5d970c8f116197d79a79520eb5a659e14 [file] [log] [blame]
#!/usr/bin/env python
from BaseHTTPServer import BaseHTTPRequestHandler
import urlparse
import dbus
import json
import re
import xml.etree.ElementTree as ET
def parseIntrospection(obj,interface,method=None):
introspect_iface = dbus.Interface(obj,"org.freedesktop.DBus.Introspectable")
tree = ET.ElementTree(ET.fromstring(introspect_iface.Introspect()))
root = tree.getroot()
r = []
for intf in root.iter('interface'):
if (intf.attrib['name'] == interface):
for methd in intf.iter('method'):
if (method == None):
r.append(methd.attrib['name'])
elif (method == methd.attrib['name']):
for arg in methd.iter('arg'):
a = [arg.attrib['name'],arg.attrib['type'],arg.attrib['direction']]
r.append(a)
return r
def getArgFromSignature(args,signature):
if (signature == 'i'):
return int(args[0])
elif (signature == 's'):
return args[0];
raise Exception("Inavlid signature: "+signature)
class GetHandler(BaseHTTPRequestHandler):
def do_GET(self):
url_data = urlparse.urlparse(self.path)
parms = urlparse.parse_qs(url_data.query)
self.objmap = {
'chassis' : ['org.openbmc.ChassisControl','/org/openbmc/ChassisControl','org.openbmc.ChassisControl'],
'flash' : ['org.openbmc.Flash.BIOS','/org/openbmc/Flash/BIOS/0','org.openbmc.Flash'],
'power' : ['org.openbmc.PowerControl','/org/openbmc/PowerControl/0','org.openbmc.PowerControl']
}
self.sensors = {
'/org/openbmc/Sensors/HostStatus/0' : ['org.openbmc.Sensors.HostStatus','org.openbmc.SensorIntegerSettable',0,""],
'/org/openbmc/Sensors/Temperature/Ambient/0': ['org.openbmc.Sensors.Temperature.Ambient','org.openbmc.SensorInteger',0,""]
}
parts = url_data.path.split('/');
item = parts[1]
method = ''
if (len(parts) > 2):
method = parts[2]
code = 403
payload = {'status': 'error'}
bus = dbus.SessionBus()
if (item == 'sensors'):
try:
for s in self.sensors.keys():
obj = bus.get_object(self.sensors[s][0],s)
iface = dbus.Interface(obj,self.sensors[s][1])
self.sensors[s][2] = iface.getValue()
self.sensors[s][3] = iface.getUnits()
payload['status'] = 'ok'
payload['sensors'] = self.sensors
code = 200
except dbus.exceptions.DBusException as e:
payload['error-message'] = e.get_dbus_name()
elif (self.objmap.has_key(item)):
bus_name = self.objmap[item][0]
obj_name = self.objmap[item][1]
interface = self.objmap[item][2]
try:
obj = bus.get_object(bus_name,obj_name)
if (method == ''):
payload['available-methods'] = parseIntrospection(obj,interface)
else:
args = parseIntrospection(obj,interface,method)
arg_array = []
signature_in = ''
signature_out = ''
for a in args:
if (a[2] == 'in'):
if (parms.has_key(a[0]) == False):
raise Exception("Method '"+method+"' requires argument '"+a[0]+"'")
arg_array.append(getArgFromSignature(parms[a[0]],a[1]))
signature_in = signature_in + a[1]
else:
signature_out = a[1]
rtn = bus.call_blocking(bus_name,obj_name,interface,method,signature_in,arg_array)
code = 200
payload['status'] = 'ok'
except dbus.exceptions.DBusException as e:
payload['error-message'] = str(e)
except Exception as ex:
payload['error-message'] = str(ex)
else:
payload['status'] = 'ok'
payload['available-commands'] = self.objmap.keys()
self.send_response(code)
self.send_header('Content-Type', 'application/json')
self.end_headers()
self.wfile.write(json.dumps(payload))
return
if __name__ == '__main__':
from BaseHTTPServer import HTTPServer
server = HTTPServer(('', 3000), GetHandler)
print 'Starting server, use <Ctrl-C> to stop'
server.serve_forever()