Install script for PunBB-1.2.14

-----BEGIN WEBFACTION INSTALL SCRIPT-----
#!/usr/local/bin/python2.4

"""
PunBB 1.2.14

Requirements:
- 1 MySQL database.

Notes:
- The database will be named after your application.
- The default username and password are "Admin" and "Password".

"autostart": not applicable
"extra info": enter the admin e-mail address followed by the site URL. For instance:
my@domain.com http://mydomain.com/forum
"""

import random
import re
import string
import sys
import xmlrpclib

def arg_split(arg):
    new_args = []
    while True:
        arg = arg.strip()
        if arg == '':
            break
        if (arg[0] != '"') and (arg[0] != "'"):
            new_arg = re.split(' ', arg)[0]
            arg = re.sub('^%s' % new_arg, '', arg)
        else:
            separator = arg[0]
            arg = arg[1:]
            new_arg = re.split(separator, arg)[0]
            arg = re.sub('^%s%s' % (new_arg, separator), '', arg)
        new_args.append(new_arg)
        continue
    return new_args

def create(account, app_name, autostart, extra_info, password, server, session_id, username):
    # Parse and validate arguments.
    db_name = db_user = '%s_%s' % (username, app_name)
    try:
        email_address, url = arg_split(extra_info)
    except ValueError:
        print 'Extra info is invalid.'
        return
    # Create application and database.
    app = server.create_app(session_id, app_name, 'static', False, '')
    server.create_db(session_id, db_name, 'mysql', password)
    # Download files.
    cmd = ''
    cmd += 'rm index.html;'
    cmd += 'wget wget http://wiki.webfaction.com/attachment/wiki/PunBb/punbb-1.2.14.zip?format=raw > /dev/null 2>&1;'
    cmd += 'unzip punbb-1.2.14.zip?format=raw > /dev/null 2>&1;'
    cmd += 'rm punbb-1.2.14.zip?format=raw;'
    server.system(session_id, cmd)
    # Set permissions.
    cmd = ''
    cmd += 'chmod 777 cache/;'
    cmd += 'chmod 777 img/avatars/;'
    server.system(session_id, cmd)
    # Edit configuration.
    characters = string.lowercase + string.digits
    cookie_seed = ''
    for i in range(1, 9):
        cookie_seed += random.choice(characters)
    server.replace_in_file(session_id, 'config.php',
        ("$cookie_seed = '';", "$cookie_seed = '%s';" % cookie_seed),
        ("$db_name = '';",     "$db_name = '%s';"     % db_name),
        ("$db_password = '';", "$db_password = '%s';" % password),
        ("$db_username = '';", "$db_username = '%s';" % db_user)
    )
    # Set email address and URL.
    server.replace_in_file(session_id, 'schema.sql',
        ('$EMAIL ADDRESS$', email_address),
        ('$URL$', url)
    )
    # Populate database.
    cmd = ''
    cmd += 'mysql --password=%s --user=%s %s < schema.sql;' % (password, db_user, db_name)
    cmd += 'rm schema.sql;'
    server.system(session_id, cmd) 
    print app['id']

def delete(account, app_name, autostart, extra_info, password, server, session_id, username):
    # Delete application and database.
    server.delete_app(session_id, app_name)
    server.delete_db(session_id, '%s_%s' % (username, app_name), 'mysql')

if __name__ == '__main__':
    action, username, password, machine, app_name, autostart, extra_info = sys.argv[1:]
    server = xmlrpclib.ServerProxy('https://api.webfaction.com/')
    session_id, account = server.login(username, password, machine)
    func = locals()[action]
    func(account, app_name, autostart, extra_info, password, server, session_id, username)
-----END WEBFACTION INSTALL SCRIPT-----