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
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 """
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
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
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
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
74 data = self.rfile.read(int(self.headers["content-length"]))
75
76
77
78
79
80 response = self.server._marshaled_dispatch(
81 data, getattr(self, '_dispatch', None)
82 )
83 except:
84
85 self.send_response(500)
86 self.end_headers()
87 else:
88
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
96 self.wfile.flush()
97 self.connection.shutdown()
98
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):
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
126
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
139 logger.debug("%s - - [%s] %s\n" %
140 (self.address_string(),
141 self.log_date_time_string(),
142 format%args))
143
144
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
160 """"My Threaded XMLRPC Server"""
161
163 """"My Secure Threaded XMLRPC Server"""
164
165
168 SimpleXMLRPCServer.CGIXMLRPCRequestHandler.__init__(self)
169
170
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