3 # Standalone WSGI PLCAPI Server
5 # Tony Mack <tmack@cs.princeton.edu>
6 # Copyright (C) 2006 The Trustees of Princeton University
12 from optparse import OptionParser
13 from gevent import pywsgi
14 # Append PLC to the system path
15 sys.path.append(os.path.dirname(os.path.realpath(sys.argv[0])))
16 #from PLC.API import PLCAPI
21 def __init__(self, api=None):
24 def __call__(self, *args, **kwds):
25 return self.handle(*args, **kwds)
27 def handle(self, env, start_response):
28 if env['REQUEST_METHOD'] == 'POST':
29 return self.do_post(env, start_response)
31 return self.do_get(env, start_response)
33 def do_get(self, env, start_response):
36 <title>PLCAPI Nova XML-RPC/SOAP Interface</title>
38 <h1>PLCAPI XML-RPC/SOAP Interface</h1>
39 <p>Please use XML-RPC or SOAP to access the PLCAPI.</p>
43 headers = [('Content-Type', 'text/html')]
44 start_response(status, headers)
47 def do_post(self, env, start_response):
49 request_size = int(environ.get('CONTENT_LENGTH', 0))
52 request = environ['wsgi.input'].read(request_size)
53 client_address = environ['REMOTE_ADDR']
56 response = self.api.handle(client_address, request)
58 headers = [('Content-Type', 'text/html')]
60 response = "'<h1>Internal Server Error</h1>"
61 status = '500 Internal Server Error'
62 headers = [('Content-Type', 'text/html')]
64 start_response(status, headers)
71 config = '/etc/planetlab/plc_config'
77 parser = OptionParser()
78 parser.add_option('-p', '--port', dest='port', metavar='<port>', help='TCP port number to listen on')
79 parser.add_option('-f', '--config', dest='config', metavar='<config>', help='PLCAPI configuration file')
83 (options, args) = parser.parse_args()
85 print "Usage: %s [OPTION]..." % sys.argv[0]
87 print " -p PORT, --port=PORT TCP port number to listen on (default: %d)" % port
88 print " -f FILE, --config=FILE PLC configuration file (default: %s)" % config
89 print " -h, --help This message"
93 config = Config(options.config)
95 keyfile = config.ssl_key_file
96 certfile = config.ssl_cert_file
100 port = int(options.port)
103 if keyfile and certfile:
104 server = pywsgi.WSGIServer((addr, port), App(), keyfile=keyfile, certfile=certfile)
106 server = pywsgi.WSGIServer((addr, port), App())
108 server.serve_forever()