diff --git a/CouchPotato.py b/CouchPotato.py index 68cb79f..3788a56 100755 --- a/CouchPotato.py +++ b/CouchPotato.py @@ -13,6 +13,9 @@ base_path = dirname(os.path.abspath(__file__)) # Insert local directories into path sys.path.insert(0, os.path.join(base_path, 'libs')) +from couchpotato.core.logger import CPLog +log = CPLog(__name__); + try: from couchpotato import cli except ImportError, e: @@ -52,4 +55,7 @@ except ImportError, e: raise NotImplementedError("Don't know how to do that.") if __name__ == "__main__": - cli.cmd_couchpotato(base_path) + try: + cli.cmd_couchpotato(base_path) + except Exception, e: + log.critical(e) diff --git a/couchpotato/cli.py b/couchpotato/cli.py index 8622b79..5f38ec2 100644 --- a/couchpotato/cli.py +++ b/couchpotato/cli.py @@ -1,4 +1,3 @@ -from blinker import signal from couchpotato import app from couchpotato.settings import Settings from logging import handlers @@ -16,17 +15,15 @@ def cmd_couchpotato(base_path): parser.add_option('-l', '--logdir', dest = 'logdir', default = 'logs', help = 'log DIRECTORY (default ./logs)') parser.add_option('-t', '--test', '--debug', action = 'store_true', dest = 'debug', help = 'Debug mode') parser.add_option('-q', '--quiet', action = 'store_true', dest = 'quiet', help = "Don't log to console") - parser.add_option('-d', '--daemon', action = 'store_true', dest = 'daemon', help = 'Daemonize the app') + parser.add_option('-d', '--daemon', action = 'store_true', dest = 'daemonize', help = 'Daemonize the app') (options, args) = parser.parse_args(sys.argv[1:]) # Register settings - settings = Settings('settings.conf') - register = signal('settings_register') - register.connect(settings.registerDefaults) + settings = Settings(os.path.join(base_path, 'settings.conf')) + debug = options.debug or settings.get('debug', default = False) - debug = options.debug or settings.get('environment') == 'development' # Logger logger = logging.getLogger() @@ -34,13 +31,13 @@ def cmd_couchpotato(base_path): level = logging.DEBUG if debug else logging.INFO logger.setLevel(level) - # Output logging information to screen - if not options.quiet: + # To screen + if debug and not options.quiet: hdlr = logging.StreamHandler(sys.stderr) hdlr.setFormatter(formatter) logger.addHandler(hdlr) - # Output logging information to file + # To file hdlr2 = handlers.RotatingFileHandler(os.path.join(options.logdir, 'CouchPotato.log'), 'a', 5000000, 4) hdlr2.setFormatter(formatter) logger.addHandler(hdlr2) @@ -48,7 +45,12 @@ def cmd_couchpotato(base_path): # Load config from couchpotato.settings.loader import SettingsLoader - SettingsLoader(root = base_path) + sl = SettingsLoader(root = base_path) + sl.loadConfig('couchpotato', 'core') + # Create app - app.run(host = settings.get('host'), port = int(settings.get('port')), debug = debug) + app + app.host = settings.get('host', default = '0.0.0.0') + app.port = settings.get('port', default = 5000) + app.run(debug = debug) diff --git a/couchpotato/core/__init__.py b/couchpotato/core/__init__.py index 992b875..c293333 100644 --- a/couchpotato/core/__init__.py +++ b/couchpotato/core/__init__.py @@ -1,5 +1,5 @@ config = ('global', { - 'environment': 'production', + 'debug': False, 'host': '0.0.0.0', 'port': 5000, 'username': '', diff --git a/couchpotato/core/logger.py b/couchpotato/core/logger.py index 43ae35b..509fd97 100644 --- a/couchpotato/core/logger.py +++ b/couchpotato/core/logger.py @@ -1,4 +1,5 @@ from couchpotato import app +import logging class CPLog(): @@ -6,7 +7,7 @@ class CPLog(): def __init__(self, context = ''): self.context = context - self.logger = app.logger + self.logger = logging.getLogger() def info(self, msg): self.logger.info(self.addContext(msg)) @@ -17,5 +18,8 @@ class CPLog(): def error(self, msg): self.logger.error(self.addContext(msg)) + def critical(self, msg): + self.logger.critical(self.addContext(msg), exc_info = 1) + def addContext(self, msg): return '[%+25.25s] %s' % (self.context[-25:], msg) diff --git a/couchpotato/settings/__init__.py b/couchpotato/settings/__init__.py index 334afd3..41ce5fe 100644 --- a/couchpotato/settings/__init__.py +++ b/couchpotato/settings/__init__.py @@ -2,10 +2,10 @@ from __future__ import with_statement from blinker import signal, Signal from couchpotato.core.logger import CPLog import ConfigParser +import os.path import time log = CPLog(__name__) -settings = signal('settings_register') class Settings(): @@ -20,13 +20,17 @@ class Settings(): self.p = ConfigParser.RawConfigParser() self.p.read(file) + # Connect signals + signal('settings.register').connect(self.registerDefaults) + signal('settings.save').connect(self.save) + def parser(self): return self.p def sections(self): return self.s - def registerDefaults(self, section_name, options): + def registerDefaults(self, section_name, options = {}, save = True): self.addSection(section_name) for option, value in options.iteritems(): @@ -35,30 +39,28 @@ class Settings(): log.debug('Registered defaults %s: %s' % (section_name, options)) self.on_register.send(self) - self.save() + if save: + self.save(self) def set(self, section, option, value): return self.p.set(section, option, value) - def get(self, option = '', section = 'global'): - value = self.p.get(section, option) + def get(self, option = '', section = 'global', default = ''): - if(self.is_int(value)): - return int(value) + try: + value = self.p.get(section, option) - if str(value).lower() in self.bool: - return self.bool.get(str(value).lower()) + if(self.is_int(value)): + return int(value) - return value if type(value) != str else value.strip() + if str(value).lower() in self.bool: + return self.bool.get(str(value).lower()) - def is_int(self, value): - try: - int(value) - return True - except ValueError: - return False + return value if type(value) != str else value.strip() + except: + return default - def save(self): + def save(self, caller): with open(self.file, 'wb') as configfile: self.p.write(configfile) @@ -72,3 +74,10 @@ class Settings(): def setDefault(self, section, option, value): if not self.p.has_option(section, option): self.p.set(section, option, value) + + def is_int(self, value): + try: + int(value) + return True + except ValueError: + return False diff --git a/couchpotato/settings/loader.py b/couchpotato/settings/loader.py index 8b4879d..d318bdd 100644 --- a/couchpotato/settings/loader.py +++ b/couchpotato/settings/loader.py @@ -2,7 +2,6 @@ from blinker import signal from couchpotato.core.logger import CPLog import glob import os -import sys log = CPLog(__name__) @@ -10,7 +9,8 @@ class SettingsLoader: def __init__(self, root = ''): - self.register = signal('settings_register') + self.settings_register = signal('settings.register') + self.settings_save = signal('settings.save') self.paths = { 'plugins' : ('couchpotato.core.plugins', os.path.join(root, 'couchpotato', 'core', 'plugins')), @@ -21,20 +21,27 @@ class SettingsLoader: self.loadFromDir(tuple[0], tuple[1]) def loadFromDir(self, module, dir): + did_save = 0 for file in glob.glob(os.path.join(dir, '*')): plugin_name = os.path.basename(file) plugin_dir = os.path.join(dir, plugin_name) if os.path.isdir(plugin_dir): - self.loadConfig(module, plugin_name) + did_save += self.loadConfig(module, plugin_name, save = False) - def loadConfig(self, module, name): + if did_save: + self.settings_save.send() + + def loadConfig(self, module, name, save = True): module_name = '%s.%s' % (module, name) + print module_name try: m = getattr(self.loadModule(module_name), name) (section, options) = m.config - self.register.send(section, options = options) - except: - log.error("Failed loading config for %s" % name) + self.settings_register.send(section, options = options, save = save) + + return True + except Exception, e: + log.error("Failed loading config for %s: %s" % (name, e)) def loadModule(self, name): try: