Merge from trunk
[plcapi.git] / trunk / Server.py
diff --git a/trunk/Server.py b/trunk/Server.py
new file mode 100755 (executable)
index 0000000..40a68ab
--- /dev/null
@@ -0,0 +1,105 @@
+#!/usr/bin/python
+#
+# Simple standalone HTTP server for testing PLCAPI
+#
+# Mark Huang <mlhuang@cs.princeton.edu>
+# Copyright (C) 2006 The Trustees of Princeton University
+#
+# $Id$
+#
+
+import os
+import sys
+import getopt
+import traceback
+import BaseHTTPServer
+
+# Append PLC to the system path
+sys.path.append(os.path.dirname(os.path.realpath(sys.argv[0])))
+
+from PLC.API import PLCAPI
+
+class PLCAPIRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
+    """
+    Simple standalone HTTP request handler for testing PLCAPI.
+    """
+
+    def do_POST(self):
+        try:
+            # Read request
+            request = self.rfile.read(int(self.headers["Content-length"]))
+
+            # Handle request
+            response = self.server.api.handle(self.client_address, request)
+
+            # Write response
+            self.send_response(200)
+            self.send_header("Content-type", "text/xml")
+            self.send_header("Content-length", str(len(response)))
+            self.end_headers()
+            self.wfile.write(response)
+
+            self.wfile.flush()
+            self.connection.shutdown(1)
+
+        except Exception, e:
+            # Log error
+            sys.stderr.write(traceback.format_exc())
+            sys.stderr.flush()
+
+    def do_GET(self):
+        self.send_response(200)
+        self.send_header("Content-type", 'text/html')
+        self.end_headers()
+        self.wfile.write("""
+<html><head>
+<title>PLCAPI XML-RPC/SOAP Interface</title>
+</head><body>
+<h1>PLCAPI XML-RPC/SOAP Interface</h1>
+<p>Please use XML-RPC or SOAP to access the PLCAPI.</p>
+</body></html>
+""")        
+        
+class PLCAPIServer(BaseHTTPServer.HTTPServer):
+    """
+    Simple standalone HTTP server for testing PLCAPI.
+    """
+
+    def __init__(self, addr, config):
+        self.api = PLCAPI(config)
+        self.allow_reuse_address = 1
+        BaseHTTPServer.HTTPServer.__init__(self, addr, PLCAPIRequestHandler)
+
+# Defaults
+addr = "0.0.0.0"
+port = 8000
+config = "/etc/planetlab/plc_config"
+
+def usage():
+    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)
+
+# Get options
+try:
+    (opts, argv) = getopt.getopt(sys.argv[1:], "p:f:h", ["port=", "config=", "help"])
+except getopt.GetoptError, err:
+    print "Error: " + err.msg
+    usage()
+
+for (opt, optval) in opts:
+    if opt == "-p" or opt == "--port":
+        try:
+            port = int(optval)
+        except ValueError:
+            usage()
+    elif opt == "-f" or opt == "--config":
+        config = optval
+    elif opt == "-h" or opt == "--help":
+        usage()
+
+# Start server
+PLCAPIServer((addr, port), config).serve_forever()