replace flask.ext.script with custom command interface
This commit is contained in:
parent
fc4ccb8083
commit
7bd6181e06
3 changed files with 197 additions and 210 deletions
|
@ -6,10 +6,24 @@ from __future__ import division
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
import app
|
import api
|
||||||
|
import commands
|
||||||
import server
|
import server
|
||||||
|
|
||||||
if len(sys.argv) > 1 and sys.argv[1] == 'server':
|
if len(sys.argv) > 1 and sys.argv[1] == 'server':
|
||||||
server.run()
|
server.run()
|
||||||
else:
|
else:
|
||||||
app.run()
|
names = [c[8:] for c in dir(commands) if c.startswith('command_')]
|
||||||
|
command = sys.argv[1] if len(sys.argv) > 1 else None
|
||||||
|
if command and command in names:
|
||||||
|
getattr(commands, "command_%s"%command)(sys.argv[1:])
|
||||||
|
else:
|
||||||
|
print 'usage: %s [action]' % 'ctl'
|
||||||
|
indent = max([len(command) for command in names]) + 4
|
||||||
|
for command in sorted(names):
|
||||||
|
space = ' ' * (indent - len(command))
|
||||||
|
info = getattr(commands, "command_%s"%command).__doc__.split('\n')
|
||||||
|
info = [' %s%s' % (' ' * indent, i.strip()) for i in info]
|
||||||
|
info = '\n'.join(info).strip()
|
||||||
|
print " %s%s%s"%(command, space, info)
|
||||||
|
sys.exit(1)
|
||||||
|
|
50
oml/app.py
50
oml/app.py
|
@ -1,50 +0,0 @@
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
# vi:si:et:sw=4:sts=4:ts=4
|
|
||||||
from __future__ import division
|
|
||||||
|
|
||||||
import logging
|
|
||||||
|
|
||||||
|
|
||||||
import settings
|
|
||||||
|
|
||||||
import db
|
|
||||||
import changelog
|
|
||||||
import item.models
|
|
||||||
import user.models
|
|
||||||
import item.person
|
|
||||||
|
|
||||||
import api
|
|
||||||
|
|
||||||
import commands
|
|
||||||
|
|
||||||
'''
|
|
||||||
app = Flask('openmedialibrary', static_folder=settings.static_path)
|
|
||||||
|
|
||||||
|
|
||||||
manager = Manager(app, with_default_commands=False)
|
|
||||||
manager.add_command('release', commands.Release)
|
|
||||||
manager.add_command('debug', commands.Debug)
|
|
||||||
manager.add_command('update', commands.Update)
|
|
||||||
manager.add_command('install_update', commands.InstallUpdate)
|
|
||||||
manager.add_command('start', commands.Start)
|
|
||||||
manager.add_command('stop', commands.Stop)
|
|
||||||
manager.add_command('setup', commands.Setup)
|
|
||||||
manager.add_command('version', commands.Version)
|
|
||||||
manager.add_command('postupdate', commands.PostUpdate)
|
|
||||||
manager.add_command('shell', Shell)
|
|
||||||
manager.add_command('update_static', commands.UpdateStatic)
|
|
||||||
|
|
||||||
@app.route('/')
|
|
||||||
@app.route('/<path:path>')
|
|
||||||
def main(path=None):
|
|
||||||
return app.send_static_file('html/oml.html')
|
|
||||||
|
|
||||||
'''
|
|
||||||
def run():
|
|
||||||
import sys
|
|
||||||
command = sys.argv[1] if len(sys.argv) > 1 else None
|
|
||||||
if command and getattr(commands, "command_%s"%command):
|
|
||||||
getattr(commands, "command_%s"%command)(sys.argv[1:])
|
|
||||||
else:
|
|
||||||
print 'usage: ... fixme'
|
|
||||||
sys.exit(1)
|
|
339
oml/commands.py
339
oml/commands.py
|
@ -7,8 +7,6 @@ from os.path import join, exists, dirname
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
from flask.ext.script import Command, Option
|
|
||||||
|
|
||||||
import settings
|
import settings
|
||||||
|
|
||||||
root_dir = dirname(settings.base_dir)
|
root_dir = dirname(settings.base_dir)
|
||||||
|
@ -38,164 +36,189 @@ def version(module):
|
||||||
version = settings.release['modules'][module]['version']
|
version = settings.release['modules'][module]['version']
|
||||||
return version
|
return version
|
||||||
|
|
||||||
class Version(Command):
|
def command_version(*args):
|
||||||
"""
|
"""
|
||||||
Print current version
|
Print current version
|
||||||
"""
|
"""
|
||||||
def run(self):
|
print version('openmedialibrary')
|
||||||
print version('openmedialibrary')
|
|
||||||
|
|
||||||
class Debug(Command):
|
def command_debug(*args):
|
||||||
"""
|
"""
|
||||||
Start in debug mode
|
Start in debug mode
|
||||||
"""
|
"""
|
||||||
def run(self):
|
pass
|
||||||
|
|
||||||
|
def command_start(*args):
|
||||||
|
"""
|
||||||
|
Start Open Media Libary
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
def command_stop(*args):
|
||||||
|
"""
|
||||||
|
Stop Open Media Libary
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
def command_install_update(*args):
|
||||||
|
"""
|
||||||
|
Install available updates
|
||||||
|
"""
|
||||||
|
import update
|
||||||
|
if not update.install():
|
||||||
|
print "UPDATE FAILED"
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
def command_update(*args):
|
||||||
|
"""
|
||||||
|
Update to latest development version
|
||||||
|
"""
|
||||||
|
import update
|
||||||
|
if not (update.download() and update.install()):
|
||||||
|
print "UPDATE FAILED"
|
||||||
|
|
||||||
|
def command_postupdate(*args):
|
||||||
|
"""
|
||||||
|
Called after update with -o old -n new
|
||||||
|
"""
|
||||||
|
def run(*args):
|
||||||
|
o, old, n, new = args
|
||||||
|
if o != '-o' or n != '-n':
|
||||||
|
print 'usage: -o oldversion -n newversion'
|
||||||
|
sys.exit(1)
|
||||||
|
if old <= '20140521-65-e14c686' and new > '20140521-65-e14c686':
|
||||||
|
if not os.path.exists(settings.db_path):
|
||||||
|
r('./ctl', 'setup')
|
||||||
|
if old <= '20140525-92-eac91e7' and new > '20140525-92-eac91e7':
|
||||||
|
import user.models
|
||||||
|
for u in user.models.User.query:
|
||||||
|
u.update_name()
|
||||||
|
u.save()
|
||||||
|
import item.models
|
||||||
|
for f in item.models.File.query:
|
||||||
|
changed = False
|
||||||
|
for key in ('mediastate', 'coverRatio', 'previewRatio'):
|
||||||
|
if key in f.info:
|
||||||
|
del f.info[key]
|
||||||
|
changed = True
|
||||||
|
if changed:
|
||||||
|
f.save()
|
||||||
|
if old <= '20140526-118-d451eb3' and new > '20140526-118-d451eb3':
|
||||||
|
import item.models
|
||||||
|
item.models.Find.query.filter_by(key='list').delete()
|
||||||
|
|
||||||
|
def command_setup(*args):
|
||||||
|
"""
|
||||||
|
Setup new node
|
||||||
|
"""
|
||||||
|
import setup
|
||||||
|
setup.create_db()
|
||||||
|
setup.create_default_lists()
|
||||||
|
|
||||||
|
def command_update_static(*args):
|
||||||
|
"""
|
||||||
|
Update static files
|
||||||
|
"""
|
||||||
|
oxjs = os.path.join(settings.static_path, 'oxjs')
|
||||||
|
if not os.path.exists(oxjs):
|
||||||
|
r('git', 'clone', 'https://git.0x2620.org/oxjs.git', oxjs)
|
||||||
|
elif os.path.exists(os.path.join(oxjs, '.git')):
|
||||||
|
os.system('cd "%s" && git pull' % oxjs)
|
||||||
|
r('python2', os.path.join(oxjs, 'tools', 'build', 'build.py'))
|
||||||
|
r('python2', os.path.join(settings.static_path, 'py', 'build.py'))
|
||||||
|
|
||||||
|
def command_release(*args):
|
||||||
|
"""
|
||||||
|
Release new version
|
||||||
|
"""
|
||||||
|
print 'checking...'
|
||||||
|
import os
|
||||||
|
import json
|
||||||
|
import hashlib
|
||||||
|
import ed25519
|
||||||
|
|
||||||
|
os.chdir(root_dir)
|
||||||
|
|
||||||
|
with open(os.path.expanduser('~/.openmedialibrary_release.key')) as fd:
|
||||||
|
SIG_KEY=ed25519.SigningKey(fd.read())
|
||||||
|
SIG_ENCODING='base64'
|
||||||
|
|
||||||
|
def sign(release):
|
||||||
|
value = []
|
||||||
|
for module in sorted(release['modules']):
|
||||||
|
value += ['%s/%s' % (release['modules'][module]['version'], release['modules'][module]['sha1'])]
|
||||||
|
value = '\n'.join(value)
|
||||||
|
sig = SIG_KEY.sign(value, encoding=SIG_ENCODING)
|
||||||
|
release['signature'] = sig
|
||||||
|
|
||||||
|
def sha1sum(path):
|
||||||
|
h = hashlib.sha1()
|
||||||
|
with open(path) as fd:
|
||||||
|
for chunk in iter(lambda: fd.read(128*h.block_size), ''):
|
||||||
|
h.update(chunk)
|
||||||
|
return h.hexdigest()
|
||||||
|
|
||||||
|
MODULES = ['platform', 'openmedialibrary']
|
||||||
|
VERSIONS = {module:version(module) for module in MODULES}
|
||||||
|
|
||||||
|
EXCLUDE=[
|
||||||
|
'--exclude', '.git', '--exclude', '.bzr',
|
||||||
|
'--exclude', '.*.swp', '--exclude', '._*', '--exclude', '.DS_Store'
|
||||||
|
]
|
||||||
|
|
||||||
|
#run('./ctl', 'update_static')
|
||||||
|
for module in MODULES:
|
||||||
|
tar = join('updates', '%s-%s.tar.bz2' % (module, VERSIONS[module]))
|
||||||
|
if not exists(tar):
|
||||||
|
cmd = ['tar', 'cvjf', tar, '%s/' % module] + EXCLUDE
|
||||||
|
if module in ('openmedialibrary', ):
|
||||||
|
cmd += ['--exclude', '*.pyc']
|
||||||
|
if module == 'openmedialibrary':
|
||||||
|
cmd += ['--exclude', 'oxjs/examples', '--exclude', 'gunicorn.pid']
|
||||||
|
run(*cmd)
|
||||||
|
release = {}
|
||||||
|
release['modules'] = {module: {
|
||||||
|
'name': '%s-%s.tar.bz2' % (module, VERSIONS[module]),
|
||||||
|
'version': VERSIONS[module],
|
||||||
|
'sha1': sha1sum(join('updates', '%s-%s.tar.bz2' % (module, VERSIONS[module])))
|
||||||
|
} for module in MODULES}
|
||||||
|
sign(release)
|
||||||
|
with open('updates/release.json', 'w') as fd:
|
||||||
|
json.dump(release, fd, indent=2)
|
||||||
|
print 'signed latest release in updates/release.json'
|
||||||
|
|
||||||
|
def command_shell(*args):
|
||||||
|
'''
|
||||||
|
Runs a Python shell inside the application context.
|
||||||
|
'''
|
||||||
|
context = None
|
||||||
|
banner = 'Open Media Library'
|
||||||
|
|
||||||
|
import db
|
||||||
|
with db.session():
|
||||||
|
# Try BPython
|
||||||
|
try:
|
||||||
|
from bpython import embed
|
||||||
|
embed(banner=banner, locals_=context)
|
||||||
|
return
|
||||||
|
except ImportError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
class Start(Command):
|
# Try IPython
|
||||||
"""
|
try:
|
||||||
Start Open Media Libary
|
try:
|
||||||
"""
|
# 0.10.x
|
||||||
def run(self):
|
from IPython.Shell import IPShellEmbed
|
||||||
|
ipshell = IPShellEmbed(banner=banner)
|
||||||
|
ipshell(global_ns=dict(), local_ns=context)
|
||||||
|
except ImportError:
|
||||||
|
# 0.12+
|
||||||
|
from IPython import embed
|
||||||
|
embed(banner1=banner, user_ns=context)
|
||||||
|
return
|
||||||
|
except ImportError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
class Stop(Command):
|
import code
|
||||||
"""
|
# Use basic python shell
|
||||||
Stop Open Media Libary
|
code.interact(banner, local=context)
|
||||||
"""
|
|
||||||
def run(self):
|
|
||||||
pass
|
|
||||||
|
|
||||||
class InstallUpdate(Command):
|
|
||||||
"""
|
|
||||||
Update to latest development version
|
|
||||||
"""
|
|
||||||
def run(self):
|
|
||||||
import update
|
|
||||||
if not update.install():
|
|
||||||
print "UPDATE FAILED"
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
class Update(Command):
|
|
||||||
"""
|
|
||||||
Update to latest development version
|
|
||||||
"""
|
|
||||||
def run(self):
|
|
||||||
import update
|
|
||||||
if not (update.download() and update.install()):
|
|
||||||
print "UPDATE FAILED"
|
|
||||||
|
|
||||||
class PostUpdate(Command):
|
|
||||||
"""
|
|
||||||
Called by update to fix stuff
|
|
||||||
"""
|
|
||||||
def get_options(self):
|
|
||||||
return [
|
|
||||||
Option('-o', '--old', dest='old'),
|
|
||||||
Option('-n', '--new', dest='new'),
|
|
||||||
]
|
|
||||||
|
|
||||||
def run(self, old, new):
|
|
||||||
if old <= '20140521-65-e14c686' and new > '20140521-65-e14c686':
|
|
||||||
if not os.path.exists(settings.db_path):
|
|
||||||
r('./ctl', 'setup')
|
|
||||||
if old <= '20140525-92-eac91e7' and new > '20140525-92-eac91e7':
|
|
||||||
import user.models
|
|
||||||
for u in user.models.User.query:
|
|
||||||
u.update_name()
|
|
||||||
u.save()
|
|
||||||
import item.models
|
|
||||||
for f in item.models.File.query:
|
|
||||||
changed = False
|
|
||||||
for key in ('mediastate', 'coverRatio', 'previewRatio'):
|
|
||||||
if key in f.info:
|
|
||||||
del f.info[key]
|
|
||||||
changed = True
|
|
||||||
if changed:
|
|
||||||
f.save()
|
|
||||||
if old <= '20140526-118-d451eb3' and new > '20140526-118-d451eb3':
|
|
||||||
import item.models
|
|
||||||
item.models.Find.query.filter_by(key='list').delete()
|
|
||||||
|
|
||||||
class Setup(Command):
|
|
||||||
"""
|
|
||||||
Setup new node
|
|
||||||
"""
|
|
||||||
def run(self):
|
|
||||||
import setup
|
|
||||||
setup.create_db()
|
|
||||||
setup.create_default_lists()
|
|
||||||
|
|
||||||
class UpdateStatic(Command):
|
|
||||||
"""
|
|
||||||
Update static files
|
|
||||||
"""
|
|
||||||
def run(self):
|
|
||||||
oxjs = os.path.join(settings.static_path, 'oxjs')
|
|
||||||
if not os.path.exists(oxjs):
|
|
||||||
r('git', 'clone', 'https://git.0x2620.org/oxjs.git', oxjs)
|
|
||||||
elif os.path.exists(os.path.join(oxjs, '.git')):
|
|
||||||
os.system('cd "%s" && git pull' % oxjs)
|
|
||||||
r('python2', os.path.join(oxjs, 'tools', 'build', 'build.py'))
|
|
||||||
r('python2', os.path.join(settings.static_path, 'py', 'build.py'))
|
|
||||||
|
|
||||||
class Release(Command):
|
|
||||||
"""
|
|
||||||
Release new version
|
|
||||||
"""
|
|
||||||
def run(self):
|
|
||||||
print 'checking...'
|
|
||||||
import os
|
|
||||||
import json
|
|
||||||
import hashlib
|
|
||||||
import ed25519
|
|
||||||
|
|
||||||
os.chdir(root_dir)
|
|
||||||
|
|
||||||
with open(os.path.expanduser('~/.openmedialibrary_release.key')) as fd:
|
|
||||||
SIG_KEY=ed25519.SigningKey(fd.read())
|
|
||||||
SIG_ENCODING='base64'
|
|
||||||
|
|
||||||
def sign(release):
|
|
||||||
value = []
|
|
||||||
for module in sorted(release['modules']):
|
|
||||||
value += ['%s/%s' % (release['modules'][module]['version'], release['modules'][module]['sha1'])]
|
|
||||||
value = '\n'.join(value)
|
|
||||||
sig = SIG_KEY.sign(value, encoding=SIG_ENCODING)
|
|
||||||
release['signature'] = sig
|
|
||||||
|
|
||||||
def sha1sum(path):
|
|
||||||
h = hashlib.sha1()
|
|
||||||
with open(path) as fd:
|
|
||||||
for chunk in iter(lambda: fd.read(128*h.block_size), ''):
|
|
||||||
h.update(chunk)
|
|
||||||
return h.hexdigest()
|
|
||||||
|
|
||||||
MODULES = ['platform', 'openmedialibrary']
|
|
||||||
VERSIONS = {module:version(module) for module in MODULES}
|
|
||||||
|
|
||||||
EXCLUDE=[
|
|
||||||
'--exclude', '.git', '--exclude', '.bzr',
|
|
||||||
'--exclude', '.*.swp', '--exclude', '._*', '--exclude', '.DS_Store'
|
|
||||||
]
|
|
||||||
|
|
||||||
#run('./ctl', 'update_static')
|
|
||||||
for module in MODULES:
|
|
||||||
tar = join('updates', '%s-%s.tar.bz2' % (module, VERSIONS[module]))
|
|
||||||
if not exists(tar):
|
|
||||||
cmd = ['tar', 'cvjf', tar, '%s/' % module] + EXCLUDE
|
|
||||||
if module in ('openmedialibrary', ):
|
|
||||||
cmd += ['--exclude', '*.pyc']
|
|
||||||
if module == 'openmedialibrary':
|
|
||||||
cmd += ['--exclude', 'oxjs/examples', '--exclude', 'gunicorn.pid']
|
|
||||||
run(*cmd)
|
|
||||||
release = {}
|
|
||||||
release['modules'] = {module: {
|
|
||||||
'name': '%s-%s.tar.bz2' % (module, VERSIONS[module]),
|
|
||||||
'version': VERSIONS[module],
|
|
||||||
'sha1': sha1sum(join('updates', '%s-%s.tar.bz2' % (module, VERSIONS[module])))
|
|
||||||
} for module in MODULES}
|
|
||||||
sign(release)
|
|
||||||
with open('updates/release.json', 'w') as fd:
|
|
||||||
json.dump(release, fd, indent=2)
|
|
||||||
print 'signed latest release in updates/release.json'
|
|
||||||
|
|
Loading…
Reference in a new issue