diff options
| -rw-r--r-- | libvyosconfig/lib/bindings.ml | 12 | ||||
| -rw-r--r-- | python/vyos/referencetree.py | 16 |
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}') |
