diff --git a/fabfile.py b/fabfile.py new file mode 100644 index 0000000000..66afdccc18 --- /dev/null +++ b/fabfile.py @@ -0,0 +1,32 @@ +import os + +from fabric.api import run, sudo, cd, env, task + +from fabfiles.databases import mysql +from fabfiles.webservers import apache +from fabfiles.platforms import ubuntu +from fabfiles.conf import setup_paths + + +@task(default=True) +def install(**kwargs): + setup_paths(**kwargs) + + ubuntu.install_dependencies() + ubuntu.install_mayan() + mysql.install_database_manager() + mysql.create_database() + ubuntu.fix_permissions() + apache.install() + apache.install_site() + apache.restart() + + +@task +def uninstall(**kwargs): + setup_paths(**kwargs) + + ubuntu.uninstall() + apache.remove_site() + + diff --git a/fabfiles/__init__.py b/fabfiles/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/fabfiles/conf.py b/fabfiles/conf.py new file mode 100644 index 0000000000..0aaeec2885 --- /dev/null +++ b/fabfiles/conf.py @@ -0,0 +1,14 @@ +import os + +from fabric.api import run, sudo, cd, env, task + +from literals import DEFAULT_INSTALL_PATH, DEFAULT_VIRTUALENV_NAME, DEFAULT_REPOSITORY_NAME, DEFAULT_OS + + +def setup_paths(**kwargs): + env['os'] = kwargs.pop('os', DEFAULT_OS) + env['install_path'] = kwargs.pop('path', DEFAULT_INSTALL_PATH[env.os]) + env['virtualenv_name'] = kwargs.pop('virtualenv_name', DEFAULT_VIRTUALENV_NAME[env.os]) + env['repository_name'] = kwargs.pop('repository_name', DEFAULT_REPOSITORY_NAME[env.os]) + env['virtualenv_path'] = os.path.join(env.install_path, env.virtualenv_name) + env['repository_path'] = os.path.join(env.virtualenv_path, env.repository_name) diff --git a/fabfiles/databases/__init__.py b/fabfiles/databases/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/fabfiles/databases/mysql.py b/fabfiles/databases/mysql.py new file mode 100644 index 0000000000..7e25b4a226 --- /dev/null +++ b/fabfiles/databases/mysql.py @@ -0,0 +1,20 @@ +from fabric.api import run, sudo, cd, env, task + + +@task +def install_database_manager(): + print('Installing MySQL') + + sudo('apt-get install -y mysql-server libmysqlclient-dev') + + with cd(env.virtualenv_path): + sudo('source bin/activate; pip install MySQL-python') + + +@task +def create_database(*args, **kwargs): + print('Setting up Mayan EDMS\'s MySQL database') + + #TODO: create DB and mayan user + #TODO: custom settings_local + diff --git a/fabfiles/literals.py b/fabfiles/literals.py new file mode 100644 index 0000000000..f04ef0f492 --- /dev/null +++ b/fabfiles/literals.py @@ -0,0 +1,15 @@ +OS_UBUNTU = 'ubuntu' + +DEFAULT_INSTALL_PATH = { + OS_UBUNTU: '/usr/share' +} + +DEFAULT_VIRTUALENV_NAME = { + OS_UBUNTU: 'mayan' +} + +DEFAULT_REPOSITORY_NAME = { + OS_UBUNTU: 'mayan' +} + +DEFAULT_OS = OS_UBUNTU diff --git a/fabfiles/platforms/__init__.py b/fabfiles/platforms/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/fabfiles/platforms/ubuntu.py b/fabfiles/platforms/ubuntu.py new file mode 100644 index 0000000000..429cd872ff --- /dev/null +++ b/fabfiles/platforms/ubuntu.py @@ -0,0 +1,50 @@ +from fabric.api import run, sudo, cd, env, task + +from ..conf import setup_paths + +@task +def install_dependencies(): + print('Installing dependencies') + + sudo('apt-get install -y git-core gcc tesseract-ocr unpaper python-virtualenv ghostscript libjpeg-dev libpng-dev poppler-utils') + + +@task +def uninstall(**kwargs): + drop_database=kwargs.pop('drop_database', False) + setup_paths(**kwargs) + print('Uninstalling Mayan EDMS from: %s' % env.virtualenv_path) + + sudo('rm %s -Rf' % env.virtualenv_path) + + if drop_database: + #TODO: drop database + pass + +@task +def fix_permissions(**kwargs): + setup_paths(**kwargs) + + sudo('chmod 777 %s -R' % env.virtualenv_path) + sudo('chgrp www-data %s -R' % env.virtualenv_path) + + +@task +def install_mayan(): + print('Installing Mayan EDMS from git repository') + + with cd(env.install_path): + sudo('virtualenv --no-site-packages %s' % env.virtualenv_name) + + with cd(env.virtualenv_path): + sudo('git clone http://www.github.com/rosarior/mayan %s' % env.repository_name) + sudo('source bin/activate; pip install -r %s/requirements/production.txt' % env.repository_name) + + +@task +def syncdb(**kwargs): + setup_paths(**kwargs) + + with cd(env.virtualenv_path): + sudo('source bin/activate; %(repository_name)s/manage.py syncdb --noinput; %(repository_name)s/manage.py migrate' % (env)) + diff --git a/fabfiles/templates.py b/fabfiles/templates.py new file mode 100644 index 0000000000..510cf10279 --- /dev/null +++ b/fabfiles/templates.py @@ -0,0 +1,20 @@ +import os + +TEMPLATE_DIR = 'fabfiles/templates' + + +class Template(object): + def open(self, filename): + self.descriptor = open(os.path.join(TEMPLATE_DIR, filename), 'r') + + def load(self, filename, context=None): + self.open() + self.content = self.descriptor.read() % (context if context else {}) + + def save_as(self, filename): + output_descriptor = open(filename, 'w') + output_descriptor.write(self.content) + output_descriptor.close() + + def close(self): + self.descriptor.close() diff --git a/fabfiles/templates/apache_site b/fabfiles/templates/apache_site new file mode 100644 index 0000000000..a89641cfcd --- /dev/null +++ b/fabfiles/templates/apache_site @@ -0,0 +1,20 @@ + + # Uncomment if libapache2-mod-xsendfile is installed + # XSendFile On + # XSendFileAllowAbove On + + WSGIScriptAlias / %(repository_path)/wsgi/dispatch.wsgi + + + Order deny,allow + Allow from all + + ErrorLog /var/log/apache2/mayan_error.log + LogLevel warn + CustomLog /var/log/apache2/mayan_access.log combined + + Alias /mayan-static "%(repository_path)/static/" + + SetHandler None + + diff --git a/fabfiles/webservers/__init__.py b/fabfiles/webservers/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/fabfiles/webservers/apache.py b/fabfiles/webservers/apache.py new file mode 100644 index 0000000000..bbdb5bc996 --- /dev/null +++ b/fabfiles/webservers/apache.py @@ -0,0 +1,45 @@ +import os + +from fabric.api import run, sudo, cd, env, task + +from ..templates import Template +from ..conf import setup_paths + + +@task +def install(): + print('Installing apache and mod-wsgi') + + sudo('apt-get install -y apache2 libapache2-mod-wsgi') + # Get rid of Apache's default site + sudo('a2dissite default') + reload_webserver() + + +@task +def install_site(**kwargs): + print('Adding Mayan EDMS\'s virtualhost file to apache') + + setup_paths(**kwargs) + #TODO: mod site with paths + sudo('cp %s /etc/apache2/sites-available/' % os.path.join(env.repository_path, 'contrib/apache/mayan')) + sudo('a2ensite mayan') + + +@task +def remove_site(): + sudo('a2dissite mayan') + + +@task +def restart(): + print('Restarting the web server') + + sudo('/etc/init.d/apache2 restart') + + +@task +def reload(): + print('Reloading the web server') + + sudo('/etc/init.d/apache2 reload')