#!/usr/bin/python # # Standalone WSGI PLCAPI Server # # Tony Mack # Copyright (C) 2006 The Trustees of Princeton University # import os import sys import traceback from optparse import OptionParser from gevent import pywsgi # Append PLC to the system path sys.path.append(os.path.dirname(os.path.realpath(sys.argv[0]))) from PLC.API import PLCAPI from PLC.Config import Config from PLC.Logger import logger class App: def __init__(self, api=None): if not api: api = PLCAPI() self.api = api def __call__(self, *args, **kwds): return self.handle(*args, **kwds) def handle(self, env, start_response): if env['REQUEST_METHOD'] == 'POST': return self.do_post(env, start_response) else: return self.do_get(env, start_response) def do_get(self, env, start_response): response = """ PLCAPI Nova XML-RPC/SOAP Interface

PLCAPI XML-RPC/SOAP Interface

Please use XML-RPC or SOAP to access the PLCAPI.

""" status = '200 OK' headers = [('Content-Type', 'text/html')] start_response(status, headers) return [response] def do_post(self, env, start_response): try: request_size = int(env.get('CONTENT_LENGTH', 0)) except (ValueError): request_size = 0 request = env['wsgi.input'].read(request_size) client_address = env['REMOTE_ADDR'] try: response = self.api.handle(client_address, request) status = '200 OK' headers = [('Content-Type', 'text/html')] except: response = "'

Internal Server Error

" status = '500 Internal Server Error' headers = [('Content-Type', 'text/html')] logger.log_exc(status) start_response(status, headers) return [response] # Defaults addr = "0.0.0.0" port = 8000 config_file = '/etc/planetlab/plcapi_config' keyfile=None certfile=None # Get options parser = OptionParser() parser.add_option('-p', '--port', dest='port', metavar='', help='TCP port number to listen on') parser.add_option('-f', '--config', dest='config', metavar='', help='PLCAPI configuration file') options = None args = None try: (options, args) = parser.parse_args() except: print "Usage: %s [OPTION]..." % sys.argv[0] print "Options:" print " -p PORT, --port=PORT TCP port number to listen on (default: %d)" % port print " -f FILE, --config=FILE PLC configuration file (default: %s)" % config print " -h, --help This message" sys.exit(1) if options.config: config = Config(options.config) addr = config.api_host keyfile = config.api_ssl_key certfile = config.api_ssl_cert if options.port: port = int(options.port) if keyfile and certfile: server = pywsgi.WSGIServer((addr, port), App(), keyfile=keyfile, certfile=certfile) else: server = pywsgi.WSGIServer((addr, port), App()) server.serve_forever()