# HG changeset patch # User Florian Krupicka # Date 1218387138 -7200 # Node ID f4b16fe11eaf99c2f351ccd6e8eb7b2a775960a1 # Parent 1ec18316ec962ad341d34eb3bbaf5c6730cfe84d Added several checks for availablity/features of flup diff -r 1ec18316ec96 -r f4b16fe11eaf MoinMoin/web/flup_frontend.py --- a/MoinMoin/web/flup_frontend.py Sat Aug 09 20:54:09 2008 +0200 +++ b/MoinMoin/web/flup_frontend.py Sun Aug 10 18:52:18 2008 +0200 @@ -5,88 +5,112 @@ @copyright: 2008 MoinMoin:FlorianKrupicka @license: GNU GPL, see COPYING for details. """ -from MoinMoin.web.frontend import ServerFrontEnd +try: + import flup.server.fcgi + have_flup = True + try: + import flup.server.fcgi_single + have_singlepatch = True + except ImportError: + have_singlepatch = False +except ImportError: + have_flup = False + +from MoinMoin.web.frontend import ServerFrontEnd, FrontEnd, FrontEndNotAvailable from MoinMoin import log logging = log.getLogger(__name__) -class FlupFrontEnd(ServerFrontEnd): - - is_fcgi = False +if have_flup: + class FlupFrontEnd(ServerFrontEnd): + def add_options(self): + super(FlupFrontEnd, self).add_options() + parser = self.parser + parser.add_option("--min-spare", dest="min_spare", type="int", metavar='MIN', + help=("Minimum spare threads/processes (when " + "using threaded or forking servers).")) + parser.add_option("--max-spare", dest="max_spare", type="int", metavar='MAX', + help=("Maximum spare threads/processes (when " + "using threaded or forking servers).")) + parser.add_option("--max-childs", dest="max_childs", type="int", metavar='CHILDS', + help=("Hard upper limit on threads/processes " + "(when using threaded or forking servers).")) + parser.add_option("-t", "--type", dest="server_type", metavar='TYPE', + help=("Type of server to use, e.g. single/threaded" + "/forking. Defaults to 'single' when not " + "bound to a socket and to 'threaded' when it is")) - def add_options(self): - super(FlupFrontEnd, self).add_options() - parser = self.parser - parser.add_option("--min-spare", dest="min_spare", type="int", metavar='MIN', - help=("Minimum spare threads/processes (when " - "using threaded or forking servers).")) - parser.add_option("--max-spare", dest="max_spare", type="int", metavar='MAX', - help=("Maximum spare threads/processes (when " - "using threaded or forking servers).")) - parser.add_option("--max-childs", dest="max_childs", type="int", metavar='CHILDS', - help=("Hard upper limit on threads/processes " - "(when using threaded or forking servers).")) - parser.add_option("-t", "--type", dest="server_type", metavar='TYPE', - help=("Type of server to use, e.g. single/threaded" - "/forking. Defaults to 'single' when not " - "bound to a socket and to 'threaded' when it is")) + def run_server(self, application, options): + server_type = options.server_type - def run_server(self, application, options): - cgi_fallback = False - - server_type = options.server_type + if not server_type: + if 'single' in self.server_types: + server_type = (options.port and 'threaded') or 'single' + else: + server_type = 'threaded' - if not server_type: - server_type = (options.port and 'threaded') or 'single' + if server_type not in self.server_types: + raise TypeError("Unknown server type '%s'" % options.server_type) - if server_type not in self.server_types: - raise ArgumentError("Unknown server type '%s'" % options.server_type) + multi = server_type in ('threaded', 'forking') - multi = server_type in ('threaded', 'forking') - - try: mod = self.server_types[server_type] mod = __import__(mod, fromlist=['WSGIServer']) WSGIServer = mod.WSGIServer - except ImportError: - if self.is_fcgi: - from MoinMoin.web._fallback_cgi import WSGIServer - cgi_fallback = True - - kwargs = {} - - if options.port: - kwargs['bindAddress'] = (options.interface, options.port) - elif options.interface.startswith('/') or \ - options.interface.startswith('./'): - kwargs['bindAddress'] = options.interface - if options.min_spare and multi: - kwargs['minSpare'] = options.min_spare - if options.max_spare and multi: - kwargs['maxSpare'] = options.max_spare - if options.max_childs and multi: - if server_type == 'threaded': - kwargs['maxThreads'] = options.max_childs - else: - kwargs['maxChildren'] = options.max_childs + kwargs = {} - if not cgi_fallback: + if options.port: + kwargs['bindAddress'] = (options.interface, options.port) + elif options.interface.startswith('/') or \ + options.interface.startswith('./'): + kwargs['bindAddress'] = options.interface + + if options.min_spare and multi: + kwargs['minSpare'] = options.min_spare + if options.max_spare and multi: + kwargs['maxSpare'] = options.max_spare + if options.max_childs and multi: + if server_type == 'threaded': + kwargs['maxThreads'] = options.max_childs + else: + kwargs['maxChildren'] = options.max_childs + return WSGIServer(application, **kwargs).run() - else: - logging.warning('Running as CGI fallback.') + + class CGIFrontEnd(FlupFrontEnd): + server_types = {'threaded': 'flup.server.fcgi', + 'forking': 'flup.server.fcgi_fork'} + if have_singlepatch: + server_types['single'] = 'flup.server.fcgi_single' + + class SCGIFrontEnd(FlupFrontEnd): + server_types = {'threaded': 'flup.server.scgi', + 'forking': 'flup.server.scgi_fork'} + + class AJPFrontEnd(FlupFrontEnd): + server_types = {'threaded': 'flup.server.ajp', + 'forking': 'flup.server.ajp_fork'} +else: + class CGIFrontEnd(FrontEnd): + """ Simple WSGI CGI Adapter for fallback if flup is not installed. """ + def __init__(self): + logging.warning("No flup-package installed, only basic CGI " + "support is available.") + super(CGIFrontEnd, self).__init__() + + def run_server(self, application, options): + from MoinMoin.web._fallback_cgi import WSGIServer return WSGIServer(application).run() -class FCGIFrontEnd(FlupFrontEnd): - is_fcgi = True - server_types = {'threaded': 'flup.server.fcgi', - 'forking': 'flup.server.fcgi_fork', - 'single': 'flup.server.fcgi_single'} - -class SCGIFrontEnd(FlupFrontEnd): - server_types = {'threaded': 'flup.server.scgi', - 'forking': 'flup.server.scgi_fork'} - -class AJPFrontEnd(FlupFrontEnd): - server_types = {'threaded': 'flup.server.ajp', - 'forking': 'flup.server.ajp_fork'} + _ERROR = """ +The flup package is not installed on your system. To make use of FCGI, +SCGI or AJP adapters, you have to install it first. The MoinMoin source +distribution provides a flup package in the contrib/flup-server +directory. It is also patched to support non-threaded & non-forking +behaviour. See contrib/flup-server/NOTES.moin for more information. +""" + def SCGIFrontEnd(): + raise FrontEndNotAvailable(_ERROR) + def AJPFrontEnd(): + raise FrontEndNotAvailable(_ERROR) diff -r 1ec18316ec96 -r f4b16fe11eaf MoinMoin/web/frontend.py --- a/MoinMoin/web/frontend.py Sat Aug 09 20:54:09 2008 +0200 +++ b/MoinMoin/web/frontend.py Sun Aug 10 18:52:18 2008 +0200 @@ -56,8 +56,5 @@ "to a unix socket. Default: localhost")) parser.set_default('interface', 'localhost') -class CGIFrontEnd(FrontEnd): - """ Simple WSGI CGI Adapter. """ - def run_server(self, application, options): - from MoinMoin.web._fallback_cgi import WSGIServer - return WSGIServer(application).run() +class FrontEndNotAvailable(Exception): + """ Raised if a frontend is not available for one reason or another. """ diff -r 1ec18316ec96 -r f4b16fe11eaf wiki/server/moin.cgi --- a/wiki/server/moin.cgi Sat Aug 09 20:54:09 2008 +0200 +++ b/wiki/server/moin.cgi Sun Aug 10 18:52:18 2008 +0200 @@ -31,5 +31,5 @@ #from MoinMoin import log #log.load_config('/path/to/logging_configuration_file') -from MoinMoin.web.flup_frontend import FCGIFrontEnd -FCGIFrontEnd().run() +from MoinMoin.web.flup_frontend import CGIFrontEnd +CGIFrontEnd().run()