Commit 953c1ee6 authored by Lennart Regebro's avatar Lennart Regebro

Twisted support.

parent 7abca36a
...@@ -20,12 +20,11 @@ import sys ...@@ -20,12 +20,11 @@ import sys
import socket import socket
from re import compile from re import compile
from socket import gethostbyaddr from socket import gethostbyaddr
import twisted.internet.reactor
import ZConfig import ZConfig
from ZConfig.components.logger import loghandler from ZConfig.components.logger import loghandler
logger = logging.getLogger("Zope") logger = logging.getLogger("Zope")
started = False started = False
...@@ -96,7 +95,10 @@ class ZopeStarter: ...@@ -96,7 +95,10 @@ class ZopeStarter:
self.makePidFile() self.makePidFile()
self.setupInterpreter() self.setupInterpreter()
self.startZope() self.startZope()
self.registerSignals() from App.config import getConfiguration
config = getConfiguration()
if not config.twisted_servers:
self.registerSignals()
# emit a "ready" message in order to prevent the kinds of emails # emit a "ready" message in order to prevent the kinds of emails
# to the Zope maillist in which people claim that Zope has "frozen" # to the Zope maillist in which people claim that Zope has "frozen"
# after it has emitted ZServer messages. # after it has emitted ZServer messages.
...@@ -106,10 +108,15 @@ class ZopeStarter: ...@@ -106,10 +108,15 @@ class ZopeStarter:
def run(self): def run(self):
# the mainloop. # the mainloop.
try: try:
import ZServer from App.config import getConfiguration
import Lifetime config = getConfiguration()
Lifetime.loop() if config.twisted_servers:
sys.exit(ZServer.exit_code) twisted.internet.reactor.run()
else:
import ZServer
import Lifetime
Lifetime.loop()
sys.exit(ZServer.exit_code)
finally: finally:
self.shutdown() self.shutdown()
......
import os import os
import sys import sys
import time
import logging
from re import compile from re import compile
from socket import gethostbyaddr from socket import gethostbyaddr
import twisted.internet
from twisted.application.service import MultiService
import zope.app.appsetup.interfaces
import zope.app.twisted.main
# top-level key handlers # top-level key handlers
...@@ -133,7 +140,7 @@ def catalog_getObject_raises(value): ...@@ -133,7 +140,7 @@ def catalog_getObject_raises(value):
"'catalog-getObject-raises' option will be removed in Zope 2.10:\n", "'catalog-getObject-raises' option will be removed in Zope 2.10:\n",
DeprecationWarning) DeprecationWarning)
from Products.ZCatalog import CatalogBrains from Products.ZCatalog import CatalogBrains
CatalogBrains.GETOBJECT_RAISES = bool(value) CatalogBrains.GETOBJECT_RAISES = bool(value)
return value return value
...@@ -143,7 +150,8 @@ def catalog_getObject_raises(value): ...@@ -143,7 +150,8 @@ def catalog_getObject_raises(value):
def root_handler(config): def root_handler(config):
""" Mutate the configuration with defaults and perform """ Mutate the configuration with defaults and perform
fixups of values that require knowledge about configuration fixups of values that require knowledge about configuration
values outside of their context. """ values outside of their context.
"""
# Set environment variables # Set environment variables
for k,v in config.environment.items(): for k,v in config.environment.items():
...@@ -165,7 +173,7 @@ def root_handler(config): ...@@ -165,7 +173,7 @@ def root_handler(config):
instanceprod = os.path.join(config.instancehome, 'Products') instanceprod = os.path.join(config.instancehome, 'Products')
if instanceprod not in config.products: if instanceprod not in config.products:
config.products.append(instanceprod) config.products.append(instanceprod)
import Products import Products
L = [] L = []
for d in config.products + Products.__path__: for d in config.products + Products.__path__:
...@@ -190,6 +198,23 @@ def root_handler(config): ...@@ -190,6 +198,23 @@ def root_handler(config):
config.cgi_environment, config.cgi_environment,
config.port_base) config.port_base)
if not config.twisted_servers:
config.twisted_servers = []
else:
# Set number of threads (reuse zserver_threads variable)
twisted.internet.reactor.suggestThreadPoolSize(config.zserver_threads)
# Create a root service
rootService = MultiService()
for server in config.twisted_servers:
service = server.create(None)
service.setServiceParent(rootService)
rootService.startService()
twisted.internet.reactor.addSystemEventTrigger(
'before', 'shutdown', rootService.stopService)
# set up trusted proxies # set up trusted proxies
if config.trusted_proxies: if config.trusted_proxies:
import ZPublisher.HTTPRequest import ZPublisher.HTTPRequest
...@@ -217,3 +242,29 @@ def _name2Ips(host, isIp_=compile(r'(\d+\.){3}').match): ...@@ -217,3 +242,29 @@ def _name2Ips(host, isIp_=compile(r'(\d+\.){3}').match):
if isIp_(host): return [host] if isIp_(host): return [host]
return gethostbyaddr(host)[2] return gethostbyaddr(host)[2]
# XXX Need to find a better place for this.
import twisted.web2.wsgi
import twisted.web2.server
import twisted.web2.log
try:
from twisted.web2.http import HTTPFactory
except ImportError:
from twisted.web2.channel.http import HTTPFactory
from zope.component import provideUtility
from zope.app.twisted.server import ServerType, SSLServerType
from zope.app.twisted.interfaces import IServerType
from ZPublisher.WSGIPublisher import publish_module
def createHTTPFactory(ignored):
resource = twisted.web2.wsgi.WSGIResource(
publish_module)
resource = twisted.web2.log.LogWrapperResource(resource)
return HTTPFactory(twisted.web2.server.Site(resource))
http = ServerType(createHTTPFactory, 8080)
provideUtility(http, IServerType, 'Zope2-HTTP')
...@@ -11,6 +11,12 @@ ...@@ -11,6 +11,12 @@
<import package="tempstorage"/> <import package="tempstorage"/>
<import package="Zope2.Startup" file="warnfilter.xml"/> <import package="Zope2.Startup" file="warnfilter.xml"/>
<sectiontype name="server" datatype="zope.app.twisted.server.ServerFactory">
<key name="type" required="yes" />
<key name="address" datatype="inet-address" />
<key name="backlog" datatype="integer" default="50" />
</sectiontype>
<sectiontype name="logger" datatype=".LoggerFactory"> <sectiontype name="logger" datatype=".LoggerFactory">
<description> <description>
This "logger" type only applies to access and request ("trace") This "logger" type only applies to access and request ("trace")
...@@ -805,7 +811,9 @@ ...@@ -805,7 +811,9 @@
<metadefault>on</metadefault> <metadefault>on</metadefault>
</key> </key>
<multisection type="server" name="*" attribute="twisted_servers" />
<multisection type="ZServer.server" name="*" attribute="servers"/> <multisection type="ZServer.server" name="*" attribute="servers"/>
<key name="port-base" datatype="integer" default="0"> <key name="port-base" datatype="integer" default="0">
<description> <description>
Base port number that gets added to the specific port numbers Base port number that gets added to the specific port numbers
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment