#!/usr/bin/python
# Copyright (c) 2012 Alon Swartz <alon@turnkeylinux.org>

"""Add apache virtualhost for plone site

Arguments:

    domain        Domain to serve plone site (e.g., www.example.com)
    sitename      Plone site name (e.g., example)
"""

import os
import sys
import getopt

import executil

def usage(e=None):
    if e:
        print >> sys.stderr, "error: " + str(e)

    name = os.path.basename(sys.argv[0])
    print >> sys.stderr, "Syntax: %s <domain> <sitename>" % name
    print >> sys.stderr, __doc__.strip()
    sys.exit(1)

def fatal(s):
    print >> sys.stderr, "error: " + str(s)
    sys.exit(1)

VHOST_TEMPLATE="""
<VirtualHost *:80>
    ServerAlias DOMAIN
    ServerAdmin webmaster@localhost
    RewriteEngine On
    RewriteRule ^/(.*)$ http://127.0.0.1:8080/VirtualHostBase/http/%{SERVER_NAME}:80/SITENAME/VirtualHostRoot/$1 [L,P]
    ErrorLog /var/log/apache2/plone_SITENAME_error.log
    CustomLog /var/log/apache2/plone_SITENAME_access.log combined
</VirtualHost>

<VirtualHost *:443>
    ServerAlias DOMAIN
    ServerAdmin webmaster@localhost
    SSLEngine on
    RewriteEngine On
    RewriteRule ^/(.*)$ http://127.0.0.1:8080/VirtualHostBase/https/%{SERVER_NAME}:443/SITENAME/VirtualHostRoot/$1 [L,P]
    ErrorLog /var/log/apache2/plone_SITENAME_error.log
    CustomLog /var/log/apache2/plone_SITENAME_access.log combined
</VirtualHost>
"""

def write_vhost(domain, sitename):
    vhost_name = "plone-%s" % sitename
    vhost_path = "/etc/apache2/sites-available/%s" % vhost_name

    if os.path.exists(vhost_path):
        fatal("vhost already exists: %s" % vhost_path)

    vhost = VHOST_TEMPLATE.replace('DOMAIN', domain)
    vhost = vhost.replace('SITENAME', sitename)

    fd = open(vhost_path, 'w')
    fd.write(vhost)
    fd.close()

    return vhost_name, vhost_path

def main():
    try:
        opts, args = getopt.gnu_getopt(sys.argv[1:], 'h', [])
    except getopt.GetoptError, e:
        usage(e)

    filesystem = None
    for opt, val in opts:
        if opt == '-h':
            usage()

    if not len(args) == 2:
        usage()

    domain = args[0]
    sitename = args[1]

    vhost_name, vhost_path = write_vhost(domain, sitename)
    print "Created vhost %s" % vhost_path

    executil.system("a2ensite %s" % vhost_name)
    executil.system("/etc/init.d/apache2 reload")

if __name__ == "__main__":
    main()

