diff --git a/oml/__main__.py b/oml/__main__.py index bfeb8ee..c303fd0 100644 --- a/oml/__main__.py +++ b/oml/__main__.py @@ -6,10 +6,24 @@ from __future__ import division import os import sys -import app +import api +import commands import server if len(sys.argv) > 1 and sys.argv[1] == 'server': server.run() 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) diff --git a/oml/app.py b/oml/app.py deleted file mode 100644 index 0dbfc86..0000000 --- a/oml/app.py +++ /dev/null @@ -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('/') -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) diff --git a/oml/commands.py b/oml/commands.py index a6a073b..ef05dc6 100644 --- a/oml/commands.py +++ b/oml/commands.py @@ -7,8 +7,6 @@ from os.path import join, exists, dirname import os import sys -from flask.ext.script import Command, Option - import settings root_dir = dirname(settings.base_dir) @@ -38,164 +36,189 @@ def version(module): version = settings.release['modules'][module]['version'] return version -class Version(Command): - """ - Print current version - """ - def run(self): - print version('openmedialibrary') +def command_version(*args): + """ + Print current version + """ + print version('openmedialibrary') -class Debug(Command): - """ - Start in debug mode - """ - def run(self): +def command_debug(*args): + """ + Start in debug mode + """ + 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 -class Start(Command): - """ - Start Open Media Libary - """ - def run(self): + # Try IPython + try: + try: + # 0.10.x + 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 -class Stop(Command): - """ - Stop Open Media Libary - """ - 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' + import code + # Use basic python shell + code.interact(banner, local=context)