Package iceprod :: Package server :: Module rpc
[hide private]
[frames] | no frames]

Source Code for Module iceprod.server.rpc

  1  import socket, os 
  2  import time 
  3  import SocketServer 
  4  import BaseHTTPServer 
  5  import SimpleHTTPServer 
  6  from SocketServer import ThreadingMixIn 
  7  import SimpleXMLRPCServer 
  8  import logging 
  9   
 10  logger = logging.getLogger('rpc') 
 11  _startuptime=time.asctime() 
 12   
13 -class SecureXMLRpcRequestHandler(SimpleXMLRPCServer.SimpleXMLRPCRequestHandler):
14 """Secure XML-RPC request handler class. 15 16 It it very similar to SimpleXMLRPCRequestHandler but it uses HTTPS for 17 transporting XML data. 18 """
19 - def setup(self):
20 self.connection = self.request 21 self.rfile = socket._fileobject(self.request, "rb", self.rbufsize) 22 self.wfile = socket._fileobject(self.request, "wb", self.wbufsize)
23
24 - def do_GET(self):
25 """Handles the HTTPS GET request. 26 only allow a request for the crossdomain file 27 this can be changed to support GETs of any file if needed 28 """ 29 global _startuptime 30 msg = "<head><title>IceProd</title></head>" 31 msg += "<body>" 32 msg += "<center><h1>IceProd Interface</h1></center>" 33 msg += "<center><h3>running on %s</h3></center>" % os.uname()[1] 34 msg += "<center><h3>up since %s</h3></center>" % _startuptime 35 msg += "<center>" 36 msg += "<table>" 37 try: 38 import iceprod 39 msg += "<tr><td>iceprod</td><td>%s</td></tr>" % iceprod.__version__ 40 except: pass 41 try: 42 import iceprod.server 43 msg += "<tr><td>iceprod.server</td><td>%s</td></tr>" % iceprod.server.__version__ 44 except: pass 45 try: 46 import iceprod.client 47 msg += "<tr><td>iceprod.client</td><td>%s</td></tr>" % iceprod.client.__version__ 48 except: pass 49 try: 50 import iceprod.modules 51 msg += "<tr><td>iceprod.client</td><td>%s</td></tr>" % iceprod.modules.__version__ 52 except: pass 53 msg += "</table>" 54 msg += "</center>" 55 msg += "<center>" 56 msg += "<image size=50 src=http://internal.icecube.wisc.edu/images/logo.png>" 57 msg += "</center>" 58 msg += "</body>" 59 60 #write the data to the socket along with valid HTTP headers 61 res = 'HTTP/1.0 200 OK\r\nDate: %s\r\n\r\n%s' % (self.date_time_string(),msg) 62 self.wfile.write(res) 63 self.log_request(200)
64
65 - def do_POST(self):
66 """Handles the HTTPS POST request. 67 68 It was copied out from SimpleXMLRPCServer.py and modified to shutdown 69 the socket cleanly. 70 """ 71 72 try: 73 # get arguments 74 data = self.rfile.read(int(self.headers["content-length"])) 75 # In previous versions of SimpleXMLRPCServer, _dispatch 76 # could be overridden in this class, instead of in 77 # SimpleXMLRPCDispatcher. To maintain backwards compatibility, 78 # check to see if a subclass implements _dispatch and dispatch 79 # using that method if present. 80 response = self.server._marshaled_dispatch( 81 data, getattr(self, '_dispatch', None) 82 ) 83 except: # This should only happen if the module is buggy 84 # internal error, report as HTTP server error 85 self.send_response(500) 86 self.end_headers() 87 else: 88 # got a valid XML RPC response 89 self.send_response(200) 90 self.send_header("Content-type", "text/xml") 91 self.send_header("Content-length", str(len(response))) 92 self.end_headers() 93 self.wfile.write(response) 94 95 # shut down the connection 96 self.wfile.flush() 97 self.connection.shutdown() # Modified here!
98
99 - def log_message(self, format, *args):
100 logger.debug("%s - - [%s] %s\n" % 101 (self.address_string(), 102 self.log_date_time_string(), 103 format%args))
104 105 106
107 -class SecureXMLRPCServer(BaseHTTPServer.HTTPServer,SimpleXMLRPCServer.SimpleXMLRPCDispatcher):
108 - def __init__(self, server_address=("localhost",8000), 109 HandlerClass=SecureXMLRpcRequestHandler, 110 logRequests=True,ssl_context = None):
111 """ 112 Secure Threaded XML-RPC server. 113 It it very similar to ThreadedXMLRPCServer but it uses HTTPS for 114 transporting XML data. 115 """ 116 from OpenSSL import SSL 117 118 if not ssl_context: 119 raise Exception, "you need to pass an SSL context" 120 121 self.logRequests = logRequests 122 try: 123 SimpleXMLRPCServer.SimpleXMLRPCDispatcher.__init__(self) 124 except TypeError: 125 # An exception is raised in Python 2.5 as the prototype of the __init__ 126 # method has changed and now has 3 arguments (self, allow_none, encoding) 127 # 128 SimpleXMLRPCServer.SimpleXMLRPCDispatcher.__init__(self, False, None) 129 130 131 SocketServer.BaseServer.__init__(self, server_address, HandlerClass) 132 133 self.socket = SSL.Connection(ssl_context, socket.socket(self.address_family, self.socket_type)) 134 self.server_bind() 135 self.server_activate()
136
137 -class MyXMLRpcRequestHandler(SimpleXMLRPCServer.SimpleXMLRPCRequestHandler):
138 - def log_message(self, format, *args):
139 logger.debug("%s - - [%s] %s\n" % 140 (self.address_string(), 141 self.log_date_time_string(), 142 format%args))
143 144
145 -class MySimpleXMLRPCServer(SimpleXMLRPCServer.SimpleXMLRPCServer):
146 - def __init__(self, 147 addr=("localhost",8000), 148 HandlerClass=MyXMLRpcRequestHandler, 149 logRequests=True):
150 """ 151 Secure Threaded XML-RPC server. 152 It it very similar to ThreadedXMLRPCServer but it uses HTTPS for 153 transporting XML data. 154 """ 155 self.logRequests = logRequests 156 SimpleXMLRPCServer.SimpleXMLRPCServer.__init__(self, addr, HandlerClass, logRequests)
157 158
159 -class ThreadedXMLRPCServer(ThreadingMixIn,MySimpleXMLRPCServer):
160 """"My Threaded XMLRPC Server"""
161
162 -class ThreadedSecureXMLRPCServer(ThreadingMixIn,SecureXMLRPCServer):
163 """"My Secure Threaded XMLRPC Server"""
164 165
166 -class MyCGIXMLRPCRequestHandler(SimpleXMLRPCServer.CGIXMLRPCRequestHandler):
167 - def __init__(self):
168 SimpleXMLRPCServer.CGIXMLRPCRequestHandler.__init__(self)
169 170
171 - def handle_get(self):
172 """Handles the HTTPS GET request. 173 only allow a request for the crossdomain file 174 this can be changed to support GETs of any file if needed 175 """ 176 global _startuptime 177 msg = "<head><title>IceProd</title></head>" 178 msg += "<body>" 179 msg += "<center><h1>IceProd Interface</h1></center>" 180 msg += "<center><h3>running on %s</h3></center>" % os.uname()[1] 181 msg += "<center><h3>up since %s</h3></center>" % _startuptime 182 msg += "<center>" 183 msg += "<table>" 184 try: 185 import iceprod 186 msg += "<tr><td>iceprod</td><td>%s</td></tr>" % iceprod.__version__ 187 except: pass 188 try: 189 import iceprod.server 190 msg += "<tr><td>iceprod.server</td><td>%s</td></tr>" % iceprod.server.__version__ 191 except: pass 192 try: 193 import iceprod.client 194 msg += "<tr><td>iceprod.client</td><td>%s</td></tr>" % iceprod.client.__version__ 195 except: pass 196 try: 197 import iceprod.modules 198 msg += "<tr><td>iceprod.client</td><td>%s</td></tr>" % iceprod.modules.__version__ 199 except: pass 200 msg += "</table>" 201 msg += "</center>" 202 msg += "<center>" 203 msg += "<image size=50 src=http://internal.icecube.wisc.edu/images/logo.png>" 204 msg += "</center>" 205 msg += "</body>" 206 207 print "Content-Type: text/html\n\n" 208 print msg
209