Mercurial > p > roundup > code
comparison roundup/scripts/roundup_server.py @ 3278:ca122bc16277 maint-0.8
merge from HEAD
| author | Richard Jones <richard@users.sourceforge.net> |
|---|---|
| date | Wed, 13 Apr 2005 06:11:15 +0000 |
| parents | 07f68dfab2c2 |
| children | 4fe232899be8 |
comparison
equal
deleted
inserted
replaced
| 3275:72adcd3c747b | 3278:ca122bc16277 |
|---|---|
| 15 # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. | 15 # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. |
| 16 # | 16 # |
| 17 | 17 |
| 18 """Command-line script that runs a server over roundup.cgi.client. | 18 """Command-line script that runs a server over roundup.cgi.client. |
| 19 | 19 |
| 20 $Id: roundup_server.py,v 1.74.2.3 2005-02-19 10:14:16 a1s Exp $ | 20 $Id: roundup_server.py,v 1.74.2.4 2005-04-13 06:11:15 richard Exp $ |
| 21 """ | 21 """ |
| 22 __docformat__ = 'restructuredtext' | 22 __docformat__ = 'restructuredtext' |
| 23 | 23 |
| 24 import errno, cgi, getopt, os, socket, sys, traceback, urllib | 24 import errno, cgi, getopt, os, socket, sys, traceback, urllib, time |
| 25 import ConfigParser, BaseHTTPServer, SocketServer, StringIO | 25 import ConfigParser, BaseHTTPServer, SocketServer, StringIO |
| 26 | 26 |
| 27 # python version check | 27 # python version check |
| 28 from roundup import configuration, version_check | 28 from roundup import configuration, version_check |
| 29 from roundup import __version__ as roundup_version | 29 from roundup import __version__ as roundup_version |
| 68 | 68 |
| 69 class RoundupRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): | 69 class RoundupRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): |
| 70 TRACKER_HOMES = {} | 70 TRACKER_HOMES = {} |
| 71 TRACKERS = None | 71 TRACKERS = None |
| 72 LOG_IPADDRESS = 1 | 72 LOG_IPADDRESS = 1 |
| 73 DEBUG_MODE = False | |
| 73 | 74 |
| 74 def get_tracker(self, name): | 75 def get_tracker(self, name): |
| 75 """Return a tracker instance for given tracker name""" | 76 """Return a tracker instance for given tracker name""" |
| 76 # Note: try/except KeyError works faster that has_key() check | 77 # Note: try/except KeyError works faster that has_key() check |
| 77 # if the key is usually found in the dictionary | 78 # if the key is usually found in the dictionary |
| 114 # it'd be nice to be able to detect if these are going to have | 115 # it'd be nice to be able to detect if these are going to have |
| 115 # any effect... | 116 # any effect... |
| 116 self.send_response(400) | 117 self.send_response(400) |
| 117 self.send_header('Content-Type', 'text/html') | 118 self.send_header('Content-Type', 'text/html') |
| 118 self.end_headers() | 119 self.end_headers() |
| 119 try: | 120 if self.DEBUG_MODE: |
| 120 reload(cgitb) | 121 try: |
| 122 reload(cgitb) | |
| 123 self.wfile.write(cgitb.breaker()) | |
| 124 self.wfile.write(cgitb.html()) | |
| 125 except: | |
| 126 s = StringIO.StringIO() | |
| 127 traceback.print_exc(None, s) | |
| 128 self.wfile.write("<pre>") | |
| 129 self.wfile.write(cgi.escape(s.getvalue())) | |
| 130 self.wfile.write("</pre>\n") | |
| 131 else: | |
| 132 # user feedback | |
| 121 self.wfile.write(cgitb.breaker()) | 133 self.wfile.write(cgitb.breaker()) |
| 122 self.wfile.write(cgitb.html()) | 134 ts = time.ctime() |
| 123 except: | 135 self.wfile.write('''<p>%s: An error occurred. Please check |
| 124 s = StringIO.StringIO() | 136 the server log for more infomation.</p>'''%ts) |
| 125 traceback.print_exc(None, s) | 137 # out to the logfile |
| 126 self.wfile.write("<pre>") | 138 print 'EXCEPTION AT', ts |
| 127 self.wfile.write(cgi.escape(s.getvalue())) | 139 traceback.print_exc() |
| 128 self.wfile.write("</pre>\n") | |
| 129 sys.stdin = save_stdin | 140 sys.stdin = save_stdin |
| 130 | 141 |
| 131 do_GET = do_POST = do_HEAD = run_cgi | 142 do_GET = do_POST = do_HEAD = run_cgi |
| 132 | 143 |
| 133 def index(self): | 144 def index(self): |
| 403 | 414 |
| 404 def get_server(self): | 415 def get_server(self): |
| 405 """Return HTTP server object to run""" | 416 """Return HTTP server object to run""" |
| 406 # we don't want the cgi module interpreting the command-line args ;) | 417 # we don't want the cgi module interpreting the command-line args ;) |
| 407 sys.argv = sys.argv[:1] | 418 sys.argv = sys.argv[:1] |
| 419 | |
| 408 # preload all trackers unless we are in "debug" mode | 420 # preload all trackers unless we are in "debug" mode |
| 409 tracker_homes = self.trackers() | 421 tracker_homes = self.trackers() |
| 410 if self["MULTIPROCESS"] == "debug": | 422 if self["MULTIPROCESS"] == "debug": |
| 411 trackers = None | 423 trackers = None |
| 412 else: | 424 else: |
| 413 trackers = dict([(name, roundup.instance.open(home, optimize=1)) | 425 trackers = dict([(name, roundup.instance.open(home, optimize=1)) |
| 414 for (name, home) in tracker_homes]) | 426 for (name, home) in tracker_homes]) |
| 427 | |
| 415 # build customized request handler class | 428 # build customized request handler class |
| 416 class RequestHandler(RoundupRequestHandler): | 429 class RequestHandler(RoundupRequestHandler): |
| 417 LOG_IPADDRESS = not self["LOG_HOSTNAMES"] | 430 LOG_IPADDRESS = not self["LOG_HOSTNAMES"] |
| 418 TRACKER_HOMES = dict(tracker_homes) | 431 TRACKER_HOMES = dict(tracker_homes) |
| 419 TRACKERS = trackers | 432 TRACKERS = trackers |
| 433 DEBUG_MODE = self["MULTIPROCESS"] == "debug" | |
| 434 | |
| 420 # obtain request server class | 435 # obtain request server class |
| 421 if self["MULTIPROCESS"] not in MULTIPROCESS_TYPES: | 436 if self["MULTIPROCESS"] not in MULTIPROCESS_TYPES: |
| 422 print _("Multiprocess mode \"%s\" is not available, " | 437 print _("Multiprocess mode \"%s\" is not available, " |
| 423 "switching to single-process") % self["MULTIPROCESS"] | 438 "switching to single-process") % self["MULTIPROCESS"] |
| 424 self["MULTIPROCESS"] = "none" | 439 self["MULTIPROCESS"] = "none" |
