Added tasks app

This commit is contained in:
Marc Aymerich 2015-05-04 10:48:09 +00:00
parent 096ec56b7c
commit 80b4fde287
7 changed files with 90 additions and 27 deletions

View File

@ -31,10 +31,10 @@ However, Orchestra also provides glue, tools and patterns that you may find very
Fast Deployment Setup Fast Deployment Setup
--------------------- ---------------------
To only run the Python interface follow these steps: To only run the web interface follow these steps:
```bash ```bash
# Create a new virtualenv # Create and activate a Python virtualenv
python3 -mvenv env-django-orchestra python3 -mvenv env-django-orchestra
source env-django-orchestra/bin/activate source env-django-orchestra/bin/activate

40
TODO.md
View File

@ -380,3 +380,43 @@ Collecting lxml==3.3.5 (from -r re (line 22))
# standard django deployment pracices (run checks) # standard django deployment pracices (run checks)
# setup main systemuser on post_migrate SystemUser # setup main systemuser on post_migrate SystemUser
# Provide some fixtures with mocked data # Provide some fixtures with mocked data
# don't make hard dependencies strict dependencies, fail when needed.
# on project_settings add debug settings but commented
# rename context processes varbailes to its original name
# TODO http://wiki2.dovecot.org/HowTo/SimpleVirtualInstall
# TODO http://wiki2.dovecot.org/HowTo/VirtualUserFlatFilesPostfix
# TODO mount the filesystem with "nosuid" option
# execute Make after postfix update
# setupuwsgi + setupnginx
if not cert:
sudo mkdir /etc/nginx/ssl
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/nginx.crt
if --noinput
openssl req \
-new \
-newkey rsa:4096 \
-days 365 \
-nodes \
-x509 \
-subj "/C=US/ST=Denial/L=Springfield/O=Dis/CN=www.example.com" \
-keyout www.example.com.key \
-out www.example.com.cert
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
if server_name:
at sites-enabled
server_name your_domain.com;
else conf-enabled

View File

@ -111,8 +111,10 @@ class Bind9MasterDomainBackend(ServiceController):
def get_slaves(self, domain): def get_slaves(self, domain):
ips = [] ips = []
masters = self.get_masters(domain) masters = self.get_masters(domain)
for ns in domain.records.filter(type=Record.NS): ns_queryset = domain.records.filter(type=Record.NS).values_list('value', flat=True)
hostname = ns.value.rstrip('.') ns_records = ns_queryset or settings.DOMAINS_DEFAULT_NS
for ns in ns_records:
hostname = ns.rstrip('.')
# First try with a DNS query, a more reliable source # First try with a DNS query, a more reliable source
try: try:
addr = socket.gethostbyname(hostname) addr = socket.gethostbyname(hostname)
@ -123,7 +125,7 @@ class Bind9MasterDomainBackend(ServiceController):
except Domain.DoesNotExist: except Domain.DoesNotExist:
continue continue
else: else:
a_record = domain.records.filter(name=Record.A) or [settings.DOMAINS_DEFAULT_NS] a_record = domain.records.filter(name=Record.A) or [settings.DOMAINS_DEFAULT_A]
addr = a_record[0] addr = a_record[0]
if addr not in masters: if addr not in masters:
ips.append(addr) ips.append(addr)

View File

