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:
Ben Sturmfels 2021-09-17 21:39:48 +10:00
parent ef29477b4d
commit af09b76392
No known key found for this signature in database
GPG Key ID: 023C05E2C9C068F0
3 changed files with 65 additions and 25 deletions

View File

@ -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',

View 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()

View File

@ -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')