diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..35d6f16 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +*.pyc +temp/ +www/ diff --git a/build.py b/build.py new file mode 100755 index 0000000..992a1f5 --- /dev/null +++ b/build.py @@ -0,0 +1,146 @@ +#! /usr/bin/env python +# -*- coding: utf-8 -*- + +import logging +import os +import shutil + +page_src = """#! /usr/bin/env python +# -*- coding: utf-8 -*- +import os +os.chdir("..") + +from mako.template import Template +from mako.lookup import TemplateLookup + +def myapp(environ, start_response): + start_response("200 OK", [("Content-Type", "text/html")]) + lookup = TemplateLookup(directories=["{{support_dir}}"]) + template = Template(filename="{{src}}", module_directory="{{temp_dir}}", + lookup=lookup) + return [template.render(environ=environ).encode("utf8")] + +if __name__ == "__main__": + from flup.server.fcgi import WSGIServer + WSGIServer(myapp).run() +""" + +rewrite_script_src = """match URL into $ with ^/~earwig/{0}(\?.*?)?$ +if matched then + set URL = /~earwig/rewrite/{0}.fcgi$1 + goto END +endif +""" + +class Builder(object): + def __init__(self): + self.build_dir = "www" + self.static_dir = "static" + self.pages_dir = "pages" + self.support_dir = "support" + self.temp_dir = "temp" + self.rs_file = "rewrite.script" + + self.root = logging.getLogger("builder") + self.root.addHandler(logging.NullHandler()) + self._pages = [] + + def _enable_logging(self): + handler = logging.StreamHandler() + handler.setFormatter(_LogFormatter()) + self.root.addHandler(handler) + self.root.setLevel(logging.DEBUG) + + def _gen_page(self, page, base): + if not page.endswith(".mako"): + base.warn("Skipping {0} (not endswith('.mako'))".format(page)) + return + + logger = base.getChild(page.rsplit(".", 1)[0]) + self._pages.append(page.rsplit(".", 1)[0]) + src = os.path.join(self.pages_dir, page) + dest = os.path.join(self.build_dir, page.replace(".mako", ".fcgi")) + + logger.debug("build {0} -> {1}".format(src, dest)) + content = page_src.replace("{{src}}", src) + content = content.replace("{{support_dir}}", self.support_dir) + content = content.replace("{{temp_dir}}", self.temp_dir) + with open(dest, "w") as fp: + fp.write(content) + + logger.debug("chmod 0755 {0}".format(dest)) + os.chmod(dest, 0755) + + def clean(self): + logger = self.root.getChild("clean") + targets = (self.build_dir, self.temp_dir) + + for target in targets: + if os.path.exists(target): + logger.debug("rm -r {0}".format(target)) + shutil.rmtree(target) + + logger.debug("mkdir {0}".format(target)) + os.mkdir(target) + + def gen_static(self): + logger = self.root.getChild("static") + dest = os.path.join(self.build_dir, "static") + + logger.debug("copytree {0} -> {1}".format(self.static_dir, dest)) + shutil.copytree(self.static_dir, dest) + + def gen_pages(self): + logger = self.root.getChild("pages") + pages = os.listdir(self.pages_dir) + for page in pages: + self._gen_page(page, logger) + + def gen_zws(self): + logger = self.root.getChild("zws") + target = self.rs_file + + if os.path.exists(target): + logger.debug("rm {0}".format(target)) + os.remove(target) + + logger.debug("build rewrite.script") + with open(target, "w") as fp: + for page in self._pages: + fp.write(rewrite_script_src.format(page)) + + def build(self): + self._enable_logging() + self.root.info("Building project...") + self.clean() + self.gen_static() + self.gen_pages() + self.gen_zws() + self.root.info("Done!") + + +class _LogFormatter(logging.Formatter): + def __init__(self): + fmt = "[%(asctime)s %(lvl)s] %(name)s: %(message)s" + datefmt = "%Y-%m-%d %H:%M:%S" + _format = super(_LogFormatter, self).format + self.format = lambda record: _format(self.colorize(record)) + super(_LogFormatter, self).__init__(fmt=fmt, datefmt=datefmt) + + def colorize(self, record): + l = record.levelname.ljust(8) + if record.levelno == logging.DEBUG: + record.lvl = l.join(("\x1b[34m", "\x1b[0m")) # Blue + if record.levelno == logging.INFO: + record.lvl = l.join(("\x1b[32m", "\x1b[0m")) # Green + if record.levelno == logging.WARNING: + record.lvl = l.join(("\x1b[33m", "\x1b[0m")) # Yellow + if record.levelno == logging.ERROR: + record.lvl = l.join(("\x1b[31m", "\x1b[0m")) # Red + if record.levelno == logging.CRITICAL: + record.lvl = l.join(("\x1b[1m\x1b[31m", "\x1b[0m")) # Bold red + return record + + +if __name__ == "__main__": + Builder().build() diff --git a/copyvio.fcgi b/copyvio.fcgi deleted file mode 100755 index 6367471..0000000 --- a/copyvio.fcgi +++ /dev/null @@ -1,9 +0,0 @@ -#! /usr/bin/env python - -def myapp(environ, start_response): - start_response('200 OK', [('Content-Type', 'text/plain')]) - return ['Hello World!\n'] - -if __name__ == "__main__": - from flup.server.fcgi import WSGIServer - WSGIServer(myapp).run() diff --git a/pages/hello.mako b/pages/hello.mako new file mode 100644 index 0000000..980a0d5 --- /dev/null +++ b/pages/hello.mako @@ -0,0 +1 @@ +Hello World! diff --git a/rewrite.script b/rewrite.script index d5de923..ddbdabb 100644 --- a/rewrite.script +++ b/rewrite.script @@ -1,5 +1,5 @@ -match URL into $ with ^/~earwig/copyvio(\?.*?)?$ +match URL into $ with ^/~earwig/hello(\?.*?)?$ if matched then - set URL = /~earwig/rewrite/copyvio.fcgi$1 + set URL = /~earwig/rewrite/hello.fcgi$1 goto END endif