summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Estabrook <jestabro@vyos.io>2020-03-30 15:15:05 -0500
committerJohn Estabrook <jestabro@vyos.io>2020-03-30 15:23:59 -0500
commit626e1a6f53b07a303bf6a17aa41534e41f106543 (patch)
tree956e22d537eed9a1fcf7ec3f1a99ceabfbca0bff
parent3bd140506ee9b250bf88a15ad9ad20ab905d3c54 (diff)
downloadvyos-1x-626e1a6f53b07a303bf6a17aa41534e41f106543.tar.gz
vyos-1x-626e1a6f53b07a303bf6a17aa41534e41f106543.zip
migration: T2029: process new version syntax in configtree
-rw-r--r--python/vyos/configtree.py62
-rw-r--r--tests/data/config.valid4
2 files changed, 9 insertions, 57 deletions
diff --git a/python/vyos/configtree.py b/python/vyos/configtree.py
index 0274f3573..84c25ebec 100644
--- a/python/vyos/configtree.py
+++ b/python/vyos/configtree.py
@@ -24,58 +24,10 @@ def escape_backslash(string: str) -> str:
result = p.sub(r'\\\\', string)
return result
-def strip_comments(s):
- """ Split a config string into the config section and the trailing comments """
- INITIAL = 0
- IN_COMMENT = 1
-
- i = len(s) - 1
-
- state = INITIAL
-
- config_end = 0
-
- # Find the first character of the comments section at the end,
- # if it exists
- while (i >= 0):
- c = s[i]
-
- if (state == INITIAL) and re.match(r'\s', c):
- # Ignore whitespace
- if (i != 0):
- i -= 1
- else:
- config_end = 0
- break
- elif (state == INITIAL) and not re.match(r'(\s|\/)', c):
- # Assume there are no (more) trailing comments,
- # this is an end of a node: either a brace of the last character
- # of a leaf node value
- config_end = i + 1
- break
- elif (state == INITIAL) and (c == '/'):
- # A comment begins, or it's a stray slash
- if (s[i-1] == '*'):
- state = IN_COMMENT
- i -= 2
- else:
- raise ValueError("Invalid syntax: stray slash at character {0}".format(i + 1))
- elif (state == IN_COMMENT) and (c == '*'):
- # A comment ends here
- try:
- if (s[i-1] == '/'):
- state = INITIAL
- i -= 2
- except:
- raise ValueError("Invalid syntax: malformed commend end at character {0}".format(i + 1))
- elif (state == IN_COMMENT) and (c != '*'):
- # Ignore everything inside comments, including braces
- i -= 1
- else:
- # Shouldn't happen
- raise ValueError("Invalid syntax at character {0}: invalid character {1}".format(i + 1, c))
-
- return (s[0:config_end], s[config_end+1:])
+def strip_version(s):
+ """ Split a config string into the config section and the version string """
+ t = re.split('(^//)', s, maxsplit=1, flags=re.MULTILINE)
+ return (t[0], ''.join(t[1:]))
def check_path(path):
# Necessary type checking
@@ -174,7 +126,7 @@ class ConfigTree(object):
self.__destroy = self.__lib.destroy
self.__destroy.argtypes = [c_void_p]
- config_section, comments_section = strip_comments(config_string)
+ config_section, version_section = strip_version(config_string)
config_section = escape_backslash(config_section)
config = self.__from_string(config_section.encode())
if config is None:
@@ -182,7 +134,7 @@ class ConfigTree(object):
raise ValueError("Failed to parse config: {0}".format(msg))
else:
self.__config = config
- self.__comments = comments_section
+ self.__version = version_section
def __del__(self):
if self.__config is not None:
@@ -193,7 +145,7 @@ class ConfigTree(object):
def to_string(self):
config_string = self.__to_string(self.__config).decode()
- config_string = "{0}\n{1}".format(config_string, self.__comments)
+ config_string = "{0}\n{1}".format(config_string, self.__version)
return config_string
def to_commands(self):
diff --git a/tests/data/config.valid b/tests/data/config.valid
index a21c6a4d1..1fbdd1505 100644
--- a/tests/data/config.valid
+++ b/tests/data/config.valid
@@ -35,5 +35,5 @@ empty-node {
trailing-leaf-node-without-value
-/* Trailing commend */
-/* Another trailing comment */
+// Trailing comment
+// Another trailing comment