| #!/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() | 
 |  |