121 lines
3.1 KiB
Python
121 lines
3.1 KiB
Python
|
|
from cement import App, TestApp, init_defaults
|
|
from cement.core.exc import CaughtSignal
|
|
from kontor_schema import Base, KontorDB
|
|
from sqlalchemy import create_engine
|
|
from sqlalchemy.orm import sessionmaker
|
|
|
|
from .core.exc import KontorError
|
|
from .controllers.base import CliBase
|
|
from .controllers.database import Database
|
|
from .controllers.media import Media
|
|
|
|
# configuration defaults
|
|
CONFIG = init_defaults('kontor', 'mariadb', 'media')
|
|
CONFIG['mariadb']['user'] = 'kontor'
|
|
CONFIG['mariadb']['password'] = 'kontor'
|
|
CONFIG['mariadb']['host'] = '127.0.0.1'
|
|
CONFIG['mariadb']['port'] = '3306'
|
|
CONFIG['mariadb']['database'] = 'kontor'
|
|
CONFIG['media']['yt-dlp'] = '/home/tpeetz/bin/yt-dlp'
|
|
CONFIG['media']['dir'] = '/data/media'
|
|
|
|
|
|
def extend_sqlalchemy(app):
|
|
app.log.debug('extending kontor application with sqlalchemy')
|
|
connect_string = ('mariadb+mariadbconnector://{}:{}@{}:{}/{}'.format(
|
|
app.config.get('mariadb', 'user'),
|
|
app.config.get('mariadb', 'password'),
|
|
app.config.get('mariadb', 'host'),
|
|
app.config.get('mariadb', 'port'),
|
|
app.config.get('mariadb', 'database')
|
|
))
|
|
# engine = create_engine(connect_string, echo=True)
|
|
engine = create_engine(connect_string)
|
|
Base.metadata.create_all(bind=engine, checkfirst=True)
|
|
__session__ = sessionmaker(bind=engine)
|
|
app.extend('engine', engine)
|
|
kontor_db = KontorDB(engine, app.log)
|
|
app.extend('kontor_db', kontor_db)
|
|
|
|
|
|
class Kontor(App):
|
|
"""Kontor CLI primary application."""
|
|
|
|
class Meta:
|
|
label = 'kontor'
|
|
|
|
# configuration defaults
|
|
config_defaults = CONFIG
|
|
|
|
# call sys.exit() on close
|
|
exit_on_close = True
|
|
|
|
# load additional framework extensions
|
|
extensions = [
|
|
'yaml',
|
|
'colorlog',
|
|
'jinja2',
|
|
]
|
|
|
|
# configuration handler
|
|
config_handler = 'yaml'
|
|
|
|
# configuration file suffix
|
|
config_file_suffix = '.yml'
|
|
|
|
# set the log handler
|
|
log_handler = 'colorlog'
|
|
|
|
# set the output handler
|
|
output_handler = 'jinja2'
|
|
|
|
hooks = [
|
|
('post_setup', extend_sqlalchemy),
|
|
]
|
|
|
|
# register handlers
|
|
handlers = [
|
|
CliBase,
|
|
Database,
|
|
Media,
|
|
]
|
|
|
|
|
|
class KontorTest(TestApp,Kontor):
|
|
"""A sub-class of Kontor that is better suited for testing."""
|
|
|
|
class Meta:
|
|
label = 'kontor'
|
|
|
|
|
|
def main():
|
|
with Kontor() as app:
|
|
try:
|
|
app.run()
|
|
|
|
except AssertionError as e:
|
|
print('AssertionError > %s' % e.args[0])
|
|
app.exit_code = 1
|
|
|
|
if app.debug is True:
|
|
import traceback
|
|
traceback.print_exc()
|
|
|
|
except KontorError as e:
|
|
print('KontorError > %s' % e.args[0])
|
|
app.exit_code = 1
|
|
|
|
if app.debug is True:
|
|
import traceback
|
|
traceback.print_exc()
|
|
|
|
except CaughtSignal as e:
|
|
# Default Cement signals are SIGINT and SIGTERM, exit 0 (non-error)
|
|
print('\n%s' % e)
|
|
app.exit_code = 0
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|