summaryrefslogtreecommitdiff
path: root/cloudinit/sources/helpers/vmware/imc/config_file.py
blob: bb9fb7dc2c061c3fa1d151962f408d6e14ab04d1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
# vi: ts=4 expandtab
#
#    Copyright (C) 2015 Canonical Ltd.
#    Copyright (C) 2015 VMware Inc.
#
#    Author: Sankar Tanguturi <stanguturi@vmware.com>
#
#    This program is free software: you can redistribute it and/or modify
#    it under the terms of the GNU General Public License version 3, as
#    published by the Free Software Foundation.
#
#    This program is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.
#
#    You should have received a copy of the GNU General Public License
#    along with this program.  If not, see <http://www.gnu.org/licenses/>.

import logging

try:
    import configparser
except ImportError:
    import ConfigParser as configparser

from .config_source import ConfigSource

logger = logging.getLogger(__name__)


class ConfigFile(ConfigSource, dict):
    """ConfigFile module to load the content from a specified source."""

    def __init__(self, filename):
        self._loadConfigFile(filename)
        pass

    def _insertKey(self, key, val):
        """
        Inserts a Key Value pair.

        Keyword arguments:
        key -- The key to insert
        val -- The value to insert for the key

        """
        key = key.strip()
        val = val.strip()

        if key.startswith('-') or '|-' in key:
            canLog = False
        else:
            canLog = True

        # "sensitive" settings shall not be logged
        if canLog:
            logger.debug("ADDED KEY-VAL :: '%s' = '%s'" % (key, val))
        else:
            logger.debug("ADDED KEY-VAL :: '%s' = '*****************'" % key)

        self[key] = val

    def _loadConfigFile(self, filename):
        """
        Parses properties from the specified config file.

        Any previously available properties will be removed.
        Sensitive data will not be logged in case the key starts
        from '-'.

        Keyword arguments:
        filename - The full path to the config file.
        """
        logger.info('Parsing the config file %s.' % filename)

        config = configparser.ConfigParser()
        config.optionxform = str
        config.read(filename)

        self.clear()

        for category in config.sections():
            logger.debug("FOUND CATEGORY = '%s'" % category)

            for (key, value) in config.items(category):
                self._insertKey(category + '|' + key, value)

    def should_keep_current_value(self, key):
        """
        Determines whether a value for a property must be kept.

        If the propery is missing, it is treated as it should be not
        changed by the engine.

        Keyword arguments:
        key -- The key to search for.
        """
        # helps to distinguish from "empty" value which is used to indicate
        # "removal"
        return key not in self

    def should_remove_current_value(self, key):
        """
        Determines whether a value for the property must be removed.

        If the specified key is empty, it is treated as it should be
        removed by the engine.

        Return true if the value can be removed, false otherwise.

        Keyword arguments:
        key -- The key to search for.
        """
        # helps to distinguish from "missing" value which is used to indicate
        # "keeping unchanged"
        if key in self:
            return not bool(self[key])
        else:
            return False

    def get_count_with_prefix(self, prefix):
        """
        Return the total count of keys that start with the specified prefix.

        Keyword arguments:
        prefix -- prefix of the key
        """
        return len([key for key in self if key.startswith(prefix)])