From 94f50fcf33de43a8f131689b97a9d4216509de3e Mon Sep 17 00:00:00 2001 From: Griatch Date: Thu, 23 May 2013 00:02:25 +0200 Subject: [PATCH] Moved webserver to Server and set up the webclient to work as a stand-alone program on the Portal side. The website link to the webclient is currently pointing to the wrong process, some way to direct that transparently to the Portal-side is needed. --- src/server/portal/portal.py | 47 ++++++++++++++----------------------- src/server/server.py | 38 +++++++++++++++++++++++++++++- src/web/news/urls.py | 4 ++-- src/web/urls.py | 10 ++++---- src/web/webclient/urls.py | 4 ++-- src/web/webclient/views.py | 14 +++++++---- src/web/website/urls.py | 6 ++--- 7 files changed, 77 insertions(+), 46 deletions(-) diff --git a/src/server/portal/portal.py b/src/server/portal/portal.py index ca6bbc4d77..6f71d6832b 100644 --- a/src/server/portal/portal.py +++ b/src/server/portal/portal.py @@ -16,7 +16,7 @@ if os.name == 'nt': from twisted.application import internet, service from twisted.internet import protocol, reactor -from twisted.web import server, static +from twisted.web import server from django.conf import settings from src.utils.utils import get_evennia_version, mod_import, make_iter from src.server.portal.portalsessionhandler import PORTAL_SESSIONS @@ -240,29 +240,9 @@ if SSH_ENABLED: if WEBSERVER_ENABLED: - # Start a django-compatible webserver. + # Start a reverse proxy to relay data to the Server-side webserver - from twisted.python import threadpool - from src.server.webserver import DjangoWebRoot, WSGIWebServer - - # start a thread pool and define the root url (/) as a wsgi resource - # recognized by Django - threads = threadpool.ThreadPool() - web_root = DjangoWebRoot(threads) - # point our media resources to url /media - web_root.putChild("media", static.File(settings.MEDIA_ROOT)) - - webclientstr = "" - if WEBCLIENT_ENABLED: - # create ajax client processes at /webclientdata - from src.server.portal.webclient import WebClient - webclient = WebClient() - webclient.sessionhandler = PORTAL_SESSIONS - web_root.putChild("webclientdata", webclient) - - webclientstr = "/client" - - web_site = server.Site(web_root, logPath=settings.HTTP_LOG_FILE) + from twisted.web import proxy for interface in WEBSERVER_INTERFACES: if ":" in interface: @@ -273,12 +253,22 @@ if WEBSERVER_ENABLED: ifacestr = "-%s" % interface for port in WEBSERVER_PORTS: pstring = "%s:%s" % (ifacestr, port) - # create the webserver - webserver = WSGIWebServer(threads, port, web_site, interface=interface) - webserver.setName('EvenniaWebServer%s' % pstring) - PORTAL.services.addService(webserver) + web_root = proxy.ReverseProxyResource("localhost", port, '') - print " webserver%s%s: %s" % (webclientstr, ifacestr, port) + webclientstr = "" + if WEBCLIENT_ENABLED: + # create ajax client processes at /webclientdata + from src.server.portal.webclient import WebClient + webclient = WebClient() + webclient.sessionhandler = PORTAL_SESSIONS + web_root.putChild("webclientdata", webclient) + webclientstr = "/client" + + web_root = server.Site(web_root, logPath=settings.HTTP_LOG_FILE) + proxy_service = internet.TCPServer(port+1, web_root) + proxy_service.setName('EvenniaWebProxy%s' % pstring) + PORTAL.services.addService(proxy_service) + print " webproxy%s%s: %s" % (webclientstr, ifacestr, port+1) for plugin_module in PORTAL_SERVICES_PLUGIN_MODULES: # external plugin services to start @@ -286,7 +276,6 @@ for plugin_module in PORTAL_SERVICES_PLUGIN_MODULES: print '-' * 50 # end of terminal output - if os.name == 'nt': # Windows only: Set PID file manually f = open(os.path.join(settings.GAME_DIR, 'portal.pid'), 'w') diff --git a/src/server/server.py b/src/server/server.py index f25de51fb6..8836f1a0f0 100644 --- a/src/server/server.py +++ b/src/server/server.py @@ -14,7 +14,7 @@ if os.name == 'nt': # For Windows batchfile we need an extra path insertion here. sys.path.insert(0, os.path.dirname(os.path.dirname( os.path.dirname(os.path.abspath(__file__))))) - +from twisted.web import server, static from twisted.application import internet, service from twisted.internet import reactor, defer import django @@ -57,10 +57,15 @@ AMP_HOST = settings.AMP_HOST AMP_PORT = settings.AMP_PORT AMP_INTERFACE = settings.AMP_INTERFACE +WEBSERVER_PORTS = settings.WEBSERVER_PORTS +WEBSERVER_INTERFACES = settings.WEBSERVER_INTERFACES + # server-channel mappings +WEBSERVER_ENABLED = settings.WEBSERVER_ENABLED and WEBSERVER_PORTS and WEBSERVER_INTERFACES IMC2_ENABLED = settings.IMC2_ENABLED IRC_ENABLED = settings.IRC_ENABLED RSS_ENABLED = settings.RSS_ENABLED +WEBCLIENT_ENABLED = settings.WEBCLIENT_ENABLED #------------------------------------------------------------ @@ -334,6 +339,37 @@ if AMP_ENABLED: amp_service.setName("EvenniaPortal") EVENNIA.services.addService(amp_service) +if WEBSERVER_ENABLED: + + # Start a django-compatible webserver. + + from twisted.python import threadpool + from src.server.webserver import DjangoWebRoot, WSGIWebServer + + # start a thread pool and define the root url (/) as a wsgi resource + # recognized by Django + threads = threadpool.ThreadPool() + web_root = DjangoWebRoot(threads) + # point our media resources to url /media + web_root.putChild("media", static.File(settings.MEDIA_ROOT)) + web_site = server.Site(web_root, logPath=settings.HTTP_LOG_FILE) + + for interface in WEBSERVER_INTERFACES: + if ":" in interface: + print " iPv6 interfaces not yet supported" + continue + ifacestr = "" + if interface != '0.0.0.0' or len(WEBSERVER_INTERFACES) > 1: + ifacestr = "-%s" % interface + for port in WEBSERVER_PORTS: + pstring = "%s:%s" % (ifacestr, port) + # create the webserver + webserver = WSGIWebServer(threads, port, web_site, interface=interface) + webserver.setName('EvenniaWebServer%s' % pstring) + EVENNIA.services.addService(webserver) + + print " webserver%s: %s" % (ifacestr, port) + if IRC_ENABLED: # IRC channel connections diff --git a/src/web/news/urls.py b/src/web/news/urls.py index 10c891d42c..09c4a3b6fe 100755 --- a/src/web/news/urls.py +++ b/src/web/news/urls.py @@ -1,9 +1,9 @@ """ -This structures the url tree for the news application. +This structures the url tree for the news application. It is imported from the root handler, game.web.urls.py. """ -from django.conf.urls.defaults import * +from django.conf.urls import * urlpatterns = patterns('src.web.news.views', (r'^show/(?P\d+)/$', 'show_news'), diff --git a/src/web/urls.py b/src/web/urls.py index bbe83633d6..5ca3bf8a41 100755 --- a/src/web/urls.py +++ b/src/web/urls.py @@ -6,7 +6,7 @@ # http://diveintopython.org/regular_expressions/street_addresses.html#re.matching.2.3 # -from django.conf.urls.defaults import * +from django.conf.urls import * from django.conf import settings from django.contrib import admin from django.views.generic import RedirectView @@ -17,12 +17,12 @@ from django.db.models.loading import cache as model_cache if not model_cache.loaded: model_cache.get_models() -# loop over all settings.INSTALLED_APPS and execute code in +# loop over all settings.INSTALLED_APPS and execute code in # files named admin.py in each such app (this will add those # models to the admin site) admin.autodiscover() -# Setup the root url tree from / +# Setup the root url tree from / urlpatterns = patterns('', # User Authentication @@ -36,11 +36,11 @@ urlpatterns = patterns('', # Page place-holder for things that aren't implemented yet. url(r'^tbi/', 'src.web.website.views.to_be_implemented'), - + # Admin interface url(r'^admin/doc/', include('django.contrib.admindocs.urls')), url(r'^admin/', include(admin.site.urls)), - + # favicon url(r'^favicon\.ico$', RedirectView.as_view(url='/media/images/favicon.ico')), diff --git a/src/web/webclient/urls.py b/src/web/webclient/urls.py index 93702a0673..03f2595d2e 100644 --- a/src/web/webclient/urls.py +++ b/src/web/webclient/urls.py @@ -1,6 +1,6 @@ """ -This structures the (simple) structure of the -webpage 'application'. +This structures the (simple) structure of the +webpage 'application'. """ from django.conf.urls import * diff --git a/src/web/webclient/views.py b/src/web/webclient/views.py index e9ac9910a3..3d097b6935 100644 --- a/src/web/webclient/views.py +++ b/src/web/webclient/views.py @@ -1,19 +1,25 @@ """ -This contains a simple view for rendering the webclient +This contains a simple view for rendering the webclient page and serve it eventual static content. """ -from django.shortcuts import render_to_response +from django.shortcuts import render_to_response, redirect from django.template import RequestContext from django.conf import settings from src.server.sessionhandler import SESSIONS def webclient(request): """ - Webclient page template loading. - """ + Webclient page template loading. + """ + + # analyze request to find which port we are on + if int(request.META["SERVER_PORT"]) == 8000: + # we relay webclient to the portal port + print "Called from port 8000!" + #return redirect("http://localhost:8001/webclient/", permanent=True) # as an example we send the number of connected players to the template pagevars = {'num_players_connected': SESSIONS.player_count()} diff --git a/src/web/website/urls.py b/src/web/website/urls.py index b12603afe1..8bb4bd811e 100644 --- a/src/web/website/urls.py +++ b/src/web/website/urls.py @@ -1,9 +1,9 @@ """ -This structures the (simple) structure of the -webpage 'application'. +This structures the (simple) structure of the +webpage 'application'. """ -from django.conf.urls.defaults import * +from django.conf.urls import * urlpatterns = patterns('src.web.website.views', (r'^$', 'page_index'),