You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

164 lines
5.4 KiB

from argparse import ArgumentParser
from couchpotato import web
14 years ago
from couchpotato.api import api
from couchpotato.core.event import fireEventAsync
14 years ago
from daemon import createDaemon
14 years ago
from logging import handlers
from werkzeug.contrib.cache import FileSystemCache
14 years ago
import logging
import os.path
import sys
14 years ago
def getOptions(base_path, args):
# Options
parser = ArgumentParser(prog = 'CouchPotato.py')
parser.add_argument('-c', '--config_file', default = os.path.join(base_path, '_data', 'settings.conf'),
dest = 'config_file', help = 'Absolute or ~/ path of the settings file (default ./_data/settings.conf)')
parser.add_argument('-t', '--test', '--debug', action = 'store_true',
14 years ago
dest = 'debug', help = 'Debug mode')
parser.add_argument('-q', '--quiet', action = 'store_true',
14 years ago
dest = 'quiet', help = "Don't log to console")
parser.add_argument('-d', '--daemon', action = 'store_true',
14 years ago
dest = 'daemonize', help = 'Daemonize the app')
14 years ago
parser.add_argument('-g', '--nogit', action = 'store_true',
dest = 'git', help = 'Running from git')
14 years ago
options = parser.parse_args(args)
options.config_file = os.path.expanduser(options.config_file)
return options
def runCouchPotato(options, base_path, args):
# Load settings
from couchpotato.environment import Env
settings = Env.get('settings')
settings.setFile(options.config_file)
# Create data dir if needed
data_dir = os.path.expanduser(Env.setting('data_dir'))
if data_dir == '':
data_dir = os.path.join(base_path, '_data')
if not os.path.isdir(data_dir):
os.makedirs(data_dir)
# Create logging dir
log_dir = os.path.join(data_dir, 'logs');
if not os.path.isdir(log_dir):
os.mkdir(log_dir)
14 years ago
# Daemonize app
if options.daemonize:
createDaemon()
# Register environment settings
14 years ago
Env.set('uses_git', not options.git)
Env.set('app_dir', base_path)
Env.set('data_dir', data_dir)
Env.set('log_path', os.path.join(log_dir, 'CouchPotato.log'))
Env.set('db_path', 'sqlite:///' + os.path.join(data_dir, 'couchpotato.db'))
Env.set('cache_dir', os.path.join(data_dir, 'cache'))
14 years ago
Env.set('cache', FileSystemCache(os.path.join(Env.get('cache_dir'), 'python')))
14 years ago
Env.set('quiet', options.quiet)
Env.set('daemonize', options.daemonize)
Env.set('args', args)
# Determine debug
14 years ago
debug = options.debug or Env.setting('debug', default = False)
Env.set('debug', debug)
14 years ago
# Only run once when debugging
if os.environ.get('WERKZEUG_RUN_MAIN') or not debug:
14 years ago
# Logger
logger = logging.getLogger()
formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s', '%H:%M:%S')
level = logging.DEBUG if debug else logging.INFO
logger.setLevel(level)
14 years ago
# To screen
if debug and not options.quiet and not options.daemonize:
hdlr = logging.StreamHandler(sys.stderr)
hdlr.setFormatter(formatter)
logger.addHandler(hdlr)
14 years ago
# To file
hdlr2 = handlers.RotatingFileHandler(Env.get('log_path'), 'a', 500000, 10)
hdlr2.setFormatter(formatter)
logger.addHandler(hdlr2)
14 years ago
# Disable server access log
server_log = logging.getLogger('werkzeug')
server_log.disabled = True
14 years ago
# Start logging
from couchpotato.core.logger import CPLog
log = CPLog(__name__)
log.debug('Started with options %s' % options)
14 years ago
# Load configs & plugins
loader = Env.get('loader')
loader.preload(root = base_path)
loader.run()
# Load migrations
from migrate.versioning.api import version_control, db_version, version, upgrade
db = Env.get('db_path')
repo = os.path.join(base_path, 'couchpotato', 'core', 'migration')
logging.getLogger('migrate').setLevel(logging.WARNING) # Disable logging for migration
latest_db_version = version(repo)
initialize = True
try:
current_db_version = db_version(db, repo)
initialize = False
except:
version_control(db, repo, version = latest_db_version)
current_db_version = db_version(db, repo)
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))
upgrade(db, repo)
# Configure Database
from couchpotato.core.settings.model import setup
setup()
fireEventAsync('app.load')
if initialize:
fireEventAsync('app.initialize')
# Create app
from couchpotato import app
14 years ago
api_key = Env.setting('api_key')
14 years ago
url_base = '/' + Env.setting('url_base').lstrip('/') if Env.setting('url_base') else ''
14 years ago
reloader = debug and not options.daemonize
# Basic config
app.secret_key = api_key
config = {
'use_reloader': reloader,
'host': Env.setting('host', default = '0.0.0.0'),
'port': Env.setting('port', default = 5000)
}
14 years ago
# Static path
web.add_url_rule(url_base + '/static/<path:filename>',
14 years ago
endpoint = 'static',
view_func = app.send_static_file)
# Register modules
14 years ago
app.register_blueprint(web, url_prefix = '%s/' % url_base)
app.register_blueprint(api, url_prefix = '%s/%s/' % (url_base, api_key))
# Go go go!
app.run(**config)