Proper loading of plugins on debug
Restarting functions
This commit is contained in:
+35
-4
@@ -5,6 +5,8 @@
|
|||||||
from os.path import dirname
|
from os.path import dirname
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
|
import subprocess
|
||||||
|
|
||||||
|
|
||||||
# Root path
|
# Root path
|
||||||
base_path = dirname(os.path.abspath(__file__))
|
base_path = dirname(os.path.abspath(__file__))
|
||||||
@@ -15,10 +17,39 @@ sys.path.insert(0, os.path.join(base_path, 'libs'))
|
|||||||
from couchpotato.core.logger import CPLog
|
from couchpotato.core.logger import CPLog
|
||||||
log = CPLog(__name__)
|
log = CPLog(__name__)
|
||||||
|
|
||||||
|
# Get options via arg
|
||||||
|
from couchpotato.cli import getOptions
|
||||||
|
options = getOptions(base_path, sys.argv[1:])
|
||||||
|
|
||||||
|
def start():
|
||||||
|
try:
|
||||||
|
args = [sys.executable] + sys.argv
|
||||||
|
new_environ = os.environ.copy()
|
||||||
|
new_environ['cp_main'] = 'true'
|
||||||
|
|
||||||
|
if os.name == 'nt':
|
||||||
|
for key, value in new_environ.iteritems():
|
||||||
|
if isinstance(value, unicode):
|
||||||
|
new_environ[key] = value.encode('iso-8859-1')
|
||||||
|
|
||||||
|
subprocess.call(args, env = new_environ)
|
||||||
|
return os.path.isfile(os.path.join(options.data_dir, 'restart'))
|
||||||
|
except Exception, e:
|
||||||
|
log.critical(e)
|
||||||
|
return 0
|
||||||
|
|
||||||
from couchpotato import cli
|
from couchpotato import cli
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
try:
|
|
||||||
cli.cmd_couchpotato(base_path, sys.argv[1:])
|
if os.environ.get('cp_main', 'false') == 'true':
|
||||||
except Exception, e:
|
try:
|
||||||
log.critical(e)
|
cli.cmd_couchpotato(options, base_path, sys.argv[1:])
|
||||||
|
except Exception, e:
|
||||||
|
log.critical(e)
|
||||||
|
else:
|
||||||
|
while 1:
|
||||||
|
restart = start()
|
||||||
|
if not restart:
|
||||||
|
break
|
||||||
|
|
||||||
|
sys.exit()
|
||||||
|
|||||||
+31
-26
@@ -9,9 +9,7 @@ import logging
|
|||||||
import os.path
|
import os.path
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
|
def getOptions(base_path, args):
|
||||||
def cmd_couchpotato(base_path, args):
|
|
||||||
'''Commandline entry point.'''
|
|
||||||
|
|
||||||
# Options
|
# Options
|
||||||
parser = ArgumentParser(prog = 'CouchPotato.py')
|
parser = ArgumentParser(prog = 'CouchPotato.py')
|
||||||
@@ -28,10 +26,16 @@ def cmd_couchpotato(base_path, args):
|
|||||||
|
|
||||||
options = parser.parse_args(args)
|
options = parser.parse_args(args)
|
||||||
|
|
||||||
|
options.data_dir = os.path.expanduser(options.data_dir)
|
||||||
|
|
||||||
|
return options
|
||||||
|
|
||||||
|
|
||||||
|
def cmd_couchpotato(options, base_path, args):
|
||||||
|
'''Commandline entry point.'''
|
||||||
|
|
||||||
# Create data dir if needed
|
# Create data dir if needed
|
||||||
if not os.path.isdir(options.data_dir):
|
if not os.path.isdir(options.data_dir):
|
||||||
options.data_dir = os.path.expanduser(options.data_dir)
|
|
||||||
os.makedirs(options.data_dir)
|
os.makedirs(options.data_dir)
|
||||||
|
|
||||||
# Create logging dir
|
# Create logging dir
|
||||||
@@ -91,35 +95,36 @@ def cmd_couchpotato(base_path, args):
|
|||||||
log.debug('Started with options %s' % options)
|
log.debug('Started with options %s' % options)
|
||||||
|
|
||||||
|
|
||||||
# Load configs & plugins
|
# Load configs & plugins (only run once when debugging)
|
||||||
loader = Env.get('loader')
|
if os.environ.get('WERKZEUG_RUN_MAIN') or not debug:
|
||||||
loader.preload(root = base_path)
|
loader = Env.get('loader')
|
||||||
loader.run()
|
loader.preload(root = base_path)
|
||||||
|
loader.run()
|
||||||
|
|
||||||
|
|
||||||
# Load migrations
|
# Load migrations
|
||||||
from migrate.versioning.api import version_control, db_version, version, upgrade
|
from migrate.versioning.api import version_control, db_version, version, upgrade
|
||||||
db = Env.get('db_path')
|
db = Env.get('db_path')
|
||||||
repo = os.path.join(base_path, 'couchpotato', 'core', 'migration')
|
repo = os.path.join(base_path, 'couchpotato', 'core', 'migration')
|
||||||
logging.getLogger('migrate').setLevel(logging.WARNING) # Disable logging for migration
|
logging.getLogger('migrate').setLevel(logging.WARNING) # Disable logging for migration
|
||||||
|
|
||||||
latest_db_version = version(repo)
|
latest_db_version = version(repo)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
current_db_version = db_version(db, repo)
|
current_db_version = db_version(db, repo)
|
||||||
except:
|
except:
|
||||||
version_control(db, repo, version = latest_db_version)
|
version_control(db, repo, version = latest_db_version)
|
||||||
current_db_version = db_version(db, repo)
|
current_db_version = db_version(db, repo)
|
||||||
|
|
||||||
if current_db_version < latest_db_version and not debug:
|
if current_db_version < latest_db_version and not debug:
|
||||||
log.info('Doing database upgrade. From %d to %d' % (current_db_version, latest_db_version))
|
log.info('Doing database upgrade. From %d to %d' % (current_db_version, latest_db_version))
|
||||||
upgrade(db, repo)
|
upgrade(db, repo)
|
||||||
|
|
||||||
# Configure Database
|
# Configure Database
|
||||||
from couchpotato.core.settings.model import setup
|
from couchpotato.core.settings.model import setup
|
||||||
setup()
|
setup()
|
||||||
|
|
||||||
fireEventAsync('app.load')
|
fireEventAsync('app.load')
|
||||||
|
|
||||||
# Create app
|
# Create app
|
||||||
from couchpotato import app
|
from couchpotato import app
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
|
from .main import Core
|
||||||
from uuid import uuid4
|
from uuid import uuid4
|
||||||
|
|
||||||
def start():
|
def start():
|
||||||
pass
|
return Core()
|
||||||
|
|
||||||
config = [{
|
config = [{
|
||||||
'name': 'core',
|
'name': 'core',
|
||||||
|
|||||||
@@ -0,0 +1,54 @@
|
|||||||
|
from couchpotato.api import addApiView
|
||||||
|
from couchpotato.core.event import fireEvent
|
||||||
|
from couchpotato.core.logger import CPLog
|
||||||
|
from couchpotato.core.plugins.base import Plugin
|
||||||
|
from couchpotato.environment import Env
|
||||||
|
from flask import request
|
||||||
|
import os
|
||||||
|
|
||||||
|
|
||||||
|
log = CPLog(__name__)
|
||||||
|
|
||||||
|
class Core(Plugin):
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
addApiView('app.shutdown', self.shutdown)
|
||||||
|
addApiView('app.restart', self.restart)
|
||||||
|
|
||||||
|
self.removeRestartFile()
|
||||||
|
|
||||||
|
def shutdown(self):
|
||||||
|
self.initShutdown()
|
||||||
|
return 'shutdown'
|
||||||
|
|
||||||
|
def restart(self):
|
||||||
|
self.initShutdown(restart = True)
|
||||||
|
return 'restarting'
|
||||||
|
|
||||||
|
def initShutdown(self, restart = False):
|
||||||
|
|
||||||
|
fireEvent('app.shutdown')
|
||||||
|
|
||||||
|
if restart:
|
||||||
|
self.writeRestartFile()
|
||||||
|
|
||||||
|
func = request.environ.get('werkzeug.server.shutdown')
|
||||||
|
if func is None:
|
||||||
|
raise RuntimeError('Not running with the Werkzeug Server')
|
||||||
|
func()
|
||||||
|
|
||||||
|
def removeRestartFile(self):
|
||||||
|
try:
|
||||||
|
os.remove(self.restartFilePath())
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
def writeRestartFile(self):
|
||||||
|
try:
|
||||||
|
with open(self.restartFilePath(), 'w') as f:
|
||||||
|
f.write('This is the most suckiest way to register if CP is restarted. Ever...')
|
||||||
|
except Exception, e:
|
||||||
|
log.error('Could not write shutdown file: %s' % e)
|
||||||
|
|
||||||
|
def restartFilePath(self):
|
||||||
|
return os.path.join(Env.get('data_dir'), 'restart')
|
||||||
@@ -20,6 +20,7 @@ class Scheduler(Plugin):
|
|||||||
addEvent('schedule.restart', self.start)
|
addEvent('schedule.restart', self.start)
|
||||||
|
|
||||||
addEvent('app.load', self.start)
|
addEvent('app.load', self.start)
|
||||||
|
addEvent('app.shutdown', self.stop)
|
||||||
|
|
||||||
self.sched = Sched(misfire_grace_time = 60)
|
self.sched = Sched(misfire_grace_time = 60)
|
||||||
|
|
||||||
|
|||||||
@@ -81,6 +81,7 @@ class Loader:
|
|||||||
def loadPlugins(self, module, name):
|
def loadPlugins(self, module, name):
|
||||||
try:
|
try:
|
||||||
klass = module.start()
|
klass = module.start()
|
||||||
|
klass.registerPlugin()
|
||||||
|
|
||||||
if klass and getattr(klass, 'auto_register_static'):
|
if klass and getattr(klass, 'auto_register_static'):
|
||||||
klass.registerStatic(module.__file__)
|
klass.registerStatic(module.__file__)
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
from couchpotato import addView
|
from couchpotato import addView
|
||||||
from couchpotato.core.event import fireEvent
|
from couchpotato.core.event import fireEvent, addEvent
|
||||||
from couchpotato.core.helpers.variable import getExt
|
from couchpotato.core.helpers.variable import getExt
|
||||||
from couchpotato.core.logger import CPLog
|
from couchpotato.core.logger import CPLog
|
||||||
from couchpotato.environment import Env
|
from couchpotato.environment import Env
|
||||||
@@ -16,6 +16,11 @@ class Plugin(object):
|
|||||||
enabled_option = 'enabled'
|
enabled_option = 'enabled'
|
||||||
auto_register_static = True
|
auto_register_static = True
|
||||||
|
|
||||||
|
needs_shutdown = False
|
||||||
|
|
||||||
|
def registerPlugin(self):
|
||||||
|
addEvent('app.shutdown', self.doShutdown)
|
||||||
|
|
||||||
def conf(self, attr, default = None):
|
def conf(self, attr, default = None):
|
||||||
return Env.setting(attr, self.getName().lower(), default = default)
|
return Env.setting(attr, self.getName().lower(), default = default)
|
||||||
|
|
||||||
@@ -60,6 +65,16 @@ class Plugin(object):
|
|||||||
except Exception, e:
|
except Exception, e:
|
||||||
log.error('Unable to create folder "%s": %s' % (path, e))
|
log.error('Unable to create folder "%s": %s' % (path, e))
|
||||||
|
|
||||||
|
|
||||||
|
def doShutdown(self):
|
||||||
|
self.shuttingDown(True)
|
||||||
|
|
||||||
|
def shuttingDown(self, value = None):
|
||||||
|
if value is None:
|
||||||
|
return self.needs_shutdown
|
||||||
|
|
||||||
|
self.needs_shutdown = value
|
||||||
|
|
||||||
def isDisabled(self):
|
def isDisabled(self):
|
||||||
return not self.isEnabled()
|
return not self.isEnabled()
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user