diff options
| author | Daniil Baturin <daniil@vyos.io> | 2025-09-22 13:50:54 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-09-22 13:50:54 +0100 |
| commit | cd04de9af0a98b86937d2055505284bc4448691c (patch) | |
| tree | 69f73b66deb22aecd231d17c5b417b61fc96b117 /python | |
| parent | 8755db638c0575f3d3c31da73de3a5fd6e66e962 (diff) | |
| parent | 6a2e175e584795216ea67c8aed29df69bfeb3715 (diff) | |
| download | vyos-1x-cd04de9af0a98b86937d2055505284bc4448691c.tar.gz vyos-1x-cd04de9af0a98b86937d2055505284bc4448691c.zip | |
Merge pull request #4711 from jestabro/interstitial-set
T7737: add vyconf-aware analogue of configfs
Diffstat (limited to 'python')
| -rw-r--r-- | python/vyos/configsession.py | 4 | ||||
| -rw-r--r-- | python/vyos/configsource.py | 7 | ||||
| -rw-r--r-- | python/vyos/proto/vycall_pb2.py | 6 | ||||
| -rw-r--r-- | python/vyos/proto/vyconf_pb2.py | 144 | ||||
| -rw-r--r-- | python/vyos/proto/vyconf_proto.py | 116 | ||||
| -rw-r--r-- | python/vyos/utils/configfs.py | 70 | ||||
| -rw-r--r-- | python/vyos/utils/session.py | 45 | ||||
| -rw-r--r-- | python/vyos/vyconf_session.py | 40 |
8 files changed, 288 insertions, 144 deletions
diff --git a/python/vyos/configsession.py b/python/vyos/configsession.py index cd0088b60..462a028bb 100644 --- a/python/vyos/configsession.py +++ b/python/vyos/configsession.py @@ -181,7 +181,9 @@ class ConfigSession(object): for k, v in env_list: session_env[k] = v - session_env['CONFIGSESSION_PID'] = str(session_id) + # replaces ambient instance of SESSION_PID, + # for use when running from a non-shared configsession + session_env['SESSION_PID'] = str(session_id) self.__session_env = session_env self.__session_env['COMMIT_VIA'] = app diff --git a/python/vyos/configsource.py b/python/vyos/configsource.py index 24a17c711..6bf794d9e 100644 --- a/python/vyos/configsource.py +++ b/python/vyos/configsource.py @@ -326,10 +326,11 @@ class ConfigSourceVyconfSession(ConfigSource): else: self.__session_env = None - if session_env and 'CONFIGSESSION_PID' in session_env: - self.pid = int(session_env['CONFIGSESSION_PID']) + if session_env and 'SESSION_PID' in session_env: + self.pid = int(session_env['SESSION_PID']) else: - self.pid = os.getppid() + pid = os.environ.get('SESSION_PID', '') + self.pid = int(pid) if pid else os.getppid() self._vyconf_session = VyconfSession(pid=self.pid) try: diff --git a/python/vyos/proto/vycall_pb2.py b/python/vyos/proto/vycall_pb2.py index 95214d2a6..e7c228499 100644 --- a/python/vyos/proto/vycall_pb2.py +++ b/python/vyos/proto/vycall_pb2.py @@ -13,7 +13,7 @@ _sym_db = _symbol_database.Default() -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0cvycall.proto\"&\n\x06Status\x12\x0f\n\x07success\x18\x01 \x02(\x08\x12\x0b\n\x03out\x18\x02 \x02(\t\"Y\n\x04\x43\x61ll\x12\x13\n\x0bscript_name\x18\x01 \x02(\t\x12\x11\n\ttag_value\x18\x02 \x01(\t\x12\x11\n\targ_value\x18\x03 \x01(\t\x12\x16\n\x05reply\x18\x04 \x01(\x0b\x32\x07.Status\"~\n\x06\x43ommit\x12\x12\n\nsession_id\x18\x01 \x02(\t\x12\x0f\n\x07\x64ry_run\x18\x04 \x02(\x08\x12\x0e\n\x06\x61tomic\x18\x05 \x02(\x08\x12\x12\n\nbackground\x18\x06 \x02(\x08\x12\x15\n\x04init\x18\x07 \x01(\x0b\x32\x07.Status\x12\x14\n\x05\x63\x61lls\x18\x08 \x03(\x0b\x32\x05.Call') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0cvycall.proto\"&\n\x06Status\x12\x0f\n\x07success\x18\x01 \x02(\x08\x12\x0b\n\x03out\x18\x02 \x02(\t\"Y\n\x04\x43\x61ll\x12\x13\n\x0bscript_name\x18\x01 \x02(\t\x12\x11\n\ttag_value\x18\x02 \x01(\t\x12\x11\n\targ_value\x18\x03 \x01(\t\x12\x16\n\x05reply\x18\x04 \x01(\x0b\x32\x07.Status\"\xb4\x01\n\x06\x43ommit\x12\x12\n\nsession_id\x18\x01 \x02(\t\x12\x13\n\x0bsession_pid\x18\x02 \x02(\x05\x12\x11\n\tsudo_user\x18\x03 \x02(\t\x12\x0c\n\x04user\x18\x04 \x02(\t\x12\x0f\n\x07\x64ry_run\x18\x05 \x02(\x08\x12\x0e\n\x06\x61tomic\x18\x06 \x02(\x08\x12\x12\n\nbackground\x18\x07 \x02(\x08\x12\x15\n\x04init\x18\x08 \x01(\x0b\x32\x07.Status\x12\x14\n\x05\x63\x61lls\x18\t \x03(\x0b\x32\x05.Call') _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'vycall_pb2', globals()) @@ -24,6 +24,6 @@ if _descriptor._USE_C_DESCRIPTORS == False: _STATUS._serialized_end=54 _CALL._serialized_start=56 _CALL._serialized_end=145 - _COMMIT._serialized_start=147 - _COMMIT._serialized_end=273 + _COMMIT._serialized_start=148 + _COMMIT._serialized_end=328 # @@protoc_insertion_point(module_scope) diff --git a/python/vyos/proto/vyconf_pb2.py b/python/vyos/proto/vyconf_pb2.py index 4bf0eb2e0..164dbc1d7 100644 --- a/python/vyos/proto/vyconf_pb2.py +++ b/python/vyos/proto/vyconf_pb2.py @@ -13,81 +13,85 @@ _sym_db = _symbol_database.Default() -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0cvyconf.proto\"\xae\x15\n\x07Request\x12!\n\x06prompt\x18\x01 \x01(\x0b\x32\x0f.Request.PromptH\x00\x12.\n\rsetup_session\x18\x02 \x01(\x0b\x32\x15.Request.SetupSessionH\x00\x12\x1b\n\x03set\x18\x03 \x01(\x0b\x32\x0c.Request.SetH\x00\x12!\n\x06\x64\x65lete\x18\x04 \x01(\x0b\x32\x0f.Request.DeleteH\x00\x12!\n\x06rename\x18\x05 \x01(\x0b\x32\x0f.Request.RenameH\x00\x12\x1d\n\x04\x63opy\x18\x06 \x01(\x0b\x32\r.Request.CopyH\x00\x12#\n\x07\x63omment\x18\x07 \x01(\x0b\x32\x10.Request.CommentH\x00\x12!\n\x06\x63ommit\x18\x08 \x01(\x0b\x32\x0f.Request.CommitH\x00\x12%\n\x08rollback\x18\t \x01(\x0b\x32\x11.Request.RollbackH\x00\x12\x1f\n\x05merge\x18\n \x01(\x0b\x32\x0e.Request.MergeH\x00\x12\x1d\n\x04save\x18\x0b \x01(\x0b\x32\r.Request.SaveH\x00\x12*\n\x0bshow_config\x18\x0c \x01(\x0b\x32\x13.Request.ShowConfigH\x00\x12!\n\x06\x65xists\x18\r \x01(\x0b\x32\x0f.Request.ExistsH\x00\x12&\n\tget_value\x18\x0e \x01(\x0b\x32\x11.Request.GetValueH\x00\x12(\n\nget_values\x18\x0f \x01(\x0b\x32\x12.Request.GetValuesH\x00\x12.\n\rlist_children\x18\x10 \x01(\x0b\x32\x15.Request.ListChildrenH\x00\x12)\n\x0brun_op_mode\x18\x11 \x01(\x0b\x32\x12.Request.RunOpModeH\x00\x12#\n\x07\x63onfirm\x18\x12 \x01(\x0b\x32\x10.Request.ConfirmH\x00\x12\x43\n\x18\x65nter_configuration_mode\x18\x13 \x01(\x0b\x32\x1f.Request.EnterConfigurationModeH\x00\x12\x41\n\x17\x65xit_configuration_mode\x18\x14 \x01(\x0b\x32\x1e.Request.ExitConfigurationModeH\x00\x12%\n\x08validate\x18\x15 \x01(\x0b\x32\x11.Request.ValidateH\x00\x12%\n\x08teardown\x18\x16 \x01(\x0b\x32\x11.Request.TeardownH\x00\x12\x30\n\x0ereload_reftree\x18\x17 \x01(\x0b\x32\x16.Request.ReloadReftreeH\x00\x12\x1d\n\x04load\x18\x18 \x01(\x0b\x32\r.Request.LoadH\x00\x12#\n\x07\x64iscard\x18\x19 \x01(\x0b\x32\x10.Request.DiscardH\x00\x12\x32\n\x0fsession_changed\x18\x1a \x01(\x0b\x32\x17.Request.SessionChangedH\x00\x12/\n\x0esession_of_pid\x18\x1b \x01(\x0b\x32\x15.Request.SessionOfPidH\x00\x12\x37\n\x12session_update_pid\x18\x1c \x01(\x0b\x32\x19.Request.SessionUpdatePidH\x00\x12(\n\nget_config\x18\x1d \x01(\x0b\x32\x12.Request.GetConfigH\x00\x1a\x08\n\x06Prompt\x1aP\n\x0cSetupSession\x12\x11\n\tClientPid\x18\x01 \x02(\x05\x12\x19\n\x11\x43lientApplication\x18\x02 \x01(\t\x12\x12\n\nOnBehalfOf\x18\x03 \x01(\x05\x1a!\n\x0cSessionOfPid\x12\x11\n\tClientPid\x18\x01 \x02(\x05\x1a%\n\x10SessionUpdatePid\x12\x11\n\tClientPid\x18\x01 \x02(\x05\x1a\x1a\n\tGetConfig\x12\r\n\x05\x64ummy\x18\x01 \x01(\x05\x1a\x1e\n\x08Teardown\x12\x12\n\nOnBehalfOf\x18\x01 \x01(\x05\x1a\x46\n\x08Validate\x12\x0c\n\x04Path\x18\x01 \x03(\t\x12,\n\routput_format\x18\x02 \x01(\x0e\x32\x15.Request.OutputFormat\x1a\x13\n\x03Set\x12\x0c\n\x04Path\x18\x01 \x03(\t\x1a\x16\n\x06\x44\x65lete\x12\x0c\n\x04Path\x18\x01 \x03(\t\x1a\x18\n\x07\x44iscard\x12\r\n\x05\x64ummy\x18\x01 \x01(\x05\x1a\x1f\n\x0eSessionChanged\x12\r\n\x05\x64ummy\x18\x01 \x01(\x05\x1a\x35\n\x06Rename\x12\x11\n\tEditLevel\x18\x01 \x03(\t\x12\x0c\n\x04\x46rom\x18\x02 \x02(\t\x12\n\n\x02To\x18\x03 \x02(\t\x1a\x33\n\x04\x43opy\x12\x11\n\tEditLevel\x18\x01 \x03(\t\x12\x0c\n\x04\x46rom\x18\x02 \x02(\t\x12\n\n\x02To\x18\x03 \x02(\t\x1a(\n\x07\x43omment\x12\x0c\n\x04Path\x18\x01 \x03(\t\x12\x0f\n\x07\x43omment\x18\x02 \x02(\t\x1aR\n\x06\x43ommit\x12\x0f\n\x07\x43onfirm\x18\x01 \x01(\x08\x12\x16\n\x0e\x43onfirmTimeout\x18\x02 \x01(\x05\x12\x0f\n\x07\x43omment\x18\x03 \x01(\t\x12\x0e\n\x06\x44ryRun\x18\x04 \x01(\x08\x1a\x1c\n\x08Rollback\x12\x10\n\x08Revision\x18\x01 \x02(\x05\x1aO\n\x04Load\x12\x10\n\x08Location\x18\x01 \x02(\t\x12\x0e\n\x06\x63\x61\x63hed\x18\x02 \x02(\x08\x12%\n\x06\x66ormat\x18\x03 \x01(\x0e\x32\x15.Request.ConfigFormat\x1aU\n\x05Merge\x12\x10\n\x08Location\x18\x01 \x02(\t\x12\x13\n\x0b\x64\x65structive\x18\x02 \x02(\x08\x12%\n\x06\x66ormat\x18\x03 \x01(\x0e\x32\x15.Request.ConfigFormat\x1a?\n\x04Save\x12\x10\n\x08Location\x18\x01 \x02(\t\x12%\n\x06\x66ormat\x18\x02 \x01(\x0e\x32\x15.Request.ConfigFormat\x1a\x41\n\nShowConfig\x12\x0c\n\x04Path\x18\x01 \x03(\t\x12%\n\x06\x66ormat\x18\x02 \x01(\x0e\x32\x15.Request.ConfigFormat\x1a\x16\n\x06\x45xists\x12\x0c\n\x04Path\x18\x01 \x03(\t\x1a\x46\n\x08GetValue\x12\x0c\n\x04Path\x18\x01 \x03(\t\x12,\n\routput_format\x18\x02 \x01(\x0e\x32\x15.Request.OutputFormat\x1aG\n\tGetValues\x12\x0c\n\x04Path\x18\x01 \x03(\t\x12,\n\routput_format\x18\x02 \x01(\x0e\x32\x15.Request.OutputFormat\x1aJ\n\x0cListChildren\x12\x0c\n\x04Path\x18\x01 \x03(\t\x12,\n\routput_format\x18\x02 \x01(\x0e\x32\x15.Request.OutputFormat\x1aG\n\tRunOpMode\x12\x0c\n\x04Path\x18\x01 \x03(\t\x12,\n\routput_format\x18\x02 \x01(\x0e\x32\x15.Request.OutputFormat\x1a\t\n\x07\x43onfirm\x1a\x46\n\x16\x45nterConfigurationMode\x12\x11\n\tExclusive\x18\x01 \x02(\x08\x12\x19\n\x11OverrideExclusive\x18\x02 \x02(\x08\x1a\x17\n\x15\x45xitConfigurationMode\x1a#\n\rReloadReftree\x12\x12\n\nOnBehalfOf\x18\x01 \x01(\x05\"#\n\x0c\x43onfigFormat\x12\t\n\x05\x43URLY\x10\x00\x12\x08\n\x04JSON\x10\x01\")\n\x0cOutputFormat\x12\x0c\n\x08OutPlain\x10\x00\x12\x0b\n\x07OutJSON\x10\x01\x42\x05\n\x03msg\";\n\x0fRequestEnvelope\x12\r\n\x05token\x18\x01 \x01(\t\x12\x19\n\x07request\x18\x02 \x02(\x0b\x32\x08.Request\"S\n\x08Response\x12\x17\n\x06status\x18\x01 \x02(\x0e\x32\x07.Errnum\x12\x0e\n\x06output\x18\x02 \x01(\t\x12\r\n\x05\x65rror\x18\x03 \x01(\t\x12\x0f\n\x07warning\x18\x04 \x01(\t*\xd2\x01\n\x06\x45rrnum\x12\x0b\n\x07SUCCESS\x10\x00\x12\x08\n\x04\x46\x41IL\x10\x01\x12\x10\n\x0cINVALID_PATH\x10\x02\x12\x11\n\rINVALID_VALUE\x10\x03\x12\x16\n\x12\x43OMMIT_IN_PROGRESS\x10\x04\x12\x18\n\x14\x43ONFIGURATION_LOCKED\x10\x05\x12\x12\n\x0eINTERNAL_ERROR\x10\x06\x12\x15\n\x11PERMISSION_DENIED\x10\x07\x12\x17\n\x13PATH_ALREADY_EXISTS\x10\x08\x12\x16\n\x12UNCOMMITED_CHANGES\x10\t') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0cvyconf.proto\"\xc5\x17\n\x07Request\x12!\n\x06prompt\x18\x01 \x01(\x0b\x32\x0f.Request.PromptH\x00\x12.\n\rsetup_session\x18\x02 \x01(\x0b\x32\x15.Request.SetupSessionH\x00\x12\x1b\n\x03set\x18\x03 \x01(\x0b\x32\x0c.Request.SetH\x00\x12!\n\x06\x64\x65lete\x18\x04 \x01(\x0b\x32\x0f.Request.DeleteH\x00\x12!\n\x06rename\x18\x05 \x01(\x0b\x32\x0f.Request.RenameH\x00\x12\x1d\n\x04\x63opy\x18\x06 \x01(\x0b\x32\r.Request.CopyH\x00\x12#\n\x07\x63omment\x18\x07 \x01(\x0b\x32\x10.Request.CommentH\x00\x12!\n\x06\x63ommit\x18\x08 \x01(\x0b\x32\x0f.Request.CommitH\x00\x12%\n\x08rollback\x18\t \x01(\x0b\x32\x11.Request.RollbackH\x00\x12\x1f\n\x05merge\x18\n \x01(\x0b\x32\x0e.Request.MergeH\x00\x12\x1d\n\x04save\x18\x0b \x01(\x0b\x32\r.Request.SaveH\x00\x12*\n\x0bshow_config\x18\x0c \x01(\x0b\x32\x13.Request.ShowConfigH\x00\x12!\n\x06\x65xists\x18\r \x01(\x0b\x32\x0f.Request.ExistsH\x00\x12&\n\tget_value\x18\x0e \x01(\x0b\x32\x11.Request.GetValueH\x00\x12(\n\nget_values\x18\x0f \x01(\x0b\x32\x12.Request.GetValuesH\x00\x12.\n\rlist_children\x18\x10 \x01(\x0b\x32\x15.Request.ListChildrenH\x00\x12)\n\x0brun_op_mode\x18\x11 \x01(\x0b\x32\x12.Request.RunOpModeH\x00\x12#\n\x07\x63onfirm\x18\x12 \x01(\x0b\x32\x10.Request.ConfirmH\x00\x12\x43\n\x18\x65nter_configuration_mode\x18\x13 \x01(\x0b\x32\x1f.Request.EnterConfigurationModeH\x00\x12\x41\n\x17\x65xit_configuration_mode\x18\x14 \x01(\x0b\x32\x1e.Request.ExitConfigurationModeH\x00\x12%\n\x08validate\x18\x15 \x01(\x0b\x32\x11.Request.ValidateH\x00\x12%\n\x08teardown\x18\x16 \x01(\x0b\x32\x11.Request.TeardownH\x00\x12\x30\n\x0ereload_reftree\x18\x17 \x01(\x0b\x32\x16.Request.ReloadReftreeH\x00\x12\x1d\n\x04load\x18\x18 \x01(\x0b\x32\r.Request.LoadH\x00\x12#\n\x07\x64iscard\x18\x19 \x01(\x0b\x32\x10.Request.DiscardH\x00\x12\x32\n\x0fsession_changed\x18\x1a \x01(\x0b\x32\x17.Request.SessionChangedH\x00\x12/\n\x0esession_of_pid\x18\x1b \x01(\x0b\x32\x15.Request.SessionOfPidH\x00\x12\x30\n\x0esession_exists\x18\x1c \x01(\x0b\x32\x16.Request.SessionExistsH\x00\x12(\n\nget_config\x18\x1d \x01(\x0b\x32\x12.Request.GetConfigH\x00\x12\"\n\x07\x61ux_set\x18\x1e \x01(\x0b\x32\x0f.Request.AuxSetH\x00\x12(\n\naux_delete\x18\x1f \x01(\x0b\x32\x12.Request.AuxDeleteH\x00\x1a\x08\n\x06Prompt\x1a\x83\x01\n\x0cSetupSession\x12\x12\n\nclient_pid\x18\x01 \x02(\x05\x12\x1a\n\x12\x63lient_application\x18\x02 \x01(\t\x12\x14\n\x0con_behalf_of\x18\x03 \x01(\x05\x12\x13\n\x0b\x63lient_user\x18\x04 \x01(\t\x12\x18\n\x10\x63lient_sudo_user\x18\x05 \x01(\t\x1a\"\n\x0cSessionOfPid\x12\x12\n\nclient_pid\x18\x01 \x02(\x05\x1a\x1e\n\rSessionExists\x12\r\n\x05\x64ummy\x18\x01 \x01(\x05\x1a\x1a\n\tGetConfig\x12\r\n\x05\x64ummy\x18\x01 \x01(\x05\x1a \n\x08Teardown\x12\x14\n\x0con_behalf_of\x18\x01 \x01(\x05\x1a\x46\n\x08Validate\x12\x0c\n\x04Path\x18\x01 \x03(\t\x12,\n\routput_format\x18\x02 \x01(\x0e\x32\x15.Request.OutputFormat\x1a\x13\n\x03Set\x12\x0c\n\x04path\x18\x01 \x03(\t\x1a\x16\n\x06\x44\x65lete\x12\x0c\n\x04path\x18\x01 \x03(\t\x1a>\n\x06\x41uxSet\x12\x0c\n\x04path\x18\x01 \x03(\t\x12\x13\n\x0bscript_name\x18\x02 \x02(\t\x12\x11\n\ttag_value\x18\x03 \x01(\t\x1a\x41\n\tAuxDelete\x12\x0c\n\x04path\x18\x01 \x03(\t\x12\x13\n\x0bscript_name\x18\x02 \x02(\t\x12\x11\n\ttag_value\x18\x03 \x01(\t\x1a\x18\n\x07\x44iscard\x12\r\n\x05\x64ummy\x18\x01 \x01(\x05\x1a\x1f\n\x0eSessionChanged\x12\r\n\x05\x64ummy\x18\x01 \x01(\x05\x1a\x41\n\x06Rename\x12\x12\n\nedit_level\x18\x01 \x03(\t\x12\x0e\n\x06source\x18\x02 \x02(\t\x12\x13\n\x0b\x64\x65stination\x18\x03 \x02(\t\x1a?\n\x04\x43opy\x12\x12\n\nedit_level\x18\x01 \x03(\t\x12\x0e\n\x06source\x18\x02 \x02(\t\x12\x13\n\x0b\x64\x65stination\x18\x03 \x02(\t\x1a(\n\x07\x43omment\x12\x0c\n\x04path\x18\x01 \x03(\t\x12\x0f\n\x07\x63omment\x18\x02 \x02(\t\x1aT\n\x06\x43ommit\x12\x0f\n\x07\x63onfirm\x18\x01 \x01(\x08\x12\x17\n\x0f\x63onfirm_timeout\x18\x02 \x01(\x05\x12\x0f\n\x07\x63omment\x18\x03 \x01(\t\x12\x0f\n\x07\x64ry_run\x18\x04 \x01(\x08\x1a\x1c\n\x08Rollback\x12\x10\n\x08revision\x18\x01 \x02(\x05\x1aO\n\x04Load\x12\x10\n\x08location\x18\x01 \x02(\t\x12\x0e\n\x06\x63\x61\x63hed\x18\x02 \x02(\x08\x12%\n\x06\x66ormat\x18\x03 \x01(\x0e\x32\x15.Request.ConfigFormat\x1aU\n\x05Merge\x12\x10\n\x08location\x18\x01 \x02(\t\x12\x13\n\x0b\x64\x65structive\x18\x02 \x02(\x08\x12%\n\x06\x66ormat\x18\x03 \x01(\x0e\x32\x15.Request.ConfigFormat\x1a?\n\x04Save\x12\x10\n\x08location\x18\x01 \x02(\t\x12%\n\x06\x66ormat\x18\x02 \x01(\x0e\x32\x15.Request.ConfigFormat\x1a\x41\n\nShowConfig\x12\x0c\n\x04path\x18\x01 \x03(\t\x12%\n\x06\x66ormat\x18\x02 \x01(\x0e\x32\x15.Request.ConfigFormat\x1a\x16\n\x06\x45xists\x12\x0c\n\x04path\x18\x01 \x03(\t\x1a\x46\n\x08GetValue\x12\x0c\n\x04path\x18\x01 \x03(\t\x12,\n\routput_format\x18\x02 \x01(\x0e\x32\x15.Request.OutputFormat\x1aG\n\tGetValues\x12\x0c\n\x04path\x18\x01 \x03(\t\x12,\n\routput_format\x18\x02 \x01(\x0e\x32\x15.Request.OutputFormat\x1aJ\n\x0cListChildren\x12\x0c\n\x04path\x18\x01 \x03(\t\x12,\n\routput_format\x18\x02 \x01(\x0e\x32\x15.Request.OutputFormat\x1aG\n\tRunOpMode\x12\x0c\n\x04path\x18\x01 \x03(\t\x12,\n\routput_format\x18\x02 \x01(\x0e\x32\x15.Request.OutputFormat\x1a\t\n\x07\x43onfirm\x1aG\n\x16\x45nterConfigurationMode\x12\x11\n\texclusive\x18\x01 \x02(\x08\x12\x1a\n\x12override_exclusive\x18\x02 \x02(\x08\x1a\x17\n\x15\x45xitConfigurationMode\x1a%\n\rReloadReftree\x12\x14\n\x0con_behalf_of\x18\x01 \x01(\x05\"#\n\x0c\x43onfigFormat\x12\t\n\x05\x43URLY\x10\x00\x12\x08\n\x04JSON\x10\x01\")\n\x0cOutputFormat\x12\x0c\n\x08OutPlain\x10\x00\x12\x0b\n\x07OutJSON\x10\x01\x42\x05\n\x03msg\";\n\x0fRequestEnvelope\x12\r\n\x05token\x18\x01 \x01(\t\x12\x19\n\x07request\x18\x02 \x02(\x0b\x32\x08.Request\"S\n\x08Response\x12\x17\n\x06status\x18\x01 \x02(\x0e\x32\x07.Errnum\x12\x0e\n\x06output\x18\x02 \x01(\t\x12\r\n\x05\x65rror\x18\x03 \x01(\t\x12\x0f\n\x07warning\x18\x04 \x01(\t*\xd2\x01\n\x06\x45rrnum\x12\x0b\n\x07SUCCESS\x10\x00\x12\x08\n\x04\x46\x41IL\x10\x01\x12\x10\n\x0cINVALID_PATH\x10\x02\x12\x11\n\rINVALID_VALUE\x10\x03\x12\x16\n\x12\x43OMMIT_IN_PROGRESS\x10\x04\x12\x18\n\x14\x43ONFIGURATION_LOCKED\x10\x05\x12\x12\n\x0eINTERNAL_ERROR\x10\x06\x12\x15\n\x11PERMISSION_DENIED\x10\x07\x12\x17\n\x13PATH_ALREADY_EXISTS\x10\x08\x12\x16\n\x12UNCOMMITED_CHANGES\x10\t') _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'vyconf_pb2', globals()) if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None - _ERRNUM._serialized_start=2900 - _ERRNUM._serialized_end=3110 + _ERRNUM._serialized_start=3179 + _ERRNUM._serialized_end=3389 _REQUEST._serialized_start=17 - _REQUEST._serialized_end=2751 - _REQUEST_PROMPT._serialized_start=1237 - _REQUEST_PROMPT._serialized_end=1245 - _REQUEST_SETUPSESSION._serialized_start=1247 - _REQUEST_SETUPSESSION._serialized_end=1327 - _REQUEST_SESSIONOFPID._serialized_start=1329 - _REQUEST_SESSIONOFPID._serialized_end=1362 - _REQUEST_SESSIONUPDATEPID._serialized_start=1364 - _REQUEST_SESSIONUPDATEPID._serialized_end=1401 - _REQUEST_GETCONFIG._serialized_start=1403 - _REQUEST_GETCONFIG._serialized_end=1429 - _REQUEST_TEARDOWN._serialized_start=1431 - _REQUEST_TEARDOWN._serialized_end=1461 - _REQUEST_VALIDATE._serialized_start=1463 - _REQUEST_VALIDATE._serialized_end=1533 - _REQUEST_SET._serialized_start=1535 - _REQUEST_SET._serialized_end=1554 - _REQUEST_DELETE._serialized_start=1556 - _REQUEST_DELETE._serialized_end=1578 - _REQUEST_DISCARD._serialized_start=1580 - _REQUEST_DISCARD._serialized_end=1604 - _REQUEST_SESSIONCHANGED._serialized_start=1606 - _REQUEST_SESSIONCHANGED._serialized_end=1637 - _REQUEST_RENAME._serialized_start=1639 - _REQUEST_RENAME._serialized_end=1692 - _REQUEST_COPY._serialized_start=1694 - _REQUEST_COPY._serialized_end=1745 - _REQUEST_COMMENT._serialized_start=1747 - _REQUEST_COMMENT._serialized_end=1787 - _REQUEST_COMMIT._serialized_start=1789 - _REQUEST_COMMIT._serialized_end=1871 - _REQUEST_ROLLBACK._serialized_start=1873 - _REQUEST_ROLLBACK._serialized_end=1901 - _REQUEST_LOAD._serialized_start=1903 - _REQUEST_LOAD._serialized_end=1982 - _REQUEST_MERGE._serialized_start=1984 - _REQUEST_MERGE._serialized_end=2069 - _REQUEST_SAVE._serialized_start=2071 - _REQUEST_SAVE._serialized_end=2134 - _REQUEST_SHOWCONFIG._serialized_start=2136 - _REQUEST_SHOWCONFIG._serialized_end=2201 - _REQUEST_EXISTS._serialized_start=2203 - _REQUEST_EXISTS._serialized_end=2225 - _REQUEST_GETVALUE._serialized_start=2227 - _REQUEST_GETVALUE._serialized_end=2297 - _REQUEST_GETVALUES._serialized_start=2299 - _REQUEST_GETVALUES._serialized_end=2370 - _REQUEST_LISTCHILDREN._serialized_start=2372 - _REQUEST_LISTCHILDREN._serialized_end=2446 - _REQUEST_RUNOPMODE._serialized_start=2448 - _REQUEST_RUNOPMODE._serialized_end=2519 - _REQUEST_CONFIRM._serialized_start=1799 - _REQUEST_CONFIRM._serialized_end=1808 - _REQUEST_ENTERCONFIGURATIONMODE._serialized_start=2532 - _REQUEST_ENTERCONFIGURATIONMODE._serialized_end=2602 - _REQUEST_EXITCONFIGURATIONMODE._serialized_start=2604 - _REQUEST_EXITCONFIGURATIONMODE._serialized_end=2627 - _REQUEST_RELOADREFTREE._serialized_start=2629 - _REQUEST_RELOADREFTREE._serialized_end=2664 - _REQUEST_CONFIGFORMAT._serialized_start=2666 - _REQUEST_CONFIGFORMAT._serialized_end=2701 - _REQUEST_OUTPUTFORMAT._serialized_start=2703 - _REQUEST_OUTPUTFORMAT._serialized_end=2744 - _REQUESTENVELOPE._serialized_start=2753 - _REQUESTENVELOPE._serialized_end=2812 - _RESPONSE._serialized_start=2814 - _RESPONSE._serialized_end=2897 + _REQUEST._serialized_end=3030 + _REQUEST_PROMPT._serialized_start=1308 + _REQUEST_PROMPT._serialized_end=1316 + _REQUEST_SETUPSESSION._serialized_start=1319 + _REQUEST_SETUPSESSION._serialized_end=1450 + _REQUEST_SESSIONOFPID._serialized_start=1452 + _REQUEST_SESSIONOFPID._serialized_end=1486 + _REQUEST_SESSIONEXISTS._serialized_start=1488 + _REQUEST_SESSIONEXISTS._serialized_end=1518 + _REQUEST_GETCONFIG._serialized_start=1520 + _REQUEST_GETCONFIG._serialized_end=1546 + _REQUEST_TEARDOWN._serialized_start=1548 + _REQUEST_TEARDOWN._serialized_end=1580 + _REQUEST_VALIDATE._serialized_start=1582 + _REQUEST_VALIDATE._serialized_end=1652 + _REQUEST_SET._serialized_start=1654 + _REQUEST_SET._serialized_end=1673 + _REQUEST_DELETE._serialized_start=1675 + _REQUEST_DELETE._serialized_end=1697 + _REQUEST_AUXSET._serialized_start=1699 + _REQUEST_AUXSET._serialized_end=1761 + _REQUEST_AUXDELETE._serialized_start=1763 + _REQUEST_AUXDELETE._serialized_end=1828 + _REQUEST_DISCARD._serialized_start=1830 + _REQUEST_DISCARD._serialized_end=1854 + _REQUEST_SESSIONCHANGED._serialized_start=1856 + _REQUEST_SESSIONCHANGED._serialized_end=1887 + _REQUEST_RENAME._serialized_start=1889 + _REQUEST_RENAME._serialized_end=1954 + _REQUEST_COPY._serialized_start=1956 + _REQUEST_COPY._serialized_end=2019 + _REQUEST_COMMENT._serialized_start=2021 + _REQUEST_COMMENT._serialized_end=2061 + _REQUEST_COMMIT._serialized_start=2063 + _REQUEST_COMMIT._serialized_end=2147 + _REQUEST_ROLLBACK._serialized_start=2149 + _REQUEST_ROLLBACK._serialized_end=2177 + _REQUEST_LOAD._serialized_start=2179 + _REQUEST_LOAD._serialized_end=2258 + _REQUEST_MERGE._serialized_start=2260 + _REQUEST_MERGE._serialized_end=2345 + _REQUEST_SAVE._serialized_start=2347 + _REQUEST_SAVE._serialized_end=2410 + _REQUEST_SHOWCONFIG._serialized_start=2412 + _REQUEST_SHOWCONFIG._serialized_end=2477 + _REQUEST_EXISTS._serialized_start=2479 + _REQUEST_EXISTS._serialized_end=2501 + _REQUEST_GETVALUE._serialized_start=2503 + _REQUEST_GETVALUE._serialized_end=2573 + _REQUEST_GETVALUES._serialized_start=2575 + _REQUEST_GETVALUES._serialized_end=2646 + _REQUEST_LISTCHILDREN._serialized_start=2648 + _REQUEST_LISTCHILDREN._serialized_end=2722 + _REQUEST_RUNOPMODE._serialized_start=2724 + _REQUEST_RUNOPMODE._serialized_end=2795 + _REQUEST_CONFIRM._serialized_start=2797 + _REQUEST_CONFIRM._serialized_end=2806 + _REQUEST_ENTERCONFIGURATIONMODE._serialized_start=2808 + _REQUEST_ENTERCONFIGURATIONMODE._serialized_end=2879 + _REQUEST_EXITCONFIGURATIONMODE._serialized_start=2881 + _REQUEST_EXITCONFIGURATIONMODE._serialized_end=2904 + _REQUEST_RELOADREFTREE._serialized_start=2906 + _REQUEST_RELOADREFTREE._serialized_end=2943 + _REQUEST_CONFIGFORMAT._serialized_start=2945 + _REQUEST_CONFIGFORMAT._serialized_end=2980 + _REQUEST_OUTPUTFORMAT._serialized_start=2982 + _REQUEST_OUTPUTFORMAT._serialized_end=3023 + _REQUESTENVELOPE._serialized_start=3032 + _REQUESTENVELOPE._serialized_end=3091 + _RESPONSE._serialized_start=3093 + _RESPONSE._serialized_end=3176 # @@protoc_insertion_point(module_scope) diff --git a/python/vyos/proto/vyconf_proto.py b/python/vyos/proto/vyconf_proto.py index ec62a6e35..a7fb24337 100644 --- a/python/vyos/proto/vyconf_proto.py +++ b/python/vyos/proto/vyconf_proto.py @@ -28,17 +28,19 @@ class Prompt: @dataclass class SetupSession: - ClientPid: int = 0 - ClientApplication: str = None - OnBehalfOf: int = None + client_pid: int = 0 + client_application: str = None + on_behalf_of: int = None + client_user: str = None + client_sudo_user: str = None @dataclass class SessionOfPid: - ClientPid: int = 0 + client_pid: int = 0 @dataclass -class SessionUpdatePid: - ClientPid: int = 0 +class SessionExists: + dummy: int = None @dataclass class GetConfig: @@ -46,7 +48,7 @@ class GetConfig: @dataclass class Teardown: - OnBehalfOf: int = None + on_behalf_of: int = None @dataclass class Validate: @@ -55,11 +57,23 @@ class Validate: @dataclass class Set: - Path: list[str] = field(default_factory=list) + path: list[str] = field(default_factory=list) @dataclass class Delete: - Path: list[str] = field(default_factory=list) + path: list[str] = field(default_factory=list) + +@dataclass +class AuxSet: + path: list[str] = field(default_factory=list) + script_name: str = "" + tag_value: str = None + +@dataclass +class AuxDelete: + path: list[str] = field(default_factory=list) + script_name: str = "" + tag_value: str = None @dataclass class Discard: @@ -71,76 +85,76 @@ class SessionChanged: @dataclass class Rename: - EditLevel: list[str] = field(default_factory=list) - From: str = "" - To: str = "" + edit_level: list[str] = field(default_factory=list) + source: str = "" + destination: str = "" @dataclass class Copy: - EditLevel: list[str] = field(default_factory=list) - From: str = "" - To: str = "" + edit_level: list[str] = field(default_factory=list) + source: str = "" + destination: str = "" @dataclass class Comment: - Path: list[str] = field(default_factory=list) - Comment: str = "" + path: list[str] = field(default_factory=list) + comment: str = "" @dataclass class Commit: - Confirm: bool = None - ConfirmTimeout: int = None - Comment: str = None - DryRun: bool = None + confirm: bool = None + confirm_timeout: int = None + comment: str = None + dry_run: bool = None @dataclass class Rollback: - Revision: int = 0 + revision: int = 0 @dataclass class Load: - Location: str = "" + location: str = "" cached: bool = False format: ConfigFormat = None @dataclass class Merge: - Location: str = "" + location: str = "" destructive: bool = False format: ConfigFormat = None @dataclass class Save: - Location: str = "" + location: str = "" format: ConfigFormat = None @dataclass class ShowConfig: - Path: list[str] = field(default_factory=list) + path: list[str] = field(default_factory=list) format: ConfigFormat = None @dataclass class Exists: - Path: list[str] = field(default_factory=list) + path: list[str] = field(default_factory=list) @dataclass class GetValue: - Path: list[str] = field(default_factory=list) + path: list[str] = field(default_factory=list) output_format: OutputFormat = None @dataclass class GetValues: - Path: list[str] = field(default_factory=list) + path: list[str] = field(default_factory=list) output_format: OutputFormat = None @dataclass class ListChildren: - Path: list[str] = field(default_factory=list) + path: list[str] = field(default_factory=list) output_format: OutputFormat = None @dataclass class RunOpMode: - Path: list[str] = field(default_factory=list) + path: list[str] = field(default_factory=list) output_format: OutputFormat = None @dataclass @@ -149,8 +163,8 @@ class Confirm: @dataclass class EnterConfigurationMode: - Exclusive: bool = False - OverrideExclusive: bool = False + exclusive: bool = False + override_exclusive: bool = False @dataclass class ExitConfigurationMode: @@ -158,7 +172,7 @@ class ExitConfigurationMode: @dataclass class ReloadReftree: - OnBehalfOf: int = None + on_behalf_of: int = None @dataclass class Request: @@ -189,8 +203,10 @@ class Request: discard: Discard = None session_changed: SessionChanged = None session_of_pid: SessionOfPid = None - session_update_pid: SessionUpdatePid = None + session_exists: SessionExists = None get_config: GetConfig = None + aux_set: AuxSet = None + aux_delete: AuxDelete = None @dataclass class RequestEnvelope: @@ -210,8 +226,8 @@ def set_request_prompt(token: str = None): req_env = RequestEnvelope(token, req) return req_env -def set_request_setup_session(token: str = None, client_pid: int = 0, client_application: str = None, on_behalf_of: int = None): - reqi = SetupSession (client_pid, client_application, on_behalf_of) +def set_request_setup_session(token: str = None, client_pid: int = 0, client_application: str = None, on_behalf_of: int = None, client_user: str = None, client_sudo_user: str = None): + reqi = SetupSession (client_pid, client_application, on_behalf_of, client_user, client_sudo_user) req = Request(setup_session=reqi) req_env = RequestEnvelope(token, req) return req_env @@ -222,9 +238,9 @@ def set_request_session_of_pid(token: str = None, client_pid: int = 0): req_env = RequestEnvelope(token, req) return req_env -def set_request_session_update_pid(token: str = None, client_pid: int = 0): - reqi = SessionUpdatePid (client_pid) - req = Request(session_update_pid=reqi) +def set_request_session_exists(token: str = None, dummy: int = None): + reqi = SessionExists (dummy) + req = Request(session_exists=reqi) req_env = RequestEnvelope(token, req) return req_env @@ -258,6 +274,18 @@ def set_request_delete(token: str = None, path: list[str] = []): req_env = RequestEnvelope(token, req) return req_env +def set_request_aux_set(token: str = None, path: list[str] = [], script_name: str = "", tag_value: str = None): + reqi = AuxSet (path, script_name, tag_value) + req = Request(aux_set=reqi) + req_env = RequestEnvelope(token, req) + return req_env + +def set_request_aux_delete(token: str = None, path: list[str] = [], script_name: str = "", tag_value: str = None): + reqi = AuxDelete (path, script_name, tag_value) + req = Request(aux_delete=reqi) + req_env = RequestEnvelope(token, req) + return req_env + def set_request_discard(token: str = None, dummy: int = None): reqi = Discard (dummy) req = Request(discard=reqi) @@ -270,14 +298,14 @@ def set_request_session_changed(token: str = None, dummy: int = None): req_env = RequestEnvelope(token, req) return req_env -def set_request_rename(token: str = None, edit_level: list[str] = [], from_: str = "", to: str = ""): - reqi = Rename (edit_level, from_, to) +def set_request_rename(token: str = None, edit_level: list[str] = [], source: str = "", destination: str = ""): + reqi = Rename (edit_level, source, destination) req = Request(rename=reqi) req_env = RequestEnvelope(token, req) return req_env -def set_request_copy(token: str = None, edit_level: list[str] = [], from_: str = "", to: str = ""): - reqi = Copy (edit_level, from_, to) +def set_request_copy(token: str = None, edit_level: list[str] = [], source: str = "", destination: str = ""): + reqi = Copy (edit_level, source, destination) req = Request(copy=reqi) req_env = RequestEnvelope(token, req) return req_env diff --git a/python/vyos/utils/configfs.py b/python/vyos/utils/configfs.py index 307e1446c..72332ae42 100644 --- a/python/vyos/utils/configfs.py +++ b/python/vyos/utils/configfs.py @@ -13,25 +13,57 @@ # You should have received a copy of the GNU Lesser General Public # License along with this library. If not, see <http://www.gnu.org/licenses/>. +# pylint: disable=import-outside-toplevel + import os +from vyos.utils.backend import vyconf_backend +from vyos.utils.boot import boot_configuration_complete + + def delete_cli_node(cli_path: list): - from shutil import rmtree - for config_dir in ['VYATTA_TEMP_CONFIG_DIR', 'VYATTA_CHANGES_ONLY_DIR']: - tmp = os.path.join(os.environ[config_dir], '/'.join(cli_path)) - # delete CLI node - if os.path.exists(tmp): - rmtree(tmp) - -def add_cli_node(cli_path: list, value: str=None): - from vyos.utils.auth import get_current_user - from vyos.utils.file import write_file - - current_user = get_current_user() - for config_dir in ['VYATTA_TEMP_CONFIG_DIR', 'VYATTA_CHANGES_ONLY_DIR']: - # store new value - tmp = os.path.join(os.environ[config_dir], '/'.join(cli_path)) - write_file(f'{tmp}/node.val', value, user=current_user, group='vyattacfg', mode=0o664) - # mark CLI node as modified - if config_dir == 'VYATTA_CHANGES_ONLY_DIR': - write_file(f'{tmp}/.modified', '', user=current_user, group='vyattacfg', mode=0o664) + if vyconf_backend() and boot_configuration_complete(): + # pylint: disable=redefined-outer-name + from vyos.utils.session import delete_cli_node + + delete_cli_node(cli_path) + else: + from shutil import rmtree + + for config_dir in ['VYATTA_TEMP_CONFIG_DIR', 'VYATTA_CHANGES_ONLY_DIR']: + tmp = os.path.join(os.environ[config_dir], '/'.join(cli_path)) + # delete CLI node + if os.path.exists(tmp): + rmtree(tmp) + + +def add_cli_node(cli_path: list, value: str = None): + if vyconf_backend() and boot_configuration_complete(): + # pylint: disable=redefined-outer-name + from vyos.utils.session import add_cli_node + + add_cli_node(cli_path, value) + else: + from vyos.utils.auth import get_current_user + from vyos.utils.file import write_file + + current_user = get_current_user() + for config_dir in ['VYATTA_TEMP_CONFIG_DIR', 'VYATTA_CHANGES_ONLY_DIR']: + # store new value + tmp = os.path.join(os.environ[config_dir], '/'.join(cli_path)) + write_file( + f'{tmp}/node.val', + value, + user=current_user, + group='vyattacfg', + mode=0o664, + ) + # mark CLI node as modified + if config_dir == 'VYATTA_CHANGES_ONLY_DIR': + write_file( + f'{tmp}/.modified', + '', + user=current_user, + group='vyattacfg', + mode=0o664, + ) diff --git a/python/vyos/utils/session.py b/python/vyos/utils/session.py index bc5240fc7..80691a378 100644 --- a/python/vyos/utils/session.py +++ b/python/vyos/utils/session.py @@ -15,6 +15,9 @@ # pylint: disable=import-outside-toplevel +import os +from inspect import stack + def in_config_session(): """Vyatta bash completion uses the following environment variable for @@ -23,3 +26,45 @@ def in_config_session(): from os import environ return '_OFR_CONFIGURE' in environ + + +# utility for functions below +def get_caller_name() -> str: + filename = stack()[2].filename + return os.path.basename(filename) + + +# OOB operations used (rarely) to update the session config during commit +# execution of config mode scripts. +# The standard use is for replacing plaintext with encrypted passwords in +# the session config during commit. +def delete_cli_node(cli_path: list): + from vyos.vyconf_session import VyconfSession + from vyos.configsession import ConfigSessionError + + pid = os.environ.get('SESSION_PID', '') + if not pid: + raise ValueError('Missing env var SESSION_PID') + + script_name = get_caller_name() + tag_value = os.environ.get('VYOS_TAGNODE_VALUE', None) + + vs = VyconfSession(pid=pid, on_error=ConfigSessionError) + vs.aux_delete(cli_path, script_name, tag_value) + + +def add_cli_node(cli_path: list, value: str = None): + from vyos.vyconf_session import VyconfSession + from vyos.configsession import ConfigSessionError + + pid = os.environ.get('SESSION_PID', '') + if not pid: + raise ValueError('Missing env var SESSION_PID') + + script_name = get_caller_name() + tag_value = os.environ.get('VYOS_TAGNODE_VALUE', None) + + cli_path = cli_path + [value] if value else cli_path + + vs = VyconfSession(pid=pid, on_error=ConfigSessionError) + vs.aux_set(cli_path, script_name, tag_value) diff --git a/python/vyos/vyconf_session.py b/python/vyos/vyconf_session.py index 4b79073ab..379de4e24 100644 --- a/python/vyos/vyconf_session.py +++ b/python/vyos/vyconf_session.py @@ -41,18 +41,24 @@ class VyconfSession: self, token: str = None, pid: int = None, on_error: Type[Exception] = None ): self.pid = os.getpid() if pid is None else pid + self.sudo_user = os.environ.get('SUDO_USER', None) + self.user = os.environ.get('USER', None) + if token is None: # CLI applications with arg pid=getppid() allow coordination # with the ambient session; other uses (such as ConfigSession) # may default to self pid out = vyconf_client.send_request('session_of_pid', client_pid=self.pid) if out.output is None: - out = vyconf_client.send_request('setup_session', client_pid=self.pid) + out = vyconf_client.send_request( + 'setup_session', + client_pid=self.pid, + client_sudo_user=self.sudo_user, + client_user=self.user, + ) self.__token = out.output else: - out = vyconf_client.send_request( - 'session_update_pid', token=token, client_pid=self.pid - ) + out = vyconf_client.send_request('session_exists', token=token) if out.status: raise ValueError(f'No existing session for token: {token}') self.__token = token @@ -136,6 +142,32 @@ class VyconfSession: return self.output(out), out.status @raise_exception + def aux_set( + self, path: list[str], script_name: str, tag_value: str = None + ) -> tuple[str, int]: + out = vyconf_client.send_request( + 'aux_set', + token=self.__token, + path=path, + script_name=script_name, + tag_value=tag_value, + ) + return self.output(out), out.status + + @raise_exception + def aux_delete( + self, path: list[str], script_name: str, tag_value: str = None + ) -> tuple[str, int]: + out = vyconf_client.send_request( + 'aux_delete', + token=self.__token, + path=path, + script_name=script_name, + tag_value=tag_value, + ) + return self.output(out), out.status + + @raise_exception @config_mode def commit(self) -> tuple[str, int]: if not self.session_changed(): |
