Implement gmg serve
and gmg celery
.
There was an existing stub for `gmg serve`, but had never been completed. This will make it simpler to run the MediaGoblin web interface and media processing backend.
This commit is contained in:
parent
ef29477b4d
commit
af09b76392
@ -70,6 +70,10 @@ SUBCOMMAND_MAP = {
|
||||
'setup': 'mediagoblin.gmg_commands.serve:parser_setup',
|
||||
'func': 'mediagoblin.gmg_commands.serve:serve',
|
||||
'help': 'PasteScript replacement'},
|
||||
'celery': {
|
||||
'setup': 'mediagoblin.gmg_commands.celery:parser_setup',
|
||||
'func': 'mediagoblin.gmg_commands.celery:celery',
|
||||
'help': 'Run the celery media processing backend'},
|
||||
'batchaddmedia': {
|
||||
'setup': 'mediagoblin.gmg_commands.batchaddmedia:parser_setup',
|
||||
'func': 'mediagoblin.gmg_commands.batchaddmedia:batchaddmedia',
|
||||
|
36
mediagoblin/gmg_commands/celery.py
Normal file
36
mediagoblin/gmg_commands/celery.py
Normal file
@ -0,0 +1,36 @@
|
||||
# GNU MediaGoblin -- federated, autonomous media hosting
|
||||
# Copyright (C) 2011, 2012 MediaGoblin contributors. See AUTHORS.
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
import os
|
||||
from celery import current_app
|
||||
|
||||
|
||||
def parser_setup(subparser):
|
||||
# No arguments as celery is configured through mediagoblin.ini and
|
||||
# paste.ini.
|
||||
pass
|
||||
|
||||
|
||||
def celery(args):
|
||||
os.environ['CELERY_CONFIG_MODULE'] = 'mediagoblin.init.celery.from_celery'
|
||||
from mediagoblin.init.celery.from_celery import setup_self
|
||||
|
||||
# We run setup_self() to initialise Celery with its queue config and set of
|
||||
# tasks. That doesn't return anything, so we pick up the configured celery
|
||||
# via current_app (kinda scary to manage state like this but oh well).
|
||||
setup_self()
|
||||
worker = current_app.Worker()
|
||||
worker.start()
|
@ -14,33 +14,14 @@
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
import sys
|
||||
|
||||
from paste.deploy import loadapp, loadserver
|
||||
|
||||
|
||||
class ServeCommand:
|
||||
|
||||
def loadserver(self, server_spec, name, relative_to, **kwargs):
|
||||
return loadserver(server_spec, name=name, relative_to=relative_to,
|
||||
**kwargs)
|
||||
|
||||
def loadapp(self, app_spec, name, relative_to, **kwargs):
|
||||
return loadapp(app_spec, name=name, relative_to=relative_to, **kwargs)
|
||||
|
||||
def daemonize(self):
|
||||
pass
|
||||
|
||||
def restart_with_reloader(self):
|
||||
pass
|
||||
|
||||
def restart_with_monitor(self, reloader=False):
|
||||
pass
|
||||
|
||||
def run(self):
|
||||
print('Running...')
|
||||
from paste.script.command import get_commands, invoke
|
||||
|
||||
|
||||
def parser_setup(subparser):
|
||||
# Duplicating these arguments so that `gmg serve` will accept them and
|
||||
# provide command-line help. We don't actually used the parsed arguments.
|
||||
subparser.add_argument('config', metavar='CONFIG_FILE')
|
||||
subparser.add_argument('command',
|
||||
choices=['start', 'stop', 'restart', 'status'],
|
||||
@ -60,5 +41,24 @@ def parser_setup(subparser):
|
||||
|
||||
|
||||
def serve(args):
|
||||
serve_cmd = ServeCommand() # TODO: pass args to it
|
||||
serve_cmd.run()
|
||||
# Option 1: Run Paste Script's ServeCommand from Python.
|
||||
#
|
||||
# Taking the lead from paste.script.command.run and re-using their "serve"
|
||||
# command. We don't have an easy way to feed the already parsed arguments
|
||||
# through though, so we're pulling these directly from argv.
|
||||
args = sys.argv
|
||||
args_after_subcommand = args[args.index('serve') + 1:]
|
||||
command = get_commands()['serve'].load()
|
||||
invoke(command, 'serve', {}, args_after_subcommand)
|
||||
|
||||
# Option 2: Serve with Waitress.
|
||||
#
|
||||
# Works but has no reloading capabilities but unlike Paste Script doesn't know where to
|
||||
# find the static files.
|
||||
#
|
||||
# Hupper has an example of waitress + reloading:
|
||||
# https://docs.pylonsproject.org/projects/hupper/en/master/#api-usage
|
||||
# from mediagoblin.app import MediaGoblinApp
|
||||
# from waitress import serve
|
||||
# app = MediaGoblinApp('mediagoblin.ini')
|
||||
# serve(app, listen='*:6543')
|
||||
|
Loading…
x
Reference in New Issue
Block a user