import logging import os import yaml LOG = logging.getLogger(__name__) class Singleton(type): _instance = None def __call__(cls, *args, **kwargs): if cls._instance is None: cls._instance = super(Singleton, cls).__call__(*args, **kwargs) else: cls._instance.__init__(*args, **kwargs) return cls._instance class Config(dict, metaclass=Singleton): filename = 'cis-collector.yml' locations = [ '/etc/{conf}'.format(conf=filename), '{home}/{conf}'.format(home=os.environ.get('HOME'), conf=filename), '{cwd}/{conf}'.format(cwd=os.getcwd(), conf=filename), ] def read_config(self): current_config = dict() for path in self.locations: try: with open(path) as config: current_config.update(yaml.safe_load(config)) LOG.info('Loaded config from %s', path) except FileNotFoundError: LOG.debug('No config file at %s, skipping...', path) self.update(current_config) return current_config def __init__(self): self.read_config() super().__init__()