diff options
| author | Endi Sukma Dewata <edewata@redhat.com> | 2013-04-29 14:48:23 -0400 |
|---|---|---|
| committer | Endi Sukma Dewata <edewata@redhat.com> | 2013-04-29 16:57:59 -0400 |
| commit | 7b95b9d69a19cd714cae2fae0c45ffd75f016f5e (patch) | |
| tree | a844791c7c99e2908e856b5e2de87a743084aeec /base/common/python | |
| parent | 23cbc44604ec0f5408da023fb858e9799fddb775 (diff) | |
| download | pki-7b95b9d69a19cd714cae2fae0c45ffd75f016f5e.tar.gz pki-7b95b9d69a19cd714cae2fae0c45ffd75f016f5e.tar.xz pki-7b95b9d69a19cd714cae2fae0c45ffd75f016f5e.zip | |
Added upgrade scriptlet to add JNI_JAR_DIR.
A new upgrade scriptlet has been added to add JNI_JAR_DIR into
pki.conf. The code to manipulate property files has been refactored
from PKIUpgradeTracker into a separate PropertyFile class to allow
reuse.
The pki-base package has been modified to deliver a default pki.conf
in /usr/share/pki/etc and copy it into /etc/pki if it doesn't exist.
Diffstat (limited to 'base/common/python')
| -rw-r--r-- | base/common/python/pki/__init__.py | 117 | ||||
| -rw-r--r-- | base/common/python/pki/upgrade.py | 165 |
2 files changed, 179 insertions, 103 deletions
diff --git a/base/common/python/pki/__init__.py b/base/common/python/pki/__init__.py index f9822dde9..95f3a7335 100644 --- a/base/common/python/pki/__init__.py +++ b/base/common/python/pki/__init__.py @@ -97,3 +97,120 @@ class PKIException(Exception): Exception.__init__(self, message) self.exception = exception + + +class PropertyFile(object): + + def __init__(self, filename, delimiter='='): + + self.filename = filename + self.delimiter = delimiter + + self.lines = [] + + def read(self): + + self.lines = [] + + if not os.path.exists(self.filename): + return + + # read all lines and preserve the original order + with open(self.filename, 'r') as f: + for line in f: + line = line.strip('\n') + self.lines.append(line) + + def write(self): + + # write all lines in the original order + with open(self.filename, 'w') as f: + for line in self.lines: + f.write(line + '\n') + + def show(self): + + for line in self.lines: + print line + + def insert_line(self, index, line): + + self.lines.insert(index, line) + + def index(self, name): + + for i, line in enumerate(self.lines): + + # parse <key> <delimiter> <value> + match = re.match('^\s*(\S*)\s*%s\s*(.*)\s*$' % self.delimiter, line) + + if not match: + continue + + key = match.group(1) + + if key.lower() == name.lower(): + return i + + return -1 + + def get(self, name): + + result = None + + for line in self.lines: + + # parse <key> <delimiter> <value> + match = re.match('^\s*(\S*)\s*%s\s*(.*)\s*$' % self.delimiter, line) + + if not match: + continue + + key = match.group(1) + value = match.group(2) + + if key.lower() == name.lower(): + return value + + return result + + def set(self, name, value, index=None): + + for i, line in enumerate(self.lines): + + # parse <key> <delimiter> <value> + match = re.match('^\s*(\S*)\s*%s\s*(.*)\s*$' % self.delimiter, line) + + if not match: + continue + + key = match.group(1) + + if key.lower() == name.lower(): + self.lines[i] = key + self.delimiter + value + return + + if index is None: + self.lines.append(name + self.delimiter + value) + + else: + self.insert_line(index, name + self.delimiter + value) + + def remove(self, name): + + for i, line in enumerate(self.lines): + + # parse <key> <delimiter> <value> + match = re.match('^\s*(\S*)\s*%s\s*(.*)\s*$' % self.delimiter, line) + + if not match: + continue + + key = match.group(1) + value = match.group(2) + + if key.lower() == name.lower(): + self.lines.pop(i) + return value + + return None diff --git a/base/common/python/pki/upgrade.py b/base/common/python/pki/upgrade.py index 66f07ff66..dd4ffe8a2 100644 --- a/base/common/python/pki/upgrade.py +++ b/base/common/python/pki/upgrade.py @@ -108,36 +108,14 @@ class PKIUpgradeTracker(object): index_key='PKI_UPGRADE_INDEX'): self.name = name - self.filename = filename - self.delimiter = delimiter self.version_key = version_key self.index_key = index_key - self.read() - - - def read(self): - - self.lines = [] - - if not os.path.exists(self.filename): - return - - # read all lines and preserve the original order - with open(self.filename, 'r') as f: - for line in f: - line = line.strip('\n') - self.lines.append(line) - - - def write(self): - - # write all lines in the original order - with open(self.filename, 'w') as f: - for line in self.lines: - f.write(line + '\n') + # properties must be read and written immediately to avoid + # interfering with scriptlets that update the same file + self.properties = pki.PropertyFile(filename, delimiter) def remove(self): @@ -145,8 +123,6 @@ class PKIUpgradeTracker(object): self.remove_version() self.remove_index() - self.write() - def set(self, version): @@ -154,8 +130,6 @@ class PKIUpgradeTracker(object): self.set_version(version) self.remove_index() - self.write() - def show(self): @@ -170,106 +144,93 @@ class PKIUpgradeTracker(object): print + def get_index(self): - def get_property(self, name): - - result = None - - for line in self.lines: - - # parse <key> <delimiter> <value> - match = re.match('^\s*(\S*)\s*%s\s*(.*)\s*$' % self.delimiter, line) - - if not match: - continue - - key = match.group(1) - value = match.group(2) - - if key.lower() == name.lower(): - result = value - break - - return result - - - def set_property(self, name, value): - - found = False - - for index, line in enumerate(self.lines): - - # parse <key> <delimiter> <value> - match = re.match('^\s*(\S*)\s*%s\s*(.*)\s*$' % self.delimiter, line) - - if not match: - continue - - key = match.group(1) - - if key.lower() != name.lower(): - continue - - self.lines[index] = key + self.delimiter + value - found = True - break - - if not found: - self.lines.append(name + self.delimiter + value) - - - def remove_property(self, name): - - for index, line in enumerate(self.lines): - - # parse <key> <delimiter> <value> - match = re.match('^\s*(\S*)\s*%s\s*(.*)\s*$' % self.delimiter, line) - - if not match: - continue + self.properties.read() - key = match.group(1) + index = self.properties.get(self.index_key) - if key.lower() != name.lower(): - continue + if index: + return int(index) - self.lines.pop(index) + return 0 + def set_index(self, index): - def get_index(self): + self.properties.read() - index = self.get_property(self.index_key) + # find index + i = self.properties.index(self.index_key) + if i >= 0: + # if already exists, update index + self.properties.set(self.index_key, str(index)) - if index: - return int(index) + else: + # find version + i = self.properties.index(self.version_key) + if i >= 0: + # if version exists, add index after version + self.properties.set(self.index_key, str(index), index=i+1) - return 0 + else: + # otherwise, add index at the end separated by a blank line + # if last line is not empty, append empty line + length = len(self.properties.lines) + if length > 0 and self.properties.lines[length-1] != '': + self.properties.insert_line(length, '') + length = length + 1 - def set_index(self, index): - self.set_property(self.index_key, str(index)) + # add index + self.properties.set(self.index_key, str(index), index=length) + self.properties.write() def remove_index(self): - self.remove_property(self.index_key) + self.properties.read() + self.properties.remove(self.index_key) + self.properties.write() def get_version(self): - version = self.get_property(self.version_key) + self.properties.read() + version = self.properties.get(self.version_key) if version: return Version(version) return Version(DEFAULT_VERSION) - def set_version(self, version): - self.set_property(self.version_key, str(version)) + self.properties.read() + + # find version + i = self.properties.index(self.version_key) + if i >= 0: + # if already exists, update version + self.properties.set(self.version_key, str(version)) + + else: + # otherwise, add version at the end separated by a blank line + + # if last line is not empty, append empty line + length = len(self.properties.lines) + if length > 0 and self.properties.lines[length-1] != '': + self.properties.insert_line(length, '') + length = length + 1 + + # add version + self.properties.set(self.version_key, str(version), index=length) + + self.properties.write() def remove_version(self): - self.remove_property(self.version_key) + + self.properties.read() + self.properties.remove(self.version_key) + self.properties.write() @functools.total_ordering @@ -309,8 +270,6 @@ class PKIUpgradeScriptlet(object): tracker.remove_index() tracker.set_version(self.version.next) - tracker.write() - def upgrade_system(self): # Callback method to upgrade the system. pass |
