]> kaliko git repositories - mpd-sima.git/blob - launch
Catches SIGHUP/SIGUSR1 to trigger conf reload
[mpd-sima.git] / launch
1 #!/usr/bin/env python3
2 # -*- coding: utf-8 -*-
3 """Sima
4 """
5
6 # standard library import
7 import logging
8 import sys
9
10 from importlib import __import__
11 from os.path import isfile
12 ##
13
14 # third parties components
15 ##
16
17 # local import
18 from sima import core
19 from sima.lib.logger import set_logger
20 from sima.lib.simadb import SimaDB
21 from sima.utils.config import ConfMan
22 from sima.utils.startopt import StartOpt
23 from sima.utils.utils import exception_log, SigHup
24  # core plugins
25 from sima.plugins.core.history import History
26 from sima.plugins.core.mpdoptions import MpdOptions
27 ##
28
29
30 def load_plugins(sima, source):
31     """Handles internal/external plugins
32         sima:   sima.core.Sima instance
33         source: ['internal', 'contrib']
34     """
35     if not sima.config.get('sima', source ):
36         return
37     logger = logging.getLogger('sima')
38     for plugin in sima.config.get('sima', source).split(','):
39         plugin = plugin.strip(' \n')
40         module = 'sima.plugins.{0}.{1}'.format(source, plugin.lower())
41         try:
42             mod_obj = __import__(module, fromlist=[plugin])
43         except ImportError as err:
44             logger.error('Failed to load plugin\'s module: {0} ({1})'.format(module, err))
45             sima.shutdown()
46         try:
47             plugin_obj = getattr(mod_obj, plugin)
48         except AttributeError as err:
49             logger.error('Failed to load plugin {0} ({1})'.format(plugin, err))
50             sima.shutdown()
51         logger.info('Loading {0} plugin: {name} ({doc})'.format(source, **plugin_obj.info()))
52         sima.register_plugin(plugin_obj)
53
54
55 def start(sopt, restart=False):
56     """starts application
57     """
58     # set logger
59     verbosity = sopt.options.get('verbosity', 'warning')
60     logfile = sopt.options.get('logfile', None)
61     cli_loglevel = getattr(logging, verbosity.upper())
62     set_logger(level=verbosity, logfile=logfile)
63     logger = logging.getLogger('sima')
64     logger.setLevel(cli_loglevel)
65     # loads configuration
66     config = ConfMan(logger, sopt.options).config
67     logger.setLevel(getattr(logging,
68                     config.get('log', 'verbosity').upper()))  # pylint: disable=E1103
69
70     logger.debug('Command line say: {0}'.format(sopt.options))
71     # Create Database
72     db_file = config.get('sima', 'db_file')
73     if (sopt.options.get('create_db', None)
74        or not isfile(db_file)):
75         logger.info('Creating database in "{}"'.format(db_file))
76         open(db_file, 'a').close()
77         SimaDB(db_path=db_file).create_db()
78         if sopt.options.get('create_db', None):
79             logger.info('Done, bye...')
80             sys.exit(0)
81
82     logger.info('Starting...')
83     sima = core.Sima(config)
84
85     # required core plugins
86     sima.register_plugin(History)
87     sima.register_plugin(MpdOptions)
88
89     #  Loading internal plugins
90     load_plugins(sima, 'internal')
91
92     #  Loading contrib plugins
93     load_plugins(sima, 'contrib')
94     # Run as a daemon
95     if config.getboolean('daemon', 'daemon'):
96         if restart:
97             sima.run()
98         else:
99             logger.info('Daemonize process...')
100             sima.start()
101
102     logger.error('starting')
103     try:
104         sima.foreground()
105     except KeyboardInterrupt:
106         logger.info('Caught KeyboardInterrupt, stopping')
107         sys.exit(0)
108
109
110 def run(sopt, restart=False):
111     """
112     Handles SigHup exception
113     Catches Unhandled exception
114     """
115     # pylint: disable=broad-except
116     try:
117         start(sopt, restart)
118     except SigHup as err:  # SigHup inherit from Exception
119         run(sopt, True)
120     except Exception:  # Unhandled exception
121         exception_log()
122
123 # Script starts here
124 def main():
125     info = dict({'version': core.__version__,
126                  'prog': 'sima'})
127     # StartOpt gathers options from command line call (in StartOpt().options)
128     sopt = StartOpt(info)
129     run(sopt)
130
131
132 if __name__ == '__main__':
133     main()
134
135 # VIM MODLINE
136 # vim: ai ts=4 sw=4 sts=4 expandtab