diff options
author | Viacheslav Hletenko <v.gletenko@vyos.io> | 2023-12-09 13:30:49 +0000 |
---|---|---|
committer | Viacheslav Hletenko <v.gletenko@vyos.io> | 2023-12-12 15:28:20 +0000 |
commit | f208e9b9acaec45468295e33b113bbef6c0309a1 (patch) | |
tree | 2bf50746c1775a1ed520396180827ea5b4f72b4f /python/vyos/config_mgmt.py | |
parent | 138fe52743703aa771f388da026816c671e7d25b (diff) | |
download | vyos-1x-f208e9b9acaec45468295e33b113bbef6c0309a1.tar.gz vyos-1x-f208e9b9acaec45468295e33b113bbef6c0309a1.zip |
T5249: Add rollback-soft feature
Add the ability to rollback configs without rebooting
```
sudo /usr/bin/config-mgmt rollback_soft --rev 1
rollback-soft 1
```
Diffstat (limited to 'python/vyos/config_mgmt.py')
-rw-r--r-- | python/vyos/config_mgmt.py | 30 |
1 files changed, 25 insertions, 5 deletions
diff --git a/python/vyos/config_mgmt.py b/python/vyos/config_mgmt.py index fd0fa7a75..2de3d1831 100644 --- a/python/vyos/config_mgmt.py +++ b/python/vyos/config_mgmt.py @@ -30,6 +30,7 @@ from urllib.parse import urlsplit, urlunsplit from vyos.config import Config from vyos.configtree import ConfigTree, ConfigTreeError, show_diff +from vyos.load_config import load, LoadConfigError from vyos.defaults import directories from vyos.version import get_full_version_data from vyos.utils.io import ask_yes_no @@ -262,6 +263,23 @@ Proceed ?''' return msg, 0 + def rollback_soft(self, rev: int): + """Rollback without reboot (rollback-soft) + """ + msg = '' + + if not self._check_revision_number(rev): + msg = f'Invalid revision number {rev}: must be 0 < rev < {self.num_revisions}' + return msg, 1 + + rollback_ct = self._get_config_tree_revision(rev) + try: + load(rollback_ct, switch='explicit') + except LoadConfigError as e: + raise ConfigMgmtError(e) from e + + return msg, 0 + def compare(self, saved: bool=False, commands: bool=False, rev1: Optional[int]=None, rev2: Optional[int]=None) -> Tuple[str,int]: @@ -463,13 +481,10 @@ Proceed ?''' # utility functions # - @staticmethod - def _strip_version(s): - return re.split(r'(^//)', s, maxsplit=1, flags=re.MULTILINE)[0] def _get_saved_config_tree(self): with open(config_file) as f: - c = self._strip_version(f.read()) + c = f.read() return ConfigTree(c) def _get_file_revision(self, rev: int): @@ -481,7 +496,7 @@ Proceed ?''' return r def _get_config_tree_revision(self, rev: int): - c = self._strip_version(self._get_file_revision(rev)) + c = self._get_file_revision(rev) return ConfigTree(c) def _add_logrotate_conf(self): @@ -704,6 +719,11 @@ def run(): rollback.add_argument('-y', dest='no_prompt', action='store_true', help="Excute without prompt") + rollback_soft = subparsers.add_parser('rollback_soft', + help="Rollback to earlier config") + rollback_soft.add_argument('--rev', type=int, + help="Revision number for rollback") + compare = subparsers.add_parser('compare', help="Compare config files") |