changeset 4289:f4b16fe11eaf

Added several checks for availablity/features of flup
author Florian Krupicka <florian.krupicka@googlemail.com>
date Sun, 10 Aug 2008 18:52:18 +0200
parents 1ec18316ec96
children 1156a3270246
files MoinMoin/web/flup_frontend.py MoinMoin/web/frontend.py wiki/server/moin.cgi
diffstat 3 files changed, 96 insertions(+), 75 deletions(-) [+]
line wrap: on
line diff
--- 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)
--- 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. """
--- 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()