summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libvyosconfig/lib/bindings.ml12
-rw-r--r--python/vyos/referencetree.py16
2 files changed, 23 insertions, 5 deletions
diff --git a/libvyosconfig/lib/bindings.ml b/libvyosconfig/lib/bindings.ml
index d35df0e0b..3c20912fc 100644
--- a/libvyosconfig/lib/bindings.ml
+++ b/libvyosconfig/lib/bindings.ml
@@ -135,6 +135,17 @@ let write_internal_reference_tree c_ptr file =
with Internal.Write_error msg ->
error_message := msg
+let read_internal_string_reference_tree s =
+ (* alert exn Internal.read_string:
+ [Internal.Read_error] caught
+ *)
+ try
+ error_message := "";
+ let rt = (IR.read_string[@alert "-exn"]) s in
+ Ctypes.Root.create rt
+ with Internal.Read_error msg ->
+ error_message := msg; Ctypes.null
+
let create_node c_ptr path =
(* alert exn CT.create_node:
[Vytree.Empty_path] caught
@@ -546,6 +557,7 @@ struct
let () = I.internal "to_json_reference_tree" ((ptr void) @-> returning string) render_json_reference_tree
let () = I.internal "read_internal_reference_tree" (string @-> returning (ptr void)) read_internal_reference_tree
let () = I.internal "write_internal_reference_tree" ((ptr void) @-> string @-> returning void) write_internal_reference_tree
+ let () = I.internal "read_internal_string_reference_tree" (string @-> returning (ptr void)) read_internal_string_reference_tree
let () = I.internal "create_node" ((ptr void) @-> string @-> returning int) create_node
let () = I.internal "set_add_value" ((ptr void) @-> string @-> string @-> returning int) set_add_value
let () = I.internal "set_replace_value" ((ptr void) @-> string @-> string @-> returning int) set_replace_value
diff --git a/python/vyos/referencetree.py b/python/vyos/referencetree.py
index 87ed310b4..b535615dd 100644
--- a/python/vyos/referencetree.py
+++ b/python/vyos/referencetree.py
@@ -14,6 +14,7 @@
# along with this library. If not, see <http://www.gnu.org/licenses/>.
from ctypes import cdll, c_char_p, c_void_p, c_bool
+from pathlib import Path
from vyos.defaults import reference_tree_cache
@@ -25,7 +26,7 @@ class ReferenceTreeError(Exception):
class ReferenceTree:
- # pylint: disable=too-many-instance-attributes
+ # pylint: disable=too-many-instance-attributes,raise-missing-from
def __init__(self, cache_file=reference_tree_cache, libpath=LIBPATH):
self.__pointer = None
self.__lib = cdll.LoadLibrary(libpath)
@@ -35,9 +36,9 @@ class ReferenceTree:
self.__get_error.argtypes = []
self.__get_error.restype = c_char_p
- self.__read_internal = self.__lib.read_internal_reference_tree
- self.__read_internal.argtypes = [c_char_p]
- self.__read_internal.restype = c_void_p
+ self.__read_internal_string = self.__lib.read_internal_string_reference_tree
+ self.__read_internal_string.argtypes = [c_char_p]
+ self.__read_internal_string.restype = c_void_p
self.__write_internal = self.__lib.write_internal_reference_tree
self.__write_internal.argtypes = [c_void_p, c_char_p]
@@ -53,7 +54,12 @@ class ReferenceTree:
self.__equal.argtypes = [c_void_p, c_void_p]
self.__equal.restype = c_bool
- pointer = self.__read_internal(cache_file.encode())
+ try:
+ cache_string = Path(cache_file).read_bytes()
+ except OSError as e:
+ raise ValueError(f'Failed to read cache_file: {e}')
+
+ pointer = self.__read_internal_string(cache_string)
if pointer is None:
msg = self.__get_error().decode()
raise ValueError(f'Failed to read internal rep: {msg}')