Tracebacks to file
Global settings
This commit is contained in:
1 parent
722731c8bc
commit
e1d6701722
6 files changed
+68
-40
No files matched your search
+7
-1
@@ -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)
|
||||
+13
-11
@@ -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)
|
||||
@@ -1,5 +1,5 @@
|
||||
config = ('global', {
|
||||
'environment': 'production',
|
||||
'debug': False,
|
||||
'host': '0.0.0.0',
|
||||
'port': 5000,
|
||||
'username': '',
|
||||
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
|
||||
if str(value).lower() in self.bool:
|
||||
return self.bool.get(str(value).lower())
|
||||
|
||||
return value if type(value) != str else value.strip()
|
||||
|
||||
def is_int(self, value):
|
||||
try:
|
||||
int(value)
|
||||
return True
|
||||
except ValueError:
|
||||
return False
|
||||
value = self.p.get(section, option)
|
||||
|
||||
def save(self):
|
||||
if(self.is_int(value)):
|
||||
return int(value)
|
||||
|
||||
if str(value).lower() in self.bool:
|
||||
return self.bool.get(str(value).lower())
|
||||
|
||||
return value if type(value) != str else value.strip()
|
||||
except:
|
||||
return default
|
||||
|
||||
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
|
||||
@@ -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:
|
||||
|
||||
Reference in new issue
Block a user