Browse Source

Tracebacks to file

Global settings
pull/1/merge
Ruud 14 years ago
parent
commit
e1d6701722
  1. 8
      CouchPotato.py
  2. 24
      couchpotato/cli.py
  3. 2
      couchpotato/core/__init__.py
  4. 6
      couchpotato/core/logger.py
  5. 43
      couchpotato/settings/__init__.py
  6. 21
      couchpotato/settings/loader.py

8
CouchPotato.py

@ -13,6 +13,9 @@ base_path = dirname(os.path.abspath(__file__))
# Insert local directories into path # Insert local directories into path
sys.path.insert(0, os.path.join(base_path, 'libs')) sys.path.insert(0, os.path.join(base_path, 'libs'))
from couchpotato.core.logger import CPLog
log = CPLog(__name__);
try: try:
from couchpotato import cli from couchpotato import cli
except ImportError, e: except ImportError, e:
@ -52,4 +55,7 @@ except ImportError, e:
raise NotImplementedError("Don't know how to do that.") raise NotImplementedError("Don't know how to do that.")
if __name__ == "__main__": if __name__ == "__main__":
cli.cmd_couchpotato(base_path) try:
cli.cmd_couchpotato(base_path)
except Exception, e:
log.critical(e)

24
couchpotato/cli.py

