summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--python/vyos/vyconf_session.py27
-rwxr-xr-xsrc/helpers/vyos-merge-config.py25
2 files changed, 39 insertions, 13 deletions
diff --git a/python/vyos/vyconf_session.py b/python/vyos/vyconf_session.py
index 3f3f3957b..b42266793 100644
--- a/python/vyos/vyconf_session.py
+++ b/python/vyos/vyconf_session.py
@@ -189,6 +189,33 @@ class VyconfSession:
return self.output(out), out.status
@raise_exception
+ @config_mode
+ def merge_config(
+ self, file: str, migrate: bool = False, destructive: bool = False
+ ) -> tuple[str, int]:
+ # pylint: disable=consider-using-with
+ if migrate:
+ tmp = tempfile.NamedTemporaryFile()
+ shutil.copy2(file, tmp.name)
+ config_migrate = ConfigMigrate(tmp.name)
+ try:
+ config_migrate.run()
+ except ConfigMigrateError as e:
+ tmp.close()
+ return repr(e), 1
+ file = tmp.name
+ else:
+ tmp = ''
+
+ out = vyconf_client.send_request(
+ 'merge', token=self.__token, location=file, destructive=destructive
+ )
+ if tmp:
+ tmp.close()
+
+ return self.output(out), out.status
+
+ @raise_exception
def save_config(self, file: str, append_version: bool = False) -> tuple[str, int]:
out = vyconf_client.send_request('save', token=self.__token, location=file)
if append_version:
diff --git a/src/helpers/vyos-merge-config.py b/src/helpers/vyos-merge-config.py
index 9ac4a1aed..4879b0e9c 100755
--- a/src/helpers/vyos-merge-config.py
+++ b/src/helpers/vyos-merge-config.py
@@ -14,7 +14,6 @@
import os
import sys
import shlex
-import tempfile
import argparse
from vyos.defaults import directories
@@ -52,8 +51,9 @@ if any(file_name.startswith(f'{x}://') for x in protocols):
if not file_path:
sys.exit(f'No such file {file_name}')
else:
- if os.path.isfile(file_name):
- file_path = file_name
+ full_path = os.path.realpath(file_name)
+ if os.path.isfile(full_path):
+ file_path = full_path
else:
file_path = os.path.join(configdir, file_name)
if not os.path.isfile(file_path):
@@ -79,19 +79,18 @@ if paths:
merge_ct = mask_inclusive(merge_ct, mask)
config = Config()
-session_ct = config.get_config_tree()
-
-merge_res = merge(session_ct, merge_ct, destructive=args.destructive)
if config.vyconf_session is not None:
- with tempfile.NamedTemporaryFile() as merged_cache:
- merge_res.write_cache(merged_cache.name)
-
- out, err = config.vyconf_session.load_config(merged_cache.name, cached=True)
- if err:
- sys.exit(out)
- print(out)
+ out, err = config.vyconf_session.merge_config(
+ file_path, destructive=args.destructive
+ )
+ if err:
+ sys.exit(out)
+ print(out)
else:
+ session_ct = config.get_config_tree()
+ merge_res = merge(session_ct, merge_ct, destructive=args.destructive)
+
load_explicit(merge_res)