@ -2,6 +2,7 @@ import textwrap
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from orchestra.contrib.domains.models import Domain, Record
from orchestra.contrib.orchestration import ServiceController, replace from orchestra.contrib.orchestration import ServiceController, replace
from orchestra.contrib.resources import ServiceMonitor from orchestra.contrib.resources import ServiceMonitor
@ -36,6 +37,9 @@ class MailmanBackend(ServiceController):
def include_virtual_alias_domain(self, context): def include_virtual_alias_domain(self, context):
if context['address_domain']: if context['address_domain']:
# Check if the domain is hosted on this mail server
# TODO this is dependent on the domain model
if Domain.objects.filter(records__type=Record.MX, name=context['address_domain']).exists():
self.append(textwrap.dedent(""" self.append(textwrap.dedent("""
[[ $(grep '^\s*%(address_domain)s\s*$' %(virtual_alias_domains)s) ]] || { [[ $(grep '^\s*%(address_domain)s\s*$' %(virtual_alias_domains)s) ]] || {
echo '%(address_domain)s' >> %(virtual_alias_domains)s echo '%(address_domain)s' >> %(virtual_alias_domains)s

View File

@ -6,6 +6,7 @@ import textwrap
from django.core.exceptions import ObjectDoesNotExist from django.core.exceptions import ObjectDoesNotExist
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from orchestra.contrib.domains.models import Domain, Record
from orchestra.contrib.orchestration import ServiceController, replace from orchestra.contrib.orchestration import ServiceController, replace
from orchestra.contrib.resources import ServiceMonitor from orchestra.contrib.resources import ServiceMonitor
#from orchestra.utils.humanize import unit_to_bytes #from orchestra.utils.humanize import unit_to_bytes
@ -13,10 +14,6 @@ from orchestra.contrib.resources import ServiceMonitor
from . import settings from . import settings
from .models import Address from .models import Address
# TODO http://wiki2.dovecot.org/HowTo/SimpleVirtualInstall
# TODO http://wiki2.dovecot.org/HowTo/VirtualUserFlatFilesPostfix
# TODO mount the filesystem with "nosuid" option
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -220,6 +217,9 @@ class PostfixAddressBackend(ServiceController):
) )
def include_virtual_alias_domain(self, context): def include_virtual_alias_domain(self, context):
if context['domain'] != context['local_domain']: if context['domain'] != context['local_domain']:
# Check if the domain is hosted on this mail server
# TODO this is dependent on the domain model
if Domain.objects.filter(records__type=Record.MX, name=context['address_domain']).exists():
self.append(textwrap.dedent(""" self.append(textwrap.dedent("""
[[ $(grep '^\s*%(domain)s\s*$' %(virtual_alias_domains)s) ]] || { [[ $(grep '^\s*%(domain)s\s*$' %(virtual_alias_domains)s) ]] || {
echo '%(domain)s' >> %(virtual_alias_domains)s echo '%(domain)s' >> %(virtual_alias_domains)s

View File

@ -76,16 +76,16 @@ def task(fn=None, **kwargs):
from . import settings from . import settings
# register task # register task
if fn is None: if fn is None:
name = kwargs.get('name', None)
if settings.TASKS_BACKEND in ('thread', 'process'): if settings.TASKS_BACKEND in ('thread', 'process'):
def decorator(fn): def decorator(fn):
return apply_async(celery_shared_task(fn)) return apply_async(celery_shared_task(**kwargs)(fn), name=name)
return decorator return decorator
else: else:
return celery_shared_task(**kwargs) return celery_shared_task(**kwargs)
fn = update_wraper(partial(celery_shared_task, fn)) fn = update_wraper(partial(celery_shared_task, fn))
if settings.TASKS_BACKEND in ('thread', 'process'): if settings.TASKS_BACKEND in ('thread', 'process'):
name = kwargs.pop('name', None) fn = update_wrapper(apply_async(fn), fn)
fn = update_wrapper(apply_async(fn, name), fn)
return fn return fn
@ -93,13 +93,14 @@ def periodic_task(fn=None, **kwargs):
from . import settings from . import settings
# register task # register task
if fn is None: if fn is None:
name = kwargs.get('name', None)
if settings.TASKS_BACKEND in ('thread', 'process'): if settings.TASKS_BACKEND in ('thread', 'process'):
def decorator(fn): def decorator(fn):
return apply_async(celery_periodic_task(fn)) return apply_async(celery_periodic_task(**kwargs)(fn), name=name)
return decorator return decorator
else: else:
return celery_periodic_task(**kwargs) return celery_periodic_task(**kwargs)
fn = update_wraper(partial(celery_periodic_task, fn)) fn = update_wraper(celery_periodic_task(fn), fn)
if settings.TASKS_BACKEND in ('thread', 'process'): if settings.TASKS_BACKEND in ('thread', 'process'):
name = kwargs.pop('name', None) name = kwargs.pop('name', None)
fn = update_wrapper(apply_async(fn, name), fn) fn = update_wrapper(apply_async(fn, name), fn)

View File

@ -13,7 +13,13 @@ class Command(BaseCommand):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super(Command, self).__init__(*args, **kwargs) super(Command, self).__init__(*args, **kwargs)
self.option_list = BaseCommand.option_list + ( self.option_list = BaseCommand.option_list + (
make_option('--user', dest='user', default=get_default_celeryd_username(), make_option('--cert', dest='cert', default='',
help='Nginx SSL certificate, one will be created by default.'),
make_option('--cert-key', dest='cert_key', default='',
help='Nginx SSL certificate key.'),
make_option('--server-name', dest='server_name', default='',
help='Nginx SSL certificate key.'),
make_option('--user', dest='user', default='',
help='uWSGI daemon user.'), help='uWSGI daemon user.'),
make_option('--group', dest='group', default='', make_option('--group', dest='group', default='',
help='uWSGI daemon group.'), help='uWSGI daemon group.'),
@ -32,6 +38,16 @@ class Command(BaseCommand):
def handle(self, *args, **options): def handle(self, *args, **options):
interactive = options.get('interactive') interactive = options.get('interactive')
cert = options.get('cert')
cert_key = options.get('cert_key')
if bool(cert) != bool(cert_key):
raise CommandError("--cert and --cert-key go in tandem")
if not cert:
run("mkdir -p /etc/nginx/ssl")
if interactive:
run("openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/nginx.crt")
context = { context = {
'project_name': paths.get_project_name(), 'project_name': paths.get_project_name(),
'project_dir': paths.get_project_dir(), 'project_dir': paths.get_project_dir(),