|
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
|