160 lines
4.5 KiB
Python
160 lines
4.5 KiB
Python
###
|
|
# Copyright 2016-2021 Hewlett Packard Enterprise, Inc. All rights reserved.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
###
|
|
|
|
# -*- coding: utf-8 -*-
|
|
"""Module for working with global configuration options."""
|
|
|
|
# ---------Imports---------
|
|
|
|
import logging
|
|
import os
|
|
import re
|
|
|
|
import six
|
|
from six.moves import configparser
|
|
|
|
# ---------End of imports---------
|
|
|
|
|
|
# ---------Debug logger---------
|
|
|
|
LOGGER = logging.getLogger(__name__)
|
|
|
|
# ---------End of debug logger---------
|
|
|
|
|
|
class AutoConfigParser(object):
|
|
"""Auto configuration parser. Properties starting with _ac__ are automatically
|
|
serialized to config file"""
|
|
|
|
_config_pattern = re.compile(r"_ac__(?P<confkey>.*)")
|
|
|
|
def __init__(self, filename=None):
|
|
"""Initialize AutoConfigParser
|
|
|
|
:param filename: file name to be used for config loading.
|
|
:type filename: str.
|
|
|
|
"""
|
|
self._sectionname = "globals"
|
|
self._configfile = filename
|
|
|
|
@property
|
|
def configfile(self):
|
|
"""The current configuration file location"""
|
|
return self._configfile
|
|
|
|
def _get_ac_keys(self):
|
|
"""Retrieve parse option keys"""
|
|
result = []
|
|
for key in six.iterkeys(self.__dict__):
|
|
match = AutoConfigParser._config_pattern.search(key)
|
|
if match:
|
|
result.append(match.group("confkey"))
|
|
return result
|
|
|
|
def _get(self, key):
|
|
"""Retrieve parse option key
|
|
|
|
:param key: key to retrieve.
|
|
:type key: str.
|
|
|
|
"""
|
|
ackey = "_ac__%s" % key.replace("-", "_")
|
|
if ackey in self.__dict__:
|
|
return self.__dict__[ackey]
|
|
return None
|
|
|
|
def _set(self, key, value):
|
|
"""Set parse option key
|
|
|
|
:param key: key to be set.
|
|
:type key: str.
|
|
:param value: value to be given to key.
|
|
:type value: str.
|
|
|
|
"""
|
|
ackey = "_ac__%s" % key.replace("-", "_")
|
|
if ackey in self.__dict__:
|
|
self.__dict__[ackey] = value
|
|
return None
|
|
|
|
def load(self, filename=None):
|
|
"""Load configuration settings from the file filename, if filename
|
|
is None then the value from configfile property is used
|
|
|
|
:param filename: file name to be used for config loading.
|
|
:type filename: str.
|
|
|
|
"""
|
|
fname = self.configfile
|
|
if filename:
|
|
fname = filename
|
|
|
|
if not fname or not os.path.isfile(fname):
|
|
return
|
|
|
|
try:
|
|
config = configparser.RawConfigParser()
|
|
config.read(fname)
|
|
for key in self._get_ac_keys():
|
|
configval = None
|
|
try:
|
|
configval = config.get(self._sectionname, key)
|
|
except configparser.NoOptionError:
|
|
# also try with - instead of _
|
|
try:
|
|
configval = config.get(self._sectionname, key.replace("_", "-"))
|
|
except configparser.NoOptionError:
|
|
pass
|
|
|
|
if configval:
|
|
ackey = "_ac__%s" % key
|
|
self.__dict__[ackey] = configval
|
|
except configparser.NoOptionError:
|
|
pass
|
|
except configparser.NoSectionError:
|
|
pass
|
|
|
|
def save(self, filename=None):
|
|
"""Save configuration settings from the file filename, if filename
|
|
is None then the value from configfile property is used
|
|
|
|
:param filename: file name to be used for config saving.
|
|
:type filename: str.
|
|
|
|
"""
|
|
fname = self.configfile
|
|
if filename:
|
|
fname = filename
|
|
|
|
if fname:
|
|
return
|
|
|
|
config = configparser.RawConfigParser()
|
|
try:
|
|
config.add_section(self._sectionname)
|
|
except configparser.DuplicateSectionError:
|
|
pass # ignored
|
|
|
|
for key in self._get_ac_keys():
|
|
ackey = "_ac__%s" % key
|
|
config.set(self._sectionname, key, str(self.__dict__[ackey]))
|
|
|
|
fileh = open(self._configfile, "wb")
|
|
config.write(fileh)
|
|
fileh.close()
|