from __future__ import with_statement
import time
import os
from fabric.api import *
from fabric.contrib.files import *
from fabric.utils import warn
from hashlib import sha1

env.repo = 'git://dev.pleaseignore.com/dreddit-auth.git'

def production():
    "Use the production enviroment on Web1"
    env.hosts = ['dreddit@web1.pleaseignore.com']
    env.path = '/home/dreddit/apps'
    env.user = 'auth'
    env.vhost = '/auth'
    env.password = sha1('%s-%s' % (env.user, env.vhost)).hexdigest()

def test():
    "Use the test enviroment on Web2"
    env.hosts = ['dreddit@web2.pleaseignore.com']
    env.path = '/home/dreddit/apps'
    env.user = 'auth'
    env.vhost = '/auth'
    env.password = sha1('%s-%s' % (env.user, env.vhost)).hexdigest()

def deploy():
    """
    Do a fresh deployment to a new or clean server
     """
    setup()


def setup():
    """
    Deploy the files to the server and setup virtualenv and a simple
    SQlite DB setup
    """
    require('hosts')
    require('path')

    deploy_repo()

    setup_virtualenv()


def push():
    """
    Push the latest revision to the server and update the enviroment
    """
    require('hosts')
    require('path')

    stop()
    update_repo()
    setup_virtualenv()
    migrate()
    start()


def setup_virtualenv():
    """
    Generate the virtualenv enviroment
    """
    require('path')

    with cd('%(path)s/dreddit-auth/' % env):
        run('./bin/setup-env.sh' % env)


def setup_db():
    """
    Setup a simple SQlite DB using the default settings
    """
    require('path')

    with cd('%(path)s/dreddit-auth/' % env):
        run('if [ ! -e dbsettings.py ]; then cp dbsettings.py.example dbsettings.py; fi' % env)
        run('env/bin/python app/manage.py syncdb --noinput --migrate')


def generate_brokersettings():
    """
    Generates the brokersettings file
    """

    require('hosts')

    cnf = open('brokersettings.py.example', 'r').read()
    out = open('brokersettings.py', 'w')
    out.write(cnf % env)


def setup_rabbitmq():
    """
    Setup the RabbitMQ instance on the system (requires sudo access)
    """

    require('hosts')
    require('path')

    generate_brokersettings() 

    with settings(warn_only=True):
        sudo('rabbitmqctl delete_user %s' % env.user, shell=False)
        sudo('rabbitmqctl delete_vhost %s' % env.vhost, shell=False)
    sudo('rabbitmqctl add_user %s %s' % (env.user, env.password), shell=False)
    sudo('rabbitmqctl add_vhost %s' % env.vhost, shell=False)
    sudo('rabbitmqctl set_permissions -p %s %s ".*" ".*" ".*"' % (env.vhost, env.user), shell=False)

    put('./brokersettings.py', '%(path)s/dreddit-auth/app/conf/' % env)
    os.unlink('brokersettings.py')


def deploy_repo():
    """
    Do the initial repository checkout
    """
    require('hosts')
    require('path')

    run('mkdir -p %(path)s' % env)
    with cd(env.path):
        run('git clone %(repo)s' % env)

    with cd('%(path)s/dreddit-auth/' % env):
        run('mkdir logs')


def update_repo():
    """
    Pulls the latest commits to the repository
    """
    require('hosts')
    require('path')

    with cd('%(path)s/dreddit-auth/' % env):
        run('git pull')

    deploy_static()


def reset_repo():
    """
    Does a hard reset on the remote repo
    """
    require('hosts')
    require('path')

    with cd('%(path)s/dreddit-auth/' % env):
        run('git reset --hard')


def migrate():
    """
    Do any South database migrations
    """
    require('hosts')
    require('path')

    with cd('%(path)s/dreddit-auth/' % env):
        run('env/bin/python app/manage.py migrate')


def start_celeryd():
    """
    Start the celeryd server
    """
    require('hosts')
    require('path')

    with cd('%(path)s/dreddit-auth/' % env):
        run('. env/bin/activate; app/manage.py celeryd_detach -l INFO -B --pidfile logs/celeryd.pid -f logs/celeryd.log -n auth-processor' % env)


