summaryrefslogtreecommitdiff
path: root/python
diff options
context:
space:
mode:
authorDaniil Baturin <daniil@vyos.io>2025-09-22 13:50:54 +0100
committerGitHub <noreply@github.com>2025-09-22 13:50:54 +0100
commitcd04de9af0a98b86937d2055505284bc4448691c (patch)
tree69f73b66deb22aecd231d17c5b417b61fc96b117 /python
parent8755db638c0575f3d3c31da73de3a5fd6e66e962 (diff)
parent6a2e175e584795216ea67c8aed29df69bfeb3715 (diff)
downloadvyos-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.py4
-rw-r--r--python/vyos/configsource.py7
-rw-r--r--python/vyos/proto/vycall_pb2.py6
-rw-r--r--python/vyos/proto/vyconf_pb2.py144
-rw-r--r--python/vyos/proto/vyconf_proto.py116
-rw-r--r--python/vyos/utils/configfs.py70
-rw-r--r--python/vyos/utils/session.py45
-rw-r--r--python/vyos/vyconf_session.py40
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():