from fabric.context_managers import prefix
from fabric.contrib.console import confirm
from fabric.operations import prompt, sudo
from fabric.api import run, task
from fabric.state import env
import os
env.user = 'root'
@task
def create_user(username, python='/usr/local/bin/python3.5'):
    run('useradd -m -s /bin/bash {}'.format(username))
    run_user = lambda x: sudo(x, user=username)
    run_user('mkdir ~/logs')
    run_user('mkdir ~/www')
    if confirm('Create virtualenv?'):
        run_user('{} -m venv --copies ~/venv'.format(python))
        with prefix('source ~/venv/bin/activate'):
            run_user('pip install --upgrade pip setuptools wheel')
    if confirm('Add ssh key?'):
        run_user('mkdir ~/.ssh')
        run_user('chmod 700 ~/.ssh')
        with open(os.path.expanduser('~/.ssh/id_rsa.pub'), 'r') as fp:
            ssh_key = fp.read().strip()
            run_user('echo "{}" >> ~/.ssh/authorized_keys'.format(ssh_key))
        run_user('chmod 600 ~/.ssh/authorized_keys')
    if confirm('Install project now?', default=False):
        configs = prompt('Configs to install: ').split('')
        for conf in configs:
            script_path = '/home/{user}/www/{conf}/system/install.sh'\
                          .format(user=username, conf=conf)
            run('chmod +x {}'.format(script_path))
            run('{} {}'.format(script_path, conf))
@task
def create_database():
    sql = lambda x: sudo('cd ~ && psql -c "{}"'.format(x), user='postgres')
    username = prompt('Username: ')
    password = prompt('Password: ')
    sql("CREATE USER {} WITH PASSWORD '{}'".format(username, password))
    dbnames = prompt('DB names: ').split(',')
    for dbname in dbnames:
        sql("CREATE DATABASE {};".format(dbname))
        sql("GRANT ALL PRIVILEGES ON DATABASE {} TO {}".format(dbname, username))