def stop_celeryd():
    """
    Stop any running FCGI instance
    """
    require('hosts')
    require('path')

    with cd('%(path)s/dreddit-auth/' % env):
        if exists('logs/celeryd.pid'):
            run('kill `cat logs/celeryd.pid`')
            time.sleep(2)
            run('rm -f logs/celeryd.pid')
        else:
            warn('celeryd isn\'t running')

def restart_celeryd():
    """
    Restart the celery daemon
    """
    stop_celeryd()
    time.sleep(2)
    start_celeryd()


def start_uwsgi():
    """
    Start uWSGI
    """
    with cd('%(path)s/dreddit-auth/' % env):
        run('uwsgi -d logs/uwsgi.log -x etc/auth_uwsgi.xml' % env)


def restart_uwsgi():
    """
    Restart the uWSGI daemon
    """
    with cd('%(path)s/dreddit-auth/' % env):
        if exists('logs/uwsgi.pid'):
            run('kill `cat logs/uwsgi.pid`')
        else:
            warn('uWSGI isn\'t running')

def start():
    """
    Start uWSGI and Celery
    """
    start_uwsgi()
    start_celeryd()


def stop():
    """
    Stop Celery
    """
    stop_celeryd()
    info('Can\'t stop uWSGI')

def restart():
    """
    Restart uWSGI and Celery
    """
    stop_celeryd()
    time.sleep(5)
    restart_uwsgi()
    start_celeryd()

def clear_logs():
    with cd('%(path)s/dreddit-auth/' % env):
        run('rm ./logs/*.log')

def deploy_static():
    with cd('%(path)s/dreddit-auth/' % env):
        run('./app/manage.py collectstatic -v0 --noinput')

@@ -1620,1096 +1620,63 @@
 un('
-if %5B ! -e dbsettings.py %5D; then cp dbsettings.py.example dbsettings.py; fi' %25 env)%0A        run('env/bin/python app/manage.py syncdb --noinput --migrate')%0A%0A%0Adef generate_brokersettings():%0A    %22%22%22%0A    Generates the brokersettings file%0A    %22%22%22%0A%0A    require('hosts')%0A%0A    cnf = open('brokersettings.py.example', 'r').read()%0A    out = open('brokersettings.py', 'w')%0A    out.write(cnf %25 env)%0A%0A%0Adef setup_rabbitmq():%0A    %22%22%22%0A    Setup the RabbitMQ instance on the system (requires sudo access)%0A    %22%22%22%0A%0A    require('hosts')%0A    require('path')%0A%0A    generate_brokersettings() %0A%0A    with settings(warn_only=True):%0A        sudo('rabbitmqctl delete_user %25s' %25 env.user, shell=False)%0A        sudo('rabbitmqctl delete_vhost %25s' %25 env.vhost, shell=False)%0A    sudo('rabbitmqctl add_user %25s %25s' %25 (env.user, env.password), shell=False)%0A    sudo('rabbitmqctl add_vhost %25s' %25 env.vhost, shell=False)%0A    sudo('rabbitmqctl set_permissions -p %25s %25s %22.*%22 %22.*%22 %22.*%22' %25 (env.vhost, env.user), shell=False)%0A%0A    put('./brokersettings.py', '%25(path)s/dreddit-auth/app/conf/' %25 env)%0A    os.unlink('brokersettings.py
+env/bin/python app/manage.py syncdb --noinput --migrate
 ')%0A%0A
@@ -3443,365 +3443,90 @@
     
-with cd('%25(path)s/dreddit-auth/' %25 env):%0A        run('uwsgi -d logs/uwsgi.log -x etc/auth_uwsgi.xml' %25 env)%0A%0A%0Adef restart_uwsgi():%0A    %22%22%22%0A    Restart the uWSGI daemon%0A    %22%22%22%0A    with cd('%25(path)s/dreddit-auth/' %25 env):%0A        if exists('logs/uwsgi.pid'):%0A            run('kill %60cat logs/uwsgi.pid%60')%0A        else:%0A            warn('uWSGI isn%5C't running')
+pass%0A%0A%0Adef restart_uwsgi():%0A    %22%22%22%0A    Restart the uWSGI daemon%0A    %22%22%22%0A    pass%0A
 %0A%0Ade

Update fabric, remove unneeded funcs