summaryrefslogtreecommitdiffstats
path: root/base/common/python
diff options
context:
space:
mode:
authorEndi Sukma Dewata <edewata@redhat.com>2013-04-29 14:48:23 -0400
committerEndi Sukma Dewata <edewata@redhat.com>2013-04-29 16:57:59 -0400
commit7b95b9d69a19cd714cae2fae0c45ffd75f016f5e (patch)
treea844791c7c99e2908e856b5e2de87a743084aeec /base/common/python
parent23cbc44604ec0f5408da023fb858e9799fddb775 (diff)
downloadpki-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__.py117
-rw-r--r--base/common/python/pki/upgrade.py165
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