Blame cloudinit/sources/helpers/vmware/imc/config_file.py

Packit Service a04d08
# Copyright (C) 2015 Canonical Ltd.
Packit Service a04d08
# Copyright (C) 2015 VMware Inc.
Packit Service a04d08
#
Packit Service a04d08
# Author: Sankar Tanguturi <stanguturi@vmware.com>
Packit Service a04d08
#
Packit Service a04d08
# This file is part of cloud-init. See LICENSE file for license information.
Packit Service a04d08
Packit Service a04d08
import logging
Packit Service a04d08
Packit Service a04d08
try:
Packit Service a04d08
    import configparser
Packit Service a04d08
except ImportError:
Packit Service a04d08
    import ConfigParser as configparser
Packit Service a04d08
Packit Service a04d08
from .config_source import ConfigSource
Packit Service a04d08
Packit Service a04d08
logger = logging.getLogger(__name__)
Packit Service a04d08
Packit Service a04d08
Packit Service a04d08
class ConfigFile(ConfigSource, dict):
Packit Service a04d08
    """ConfigFile module to load the content from a specified source."""
Packit Service a04d08
Packit Service a04d08
    def __init__(self, filename):
Packit Service a04d08
        self._loadConfigFile(filename)
Packit Service a04d08
Packit Service a04d08
    def _insertKey(self, key, val):
Packit Service a04d08
        """
Packit Service a04d08
        Inserts a Key Value pair.
Packit Service a04d08
Packit Service a04d08
        Keyword arguments:
Packit Service a04d08
        key -- The key to insert
Packit Service a04d08
        val -- The value to insert for the key
Packit Service a04d08
Packit Service a04d08
        """
Packit Service a04d08
        key = key.strip()
Packit Service a04d08
        val = val.strip()
Packit Service a04d08
Packit Service a04d08
        if key.startswith('-') or '|-' in key:
Packit Service a04d08
            canLog = False
Packit Service a04d08
        else:
Packit Service a04d08
            canLog = True
Packit Service a04d08
Packit Service a04d08
        # "sensitive" settings shall not be logged
Packit Service a04d08
        if canLog:
Packit Service a04d08
            logger.debug("ADDED KEY-VAL :: '%s' = '%s'", key, val)
Packit Service a04d08
        else:
Packit Service a04d08
            logger.debug("ADDED KEY-VAL :: '%s' = '*****************'", key)
Packit Service a04d08
Packit Service a04d08
        self[key] = val
Packit Service a04d08
Packit Service a04d08
    def _loadConfigFile(self, filename):
Packit Service a04d08
        """
Packit Service a04d08
        Parses properties from the specified config file.
Packit Service a04d08
Packit Service a04d08
        Any previously available properties will be removed.
Packit Service a04d08
        Sensitive data will not be logged in case the key starts
Packit Service a04d08
        from '-'.
Packit Service a04d08
Packit Service a04d08
        Keyword arguments:
Packit Service a04d08
        filename - The full path to the config file.
Packit Service a04d08
        """
Packit Service a04d08
        logger.info('Parsing the config file %s.', filename)
Packit Service a04d08
Packit Service a04d08
        config = configparser.ConfigParser()
Packit Service a04d08
        config.optionxform = str
Packit Service a04d08
        config.read(filename)
Packit Service a04d08
Packit Service a04d08
        self.clear()
Packit Service a04d08
Packit Service a04d08
        for category in config.sections():
Packit Service a04d08
            logger.debug("FOUND CATEGORY = '%s'", category)
Packit Service a04d08
Packit Service a04d08
            for (key, value) in config.items(category):
Packit Service a04d08
                self._insertKey(category + '|' + key, value)
Packit Service a04d08
Packit Service a04d08
    def should_keep_current_value(self, key):
Packit Service a04d08
        """
Packit Service a04d08
        Determines whether a value for a property must be kept.
Packit Service a04d08
Packit Service a04d08
        If the propery is missing, it is treated as it should be not
Packit Service a04d08
        changed by the engine.
Packit Service a04d08
Packit Service a04d08
        Keyword arguments:
Packit Service a04d08
        key -- The key to search for.
Packit Service a04d08
        """
Packit Service a04d08
        # helps to distinguish from "empty" value which is used to indicate
Packit Service a04d08
        # "removal"
Packit Service a04d08
        return key not in self
Packit Service a04d08
Packit Service a04d08
    def should_remove_current_value(self, key):
Packit Service a04d08
        """
Packit Service a04d08
        Determines whether a value for the property must be removed.
Packit Service a04d08
Packit Service a04d08
        If the specified key is empty, it is treated as it should be
Packit Service a04d08
        removed by the engine.
Packit Service a04d08
Packit Service a04d08
        Return true if the value can be removed, false otherwise.
Packit Service a04d08
Packit Service a04d08
        Keyword arguments:
Packit Service a04d08
        key -- The key to search for.
Packit Service a04d08
        """
Packit Service a04d08
        # helps to distinguish from "missing" value which is used to indicate
Packit Service a04d08
        # "keeping unchanged"
Packit Service a04d08
        if key in self:
Packit Service a04d08
            return not bool(self[key])
Packit Service a04d08
        else:
Packit Service a04d08
            return False
Packit Service a04d08
Packit Service a04d08
    def get_count_with_prefix(self, prefix):
Packit Service a04d08
        """
Packit Service a04d08
        Return the total count of keys that start with the specified prefix.
Packit Service a04d08
Packit Service a04d08
        Keyword arguments:
Packit Service a04d08
        prefix -- prefix of the key
Packit Service a04d08
        """
Packit Service a04d08
        return len([key for key in self if key.startswith(prefix)])
Packit Service a04d08
Packit Service a04d08
# vi: ts=4 expandtab