diff options
Diffstat (limited to 'mpm/python/usrp_mpm/prefs.py')
-rw-r--r-- | mpm/python/usrp_mpm/prefs.py | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/mpm/python/usrp_mpm/prefs.py b/mpm/python/usrp_mpm/prefs.py new file mode 100644 index 000000000..d244a0b42 --- /dev/null +++ b/mpm/python/usrp_mpm/prefs.py @@ -0,0 +1,92 @@ +# +# Copyright 2018 Ettus Research, a National Instruments Company +# +# SPDX-License-Identifier: GPL-3.0 +# +""" +MPM preferences management +""" + +import configparser +from builtins import object +from usrp_mpm.mpmlog import TRACE, DEBUG, INFO, WARNING, ERROR, CRITICAL + +# Store the global preferences object +_PREFS = None + +### MPM defaults ############################################################## +MPM_DEFAULT_CONFFILE_PATH = '/etc/uhd/mpm.conf' +MPM_DEFAULT_LOG_LEVEL = 'info' +MPM_DEFAULT_LOG_BUF_SIZE = 100 # Number of log records to buf + +class _MPMPrefs(configparser.ConfigParser): + """ + Container for MPM preferences. + + On initialization, it will read preferences from the system-wide config + file, if available, and from environment variables. + Settings can be updated at any time (e.g., because want to factor in + command line arguments). + + This class also encodes default prefs in the self.default_prefs dictionary. + Said dictionary needs to be compatible with the ConfigParser.read_dict() + API call (refer to the Python documentation). + """ + default_prefs = { + 'mpm': { + 'log_level': MPM_DEFAULT_LOG_LEVEL, + 'log_buf_size': MPM_DEFAULT_LOG_BUF_SIZE, + }, + } + + def __init__(self): + configparser.ConfigParser.__init__(self) + self.read_dict(self.default_prefs) + self._errors = [] + try: + self.read(MPM_DEFAULT_CONFFILE_PATH) + except configparser.Error as ex: + self._errors.append('Config file parsing error: {}'.format(str(ex))) + + def get_log_level(self): + """ + Return the selected default log level as an integer, usable by the + logging API. This is a safe call, it will always return a useful value. + Because this gets called as part of the logging API, it can't log any + error messages. It will store them in the object itself under the + __ERRORS__ section, key 'log_level'. + """ + log_level = self.get('mpm', 'log_level').lower() + log_level_map = { + 'trace': TRACE, + 'debug': DEBUG, + 'info': INFO, + 'warning': WARNING, + 'error': ERROR, + 'critical': CRITICAL, + } + if log_level not in log_level_map: + self._errors.append('Invalid log level: {}'.format(log_level)) + # Note: After this function returns, we can use the logger so we + # don't need to use this awkward side channel anymore! + return log_level_map.get( + log_level, + log_level_map[MPM_DEFAULT_LOG_LEVEL] + ) + + def get_log_errors(self): + """ + Returns errors that were generated during init but couldn't be logged + because the logger isn't ready yet. + """ + return self._errors + +def get_prefs(): + """ + Return singleton preferences object. It's an object of type ConfigParser. + """ + global _PREFS + if _PREFS is None: + _PREFS = _MPMPrefs() + return _PREFS + |