diff --git a/app.py b/app.py index 9469a56..7cc259b 100644 --- a/app.py +++ b/app.py @@ -1,11 +1,13 @@ -from gevent import monkey, pywsgi -from realms import config, app +from gevent import monkey, wsgi +from realms import config, app, manager monkey.patch_all() -import logging +@manager.command +def server(port=10000): + print "Server started (%s)" % config.ENV + wsgi.WSGIServer(('', int(port)), app).serve_forever() + if __name__ == '__main__': - print "Starting server" - app.logger.setLevel(logging.INFO) - pywsgi.WSGIServer(('', config.PORT), app).serve_forever() + manager.run() diff --git a/realms/__init__.py b/realms/__init__.py index b0480c7..ec98279 100644 --- a/realms/__init__.py +++ b/realms/__init__.py @@ -3,7 +3,7 @@ import time import sys import os -from flask import Flask, request, render_template, url_for, redirect, session +from flask import Flask, request, render_template, url_for, redirect, session, g from flask.ctx import _AppCtxGlobals from flask.ext.script import Manager from flask.ext.login import LoginManager, login_required @@ -17,27 +17,40 @@ from realms.lib.session import RedisSessionInterface from realms.lib.wiki import Wiki from realms.lib.util import to_canonical, remove_ext, mkdir_safe, gravatar_url from realms.lib.services import db -from models import Site, User, CurrentUser +from realms.models import User, CurrentUser -wikis = {} +sites = {} + + +class Site(object): + wiki = None class AppCtxGlobals(_AppCtxGlobals): @cached_property - def current_wiki(self): - subdomain = format_subdomain(self.current_site) + def current_site(self): + subdomain = format_subdomain(self.current_subdomain) if not subdomain: - subdomain = "_" + subdomain = "www" - if not wikis.get(subdomain): - wikis[subdomain] = Wiki("%s/%s" % (config.REPO_DIR, subdomain)) + if subdomain is "www" and self.current_subdomain: + # Invalid sub domain + return False - return wikis[subdomain] + if not sites.get(subdomain): + sites[subdomain] = Site() + sites[subdomain].wiki = Wiki("%s/%s" % (config.REPO_DIR, subdomain)) + + return sites[subdomain] @cached_property - def current_site(self): + def current_wiki(self): + return g.current_site.wiki + + @cached_property + def current_subdomain(self): host = request.host.split(':')[0] return host[:-len(config.DOMAIN)].rstrip('.') @@ -103,13 +116,6 @@ class Application(Flask): print >> sys.stderr, ' * Ready in %.2fms' % (1000.0 * (time.time() - start_time)) -def init_db(dbname): - """ - Assures DB has minimal setup - """ - pass - - class RegexConverter(BaseConverter): """ Enables Regex matching on endpoints @@ -188,6 +194,12 @@ else: assets.register('js_editor', js) +@app.before_request +def check_subdomain(): + if not g.current_site: + return redirect('http://%s' % config.SERVER_NAME) + + @app.after_request def inject_x_rate_headers(response): limit = get_view_rate_limit() @@ -220,7 +232,6 @@ def root(): return redirect(url_for(config.ROOT_ENDPOINT)) - @app.route("/_account/") @login_required def account(): diff --git a/realms/config/__init__.py b/realms/config/__init__.py index 52a50a4..b9195df 100644 --- a/realms/config/__init__.py +++ b/realms/config/__init__.py @@ -4,7 +4,6 @@ HOSTNAME = socket.gethostname() DOMAIN = 'realms.dev' ENV = 'DEV' -PORT = 10000 DB_URI = 'postgresql://realms:dbpassword@localhost:5432/realms' @@ -32,7 +31,10 @@ MODULES = [ ] if ENV is 'PROD': - pass + SERVER_NAME = 'realms.io' + PORT = 80 else: DEBUG = True - ASSETS_DEBUG = True \ No newline at end of file + ASSETS_DEBUG = True + SERVER_NAME = 'realms.dev:8000' + PORT = 8000 \ No newline at end of file diff --git a/realms/modules/wiki/views.py b/realms/modules/wiki/views.py index a5f2d18..c6666df 100644 --- a/realms/modules/wiki/views.py +++ b/realms/modules/wiki/views.py @@ -1,14 +1,14 @@ from flask import g, render_template, request, redirect, Blueprint, flash, url_for from flask.ext.login import login_required -from realms import app, redirect_url, config +from realms import redirect_url, config from realms.lib.util import to_canonical, remove_ext from realms.lib.wiki import Wiki from realms.models import Site -blueprint = Blueprint('wiki', __name__) +blueprint = Blueprint('wiki', __name__, url_prefix='/wiki') -@blueprint.route("/wiki/new/", methods=['GET', 'POST']) +@blueprint.route("/new/", methods=['GET', 'POST']) @login_required def new(): if request.method == 'POST': @@ -25,7 +25,7 @@ def new(): return render_template('wiki/new.html') -@blueprint.route("/wiki/_commit//") +@blueprint.route("/_commit//") def commit(name, sha): cname = to_canonical(name) @@ -36,29 +36,30 @@ def commit(name, sha): return redirect(url_for('.create', name=cname)) -@blueprint.route("/wiki/_compare//") +@blueprint.route("/_compare//") def compare(name, fsha, dots, lsha): diff = g.current_wiki.compare(name, fsha, lsha) return render_template('wiki/compare.html', name=name, diff=diff, old=fsha, new=lsha) -@blueprint.route("/wiki/_revert", methods=['POST']) +@blueprint.route("/_revert", methods=['POST']) def revert(): if request.method == 'POST': name = request.form.get('name') commit = request.form.get('commit') cname = to_canonical(name) - g.current_wiki.revert_page(name, commit, message="Reverting %s" % cname, username=g.current_user.get('username')) + g.current_wiki.revert_page(name, commit, message="Reverting %s" % cname, + username=g.current_user.get('username')) flash('Page reverted', 'success') return redirect(url_for('.page', name=cname)) -@blueprint.route("/wiki/_history/") +@blueprint.route("/_history/") def history(name): history = g.current_wiki.get_history(name) return render_template('wiki/history.html', name=name, history=history, wiki_home=url_for('wiki.page')) -@blueprint.route("/wiki/_edit/", methods=['GET', 'POST']) +@blueprint.route("/_edit/", methods=['GET', 'POST']) def edit(name): data = g.current_wiki.get_page(name) cname = to_canonical(name) @@ -80,14 +81,14 @@ def edit(name): return redirect(url_for('.create', name=cname)) -@blueprint.route("/wiki/_delete/", methods=['POST']) +@blueprint.route("/_delete/", methods=['POST']) @login_required def delete(name): pass -@blueprint.route("/wiki/_create/", defaults={'name': None}, methods=['GET', 'POST']) -@blueprint.route("/wiki/_create/", methods=['GET', 'POST']) +@blueprint.route("/_create/", defaults={'name': None}, methods=['GET', 'POST']) +@blueprint.route("/_create/", methods=['GET', 'POST']) def create(name): cname = "" if name: @@ -107,8 +108,8 @@ def create(name): return render_template('wiki/edit.html', name=cname, content="") -@blueprint.route("/wiki/", defaults={'name': 'home'}) -@blueprint.route("/wiki/") +@blueprint.route("/", defaults={'name': 'home'}) +@blueprint.route("/") def page(name): cname = to_canonical(name) if cname != name: diff --git a/srv/salt/supervisor/supervisord.conf b/srv/salt/supervisor/supervisord.conf index 46484f6..86e017f 100644 --- a/srv/salt/supervisor/supervisord.conf +++ b/srv/salt/supervisor/supervisord.conf @@ -1,29 +1,2 @@ -[rpcinterface:supervisor] -supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface - -[unix_http_server] -file = /tmp/supervisor.sock -chmod = 0777 - -[supervisorctl] -serverurl = unix:///tmp/supervisor.sock - -[supervisord] -logfile = /tmp/supervisord.log -logfile_maxbytes = 50MB -logfile_backups=10 -loglevel = info -pidfile = /tmp/supervisord.pid -nodaemon = false -minfds = 1024 -minprocs = 200 -umask = 022 -user = root -identifier = supervisor -directory = /tmp -nocleanup = true -childlogdir = /tmp -strip_ansi = false - [program:realms] command=/home/deploy/virtualenvs/realms/bin/python /home/deploy/realms/app.py \ No newline at end of file