@ -1,4 +1,3 @@
from blinker import signal
from couchpotato import app from couchpotato import app
from couchpotato.settings import Settings from couchpotato.settings import Settings
from logging import handlers 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('-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('-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('-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:]) (options, args) = parser.parse_args(sys.argv[1:])
# Register settings # Register settings
settings = Settings('settings.conf') settings = Settings(os.path.join(base_path, 'settings.conf'))
register = signal('settings_register') debug = options.debug or settings.get('debug', default = False)
register.connect(settings.registerDefaults)
debug = options.debug or settings.get('environment') == 'development'
# Logger # Logger
logger = logging.getLogger() logger = logging.getLogger()
@ -34,13 +31,13 @@ def cmd_couchpotato(base_path):
level = logging.DEBUG if debug else logging.INFO level = logging.DEBUG if debug else logging.INFO
logger.setLevel(level) logger.setLevel(level)
# Output logging information to screen # To screen
if not options.quiet: if debug and not options.quiet:
hdlr = logging.StreamHandler(sys.stderr) hdlr = logging.StreamHandler(sys.stderr)
hdlr.setFormatter(formatter) hdlr.setFormatter(formatter)
logger.addHandler(hdlr) logger.addHandler(hdlr)
# Output logging information to file # To file
hdlr2 = handlers.RotatingFileHandler(os.path.join(options.logdir, 'CouchPotato.log'), 'a', 5000000, 4) hdlr2 = handlers.RotatingFileHandler(os.path.join(options.logdir, 'CouchPotato.log'), 'a', 5000000, 4)
hdlr2.setFormatter(formatter) hdlr2.setFormatter(formatter)
logger.addHandler(hdlr2) logger.addHandler(hdlr2)
@ -48,7 +45,12 @@ def cmd_couchpotato(base_path):
# Load config # Load config
from couchpotato.settings.loader import SettingsLoader from couchpotato.settings.loader import SettingsLoader
SettingsLoader(root = base_path) sl = SettingsLoader(root = base_path)
sl.loadConfig('couchpotato', 'core')
# Create app # 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)

2
couchpotato/core/__init__.py

@ -1,5 +1,5 @@
config = ('global', { config = ('global', {
'environment': 'production', 'debug': False,
'host': '0.0.0.0', 'host': '0.0.0.0',
'port': 5000, 'port': 5000,
'username': '', 'username': '',

6
couchpotato/core/logger.py

@ -1,4 +1,5 @@
from couchpotato import app from couchpotato import app
import logging
class CPLog(): class CPLog():
@ -6,7 +7,7 @@ class CPLog():
def __init__(self, context = ''): def __init__(self, context = ''):
self.context = context self.context = context
self.logger = app.logger self.logger = logging.getLogger()
def info(self, msg): def info(self, msg):
self.logger.info(self.addContext(msg)) self.logger.info(self.addContext(msg))
@ -17,5 +18,8 @@ class CPLog():
def error(self, msg): def error(self, msg):
self.logger.error(self.addContext(msg)) self.logger.error(self.addContext(msg))
def critical(self, msg):
self.logger.critical(self.addContext(msg), exc_info = 1)
def addContext(self, msg): def addContext(self, msg):
return '[%+25.25s] %s' % (self.context[-25:], msg) return '[%+25.25s] %s' % (self.context[-25:], msg)

43
couchpotato/settings/__init__.py

@ -2,10 +2,10 @@ from __future__ import with_statement
from blinker import signal, Signal from blinker import signal, Signal
from couchpotato.core.logger import CPLog from couchpotato.core.logger import CPLog
import ConfigParser import ConfigParser
import os.path
import time import time
log = CPLog(__name__) log = CPLog(__name__)
settings = signal('settings_register')
class Settings(): class Settings():
@ -20,13 +20,17 @@ class Settings():
self.p = ConfigParser.RawConfigParser() self.p = ConfigParser.RawConfigParser()
self.p.read(file) self.p.read(file)
# Connect signals
signal('settings.register').connect(self.registerDefaults)
signal('settings.save').connect(self.save)
def parser(self): def parser(self):
return self.p return self.p
def sections(self): def sections(self):
return self.s return self.s
def registerDefaults(self, section_name, options): def registerDefaults(self, section_name, options = {}, save = True):
self.addSection(section_name) self.addSection(section_name)
for option, value in options.iteritems(): for option, value in options.iteritems():
@ -35,30 +39,28 @@ class Settings():
log.debug('Registered defaults %s: %s' % (section_name, options)) log.debug('Registered defaults %s: %s' % (section_name, options))
self.on_register.send(self) self.on_register.send(self)
self.save() if save:
self.save(self)
def set(self, section, option, value): def set(self, section, option, value):
return self.p.set(section, option, value) return self.p.set(section, option, value)
def get(self, option = '', section = 'global'): def get(self, option = '', section = 'global', default = ''):
value = self.p.get(section, option)
if(self.is_int(value)): try:
return int(value) value = self.p.get(section, option)
if str(value).lower() in self.bool: if(self.is_int(value)):
return self.bool.get(str(value).lower()) 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): return value if type(value) != str else value.strip()
try: except:
int(value) return default
return True
except ValueError:
return False
def save(self): def save(self, caller):
with open(self.file, 'wb') as configfile: with open(self.file, 'wb') as configfile:
self.p.write(configfile) self.p.write(configfile)
@ -72,3 +74,10 @@ class Settings():
def setDefault(self, section, option, value): def setDefault(self, section, option, value):
if not self.p.has_option(section, option): if not self.p.has_option(section, option):
self.p.set(section, option, value) self.p.set(section, option, value)
def is_int(self, value):
try:
int(value)
return True
except ValueError:
return False

21
couchpotato/settings/loader.py

@ -2,7 +2,6 @@ from blinker import signal
from couchpotato.core.logger import CPLog from couchpotato.core.logger import CPLog
import glob import glob
import os import os
import sys
log = CPLog(__name__) log = CPLog(__name__)
@ -10,7 +9,8 @@ class SettingsLoader:
def __init__(self, root = ''): def __init__(self, root = ''):
self.register = signal('settings_register') self.settings_register = signal('settings.register')
self.settings_save = signal('settings.save')
self.paths = { self.paths = {
'plugins' : ('couchpotato.core.plugins', os.path.join(root, 'couchpotato', 'core', 'plugins')), 'plugins' : ('couchpotato.core.plugins', os.path.join(root, 'couchpotato', 'core', 'plugins')),
@ -21,20 +21,27 @@ class SettingsLoader:
self.loadFromDir(tuple[0], tuple[1]) self.loadFromDir(tuple[0], tuple[1])
def loadFromDir(self, module, dir): def loadFromDir(self, module, dir):
did_save = 0
for file in glob.glob(os.path.join(dir, '*')): for file in glob.glob(os.path.join(dir, '*')):
plugin_name = os.path.basename(file) plugin_name = os.path.basename(file)
plugin_dir = os.path.join(dir, plugin_name) plugin_dir = os.path.join(dir, plugin_name)
if os.path.isdir(plugin_dir): 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) module_name = '%s.%s' % (module, name)
print module_name
try: try:
m = getattr(self.loadModule(module_name), name) m = getattr(self.loadModule(module_name), name)
(section, options) = m.config (section, options) = m.config
self.register.send(section, options = options) self.settings_register.send(section, options = options, save = save)
except:
log.error("Failed loading config for %s" % name) return True
except Exception, e:
log.error("Failed loading config for %s: %s" % (name, e))
def loadModule(self, name): def loadModule(self, name):
try: try:

Loading…
Cancel
Save