summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--doc/development/compat.txt10
-rw-r--r--src/lib/Bcfg2/Compat.py6
-rw-r--r--src/lib/Bcfg2/Options.py4
3 files changed, 18 insertions, 2 deletions
diff --git a/doc/development/compat.txt b/doc/development/compat.txt
index 8700c46d3..5ac08ea68 100644
--- a/doc/development/compat.txt
+++ b/doc/development/compat.txt
@@ -129,6 +129,8 @@ below, since some of these implementations may be feature-incomplete.
+----------------+--------------------------------+--------------------------------------------+
| MutableMapping | :class:`UserDict.DictMixin` | :class:`collections.MutableMapping` (2.6+) |
+----------------+--------------------------------+--------------------------------------------+
+| literal_eval | :func:`ast.literal_eval` | :func:`eval` |
++----------------+--------------------------------+--------------------------------------------+
walk_packages
~~~~~~~~~~~~~
@@ -171,6 +173,14 @@ mind.
:class:`collections.MutableMapping` is available in Python 2.6+, and
will be used if available.
+literal_eval
+~~~~~~~~~~~~
+
+:func:`ast.literal_eval` is a safe version of :func:`eval` that will only
+allow delaration of literal strings, ints, list, dicts, etc. This was
+introduced in Python 2.6, and as such Python 2.4 uses the plain-old
+:func:`eval`.
+
Other Symbols
-------------
diff --git a/src/lib/Bcfg2/Compat.py b/src/lib/Bcfg2/Compat.py
index b8a75a0c5..1c2420ccf 100644
--- a/src/lib/Bcfg2/Compat.py
+++ b/src/lib/Bcfg2/Compat.py
@@ -286,3 +286,9 @@ except NameError:
def cmp(a, b):
""" Py3k implementation of cmp() """
return (a > b) - (a < b)
+
+# ast was introduced in python 2.6
+try:
+ from ast import literal_eval
+except ImportError:
+ literal_eval = eval
diff --git a/src/lib/Bcfg2/Options.py b/src/lib/Bcfg2/Options.py
index fdc34eb95..5653b29e5 100644
--- a/src/lib/Bcfg2/Options.py
+++ b/src/lib/Bcfg2/Options.py
@@ -1,6 +1,5 @@
"""Option parsing library for utilities."""
-import ast
import copy
import getopt
import grp
@@ -13,6 +12,7 @@ import sys
import Bcfg2.Client.Tools
from Bcfg2.Compat import ConfigParser
+from Bcfg2.Compat import literal_eval
from Bcfg2.version import __version__
@@ -333,7 +333,7 @@ def colon_split(c_string):
def dict_split(c_string):
""" literally evaluate the option in order to allow for arbitrarily nested
dictionaries """
- return ast.literal_eval(c_string)
+ return literal_eval(c_string)
def get_bool(val):