104 lines
4.2 KiB
Python
104 lines
4.2 KiB
Python
|
from optparse import make_option
|
||
|
from os import path
|
||
|
|
||
|
from django.core.management.base import BaseCommand
|
||
|
|
||
|
from orchestra.utils.paths import get_site_root, get_orchestra_root
|
||
|
from orchestra.utils.system import run, check_root
|
||
|
|
||
|
|
||
|
class Command(BaseCommand):
|
||
|
def __init__(self, *args, **kwargs):
|
||
|
super(Command, self).__init__(*args, **kwargs)
|
||
|
self.option_list = BaseCommand.option_list + (
|
||
|
make_option('--username', dest='username', default='orchestra',
|
||
|
help='Specifies the system user that would run celeryd.'),
|
||
|
make_option('--processes', dest='processes', default=5,
|
||
|
help='Number of celeryd processes.'),
|
||
|
make_option('--noinput', action='store_false', dest='interactive', default=True,
|
||
|
help='Tells Django to NOT prompt the user for input of any kind. '
|
||
|
'You must use --username with --noinput, and must contain the '
|
||
|
'cleleryd process owner, which is the user how will perform tincd updates'),
|
||
|
)
|
||
|
|
||
|
option_list = BaseCommand.option_list
|
||
|
help = 'Configure Celeryd to run with your orchestra instance.'
|
||
|
|
||
|
@check_root
|
||
|
def handle(self, *args, **options):
|
||
|
context = {
|
||
|
'site_root': get_site_root(),
|
||
|
'username': options.get('username'),
|
||
|
'bin_path': path.join(get_orchestra_root(), 'bin'),
|
||
|
'processes': options.get('processes'),
|
||
|
}
|
||
|
|
||
|
celery_config = (
|
||
|
'# Name of nodes to start, here we have a single node\n'
|
||
|
'CELERYD_NODES="w1"\n'
|
||
|
'\n'
|
||
|
'# Where to chdir at start.\n'
|
||
|
'CELERYD_CHDIR="%(site_root)s"\n'
|
||
|
'\n'
|
||
|
'# How to call "manage.py celeryd_multi"\n'
|
||
|
'CELERYD_MULTI="$CELERYD_CHDIR/manage.py celeryd_multi"\n'
|
||
|
'\n'
|
||
|
'# Extra arguments to celeryd\n'
|
||
|
'CELERYD_OPTS="-P:w1 processes -c:w1 %(processes)s -Q:w1 celery"\n'
|
||
|
'\n'
|
||
|
'# Name of the celery config module.\n'
|
||
|
'CELERY_CONFIG_MODULE="celeryconfig"\n'
|
||
|
'\n'
|
||
|
'# %%n will be replaced with the nodename.\n'
|
||
|
'CELERYD_LOG_FILE="/var/log/celery/%%n.log"\n'
|
||
|
'CELERYD_PID_FILE="/var/run/celery/%%n.pid"\n'
|
||
|
'CELERY_CREATE_DIRS=1\n'
|
||
|
'\n'
|
||
|
'# Full path to the celeryd logfile.\n'
|
||
|
'CELERYEV_LOG_FILE="/var/log/celery/celeryev.log"\n'
|
||
|
'CELERYEV_PID_FILE="/var/run/celery/celeryev.pid"\n'
|
||
|
'\n'
|
||
|
'# Workers should run as an unprivileged user.\n'
|
||
|
'CELERYD_USER="%(username)s"\n'
|
||
|
'CELERYD_GROUP="$CELERYD_USER"\n'
|
||
|
'\n'
|
||
|
'# Persistent revokes\n'
|
||
|
'CELERYD_STATE_DB="$CELERYD_CHDIR/persistent_revokes"\n'
|
||
|
'\n'
|
||
|
'# Celeryev\n'
|
||
|
'CELERYEV="$CELERYD_CHDIR/manage.py"\n'
|
||
|
'CELERYEV_CAM="djcelery.snapshot.Camera"\n'
|
||
|
'CELERYEV_USER="$CELERYD_USER"\n'
|
||
|
'CELERYEV_GROUP="$CELERYD_USER"\n'
|
||
|
'CELERYEV_OPTS="celerycam"\n'
|
||
|
'\n'
|
||
|
'# Celerybeat\n'
|
||
|
'CELERYBEAT="${CELERYD_CHDIR}/manage.py celerybeat"\n'
|
||
|
'CELERYBEAT_USER="$CELERYD_USER"\n'
|
||
|
'CELERYBEAT_GROUP="$CELERYD_USER"\n'
|
||
|
'CELERYBEAT_CHDIR="$CELERYD_CHDIR"\n'
|
||
|
'CELERYBEAT_OPTS="--schedule=/var/run/celerybeat-schedule"\n' % context
|
||
|
)
|
||
|
|
||
|
run("echo '%s' > /etc/default/celeryd" % celery_config)
|
||
|
|
||
|
# https://raw.github.com/celery/celery/master/extra/generic-init.d/
|
||
|
for script in ['celeryevcam', 'celeryd', 'celerybeat']:
|
||
|
context['script'] = script
|
||
|
run('cp %(bin_path)s/%(script)s /etc/init.d/%(script)s' % context)
|
||
|
run('chmod +x /etc/init.d/%(script)s' % context)
|
||
|
run('update-rc.d %(script)s defaults' % context)
|
||
|
|
||
|
rotate = (
|
||
|
'/var/log/celery/*.log {\n'
|
||
|
' weekly\n'
|
||
|
' missingok\n'
|
||
|
' rotate 10\n'
|
||
|
' compress\n'
|
||
|
' delaycompress\n'
|
||
|
' notifempty\n'
|
||
|
' copytruncate\n'
|
||
|
'}'
|
||
|
)
|
||
|
run("echo '%s' > /etc/logrotate.d/celeryd" % rotate)
|