Skip to content

Commit cd04de9

Browse files
authored
Merge pull request #4711 from jestabro/interstitial-set
T7737: add vyconf-aware analogue of configfs
2 parents 8755db6 + 6a2e175 commit cd04de9

File tree

10 files changed

+305
-146
lines changed

10 files changed

+305
-146
lines changed

libvyosconfig/Makefile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,8 @@ all: sharedlib
4242
PHONY: depends
4343
depends:
4444
sudo sh -c 'eval $$(opam env --root=/opt/opam --set-root) ;\
45-
opam pin add vyos1x-config https://github.com/vyos/vyos1x-config.git#b53326dce7dd2dabad2677ad82de4fcd4ea85524 -y ; \
46-
opam pin add vyconf https://github.com/vyos/vyconf.git#2da0981501a9bec8b69d29f1e52c10db90571aa4 -y'
45+
opam pin add vyos1x-config https://github.com/vyos/vyos1x-config.git#ff247fe83f4b24b5ed977ac9b04fb5fe19b196f0 -y ; \
46+
opam pin add vyconf https://github.com/vyos/vyconf.git#304e4d2a172fe1baf2c1df7f61b7a0a8e40f7d5d -y'
4747

4848
sharedlib: depends $(BUILDDIR)/libvyosconfig$(EXTDLL)
4949

python/vyos/configsession.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,9 @@ def __init__(self, session_id, app=APP, shared=False):
181181
for k, v in env_list:
182182
session_env[k] = v
183183

184-
session_env['CONFIGSESSION_PID'] = str(session_id)
184+
# replaces ambient instance of SESSION_PID,
185+
# for use when running from a non-shared configsession
186+
session_env['SESSION_PID'] = str(session_id)
185187

186188
self.__session_env = session_env
187189
self.__session_env['COMMIT_VIA'] = app

python/vyos/configsource.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -326,10 +326,11 @@ def __init__(self, session_env=None):
326326
else:
327327
self.__session_env = None
328328

329-
if session_env and 'CONFIGSESSION_PID' in session_env:
330-
self.pid = int(session_env['CONFIGSESSION_PID'])
329+
if session_env and 'SESSION_PID' in session_env:
330+
self.pid = int(session_env['SESSION_PID'])
331331
else:
332-
self.pid = os.getppid()
332+
pid = os.environ.get('SESSION_PID', '')
333+
self.pid = int(pid) if pid else os.getppid()
333334

334335
self._vyconf_session = VyconfSession(pid=self.pid)
335336
try:

python/vyos/proto/vycall_pb2.py

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

python/vyos/proto/vyconf_pb2.py

Lines changed: 74 additions & 70 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

python/vyos/proto/vyconf_proto.py

Lines changed: 72 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -28,25 +28,27 @@ class Prompt:
2828

2929
@dataclass
3030
class SetupSession:
31-
ClientPid: int = 0
32-
ClientApplication: str = None
33-
OnBehalfOf: int = None
31+
client_pid: int = 0
32+
client_application: str = None
33+
on_behalf_of: int = None
34+
client_user: str = None
35+
client_sudo_user: str = None
3436

3537
@dataclass
3638
class SessionOfPid:
37-
ClientPid: int = 0
39+
client_pid: int = 0
3840

3941
@dataclass
40-
class SessionUpdatePid:
41-
ClientPid: int = 0
42+
class SessionExists:
43+
dummy: int = None
4244

4345
@dataclass
4446
class GetConfig:
4547
dummy: int = None
4648

4749
@dataclass
4850
class Teardown:
49-
OnBehalfOf: int = None
51+
on_behalf_of: int = None
5052

5153
@dataclass
5254
class Validate:
@@ -55,11 +57,23 @@ class Validate:
5557

5658
@dataclass
5759
class Set:
58-
Path: list[str] = field(default_factory=list)
60+
path: list[str] = field(default_factory=list)
5961

6062
@dataclass
6163
class Delete:
62-
Path: list[str] = field(default_factory=list)
64+
path: list[str] = field(default_factory=list)
65+
66+
@dataclass
67+
class AuxSet:
68+
path: list[str] = field(default_factory=list)
69+
script_name: str = ""
70+
tag_value: str = None
71+
72+
@dataclass
73+
class AuxDelete:
74+
path: list[str] = field(default_factory=list)
75+
script_name: str = ""
76+
tag_value: str = None
6377

6478
@dataclass
6579
class Discard:
@@ -71,76 +85,76 @@ class SessionChanged:
7185

7286
@dataclass
7387
class Rename:
74-
EditLevel: list[str] = field(default_factory=list)
75-
From: str = ""
76-
To: str = ""
88+
edit_level: list[str] = field(default_factory=list)
89+
source: str = ""
90+
destination: str = ""
7791

7892
@dataclass
7993
class Copy:
80-
EditLevel: list[str] = field(default_factory=list)
81-
From: str = ""
82-
To: str = ""
94+
edit_level: list[str] = field(default_factory=list)
95+
source: str = ""
96+
destination: str = ""
8397

8498
@dataclass
8599
class Comment:
86-
Path: list[str] = field(default_factory=list)
87-
Comment: str = ""
100+
path: list[str] = field(default_factory=list)
101+
comment: str = ""
88102

89103
@dataclass
90104
class Commit:
91-
Confirm: bool = None
92-
ConfirmTimeout: int = None
93-
Comment: str = None
94-
DryRun: bool = None
105+
confirm: bool = None
106+
confirm_timeout: int = None
107+
comment: str = None
108+
dry_run: bool = None
95109

96110
@dataclass
97111
class Rollback:
98-
Revision: int = 0
112+
revision: int = 0
99113

100114
@dataclass
101115
class Load:
102-
Location: str = ""
116+
location: str = ""
103117
cached: bool = False
104118
format: ConfigFormat = None
105119

106120
@dataclass
107121
class Merge:
108-
Location: str = ""
122+
location: str = ""
109123
destructive: bool = False
110124
format: ConfigFormat = None
111125

112126
@dataclass
113127
class Save:
114-
Location: str = ""
128+
location: str = ""
115129
format: ConfigFormat = None
116130

117131
@dataclass
118132
class ShowConfig:
119-
Path: list[str] = field(default_factory=list)
133+
path: list[str] = field(default_factory=list)
120134
format: ConfigFormat = None
121135

122136
@dataclass
123137
class Exists:
124-
Path: list[str] = field(default_factory=list)
138+
path: list[str] = field(default_factory=list)
125139

126140
@dataclass
127141
class GetValue:
128-
Path: list[str] = field(default_factory=list)
142+
path: list[str] = field(default_factory=list)
129143
output_format: OutputFormat = None
130144

131145
@dataclass
132146
class GetValues:
133-
Path: list[str] = field(default_factory=list)
147+
path: list[str] = field(default_factory=list)
134148
output_format: OutputFormat = None
135149

136150
@dataclass
137151
class ListChildren:
138-
Path: list[str] = field(default_factory=list)
152+
path: list[str] = field(default_factory=list)
139153
output_format: OutputFormat = None
140154

141155
@dataclass
142156
class RunOpMode:
143-
Path: list[str] = field(default_factory=list)
157+
path: list[str] = field(default_factory=list)
144158
output_format: OutputFormat = None
145159

146160
@dataclass
@@ -149,16 +163,16 @@ class Confirm:
149163

150164
@dataclass
151165
class EnterConfigurationMode:
152-
Exclusive: bool = False
153-
OverrideExclusive: bool = False
166+
exclusive: bool = False
167+
override_exclusive: bool = False
154168

155169
@dataclass
156170
class ExitConfigurationMode:
157171
pass
158172

159173
@dataclass
160174
class ReloadReftree:
161-
OnBehalfOf: int = None
175+
on_behalf_of: int = None
162176

163177
@dataclass
164178
class Request:
@@ -189,8 +203,10 @@ class Request:
189203
discard: Discard = None
190204
session_changed: SessionChanged = None
191205
session_of_pid: SessionOfPid = None
192-
session_update_pid: SessionUpdatePid = None
206+
session_exists: SessionExists = None
193207
get_config: GetConfig = None
208+
aux_set: AuxSet = None
209+
aux_delete: AuxDelete = None
194210

195211
@dataclass
196212
class RequestEnvelope:
@@ -210,8 +226,8 @@ def set_request_prompt(token: str = None):
210226
req_env = RequestEnvelope(token, req)
211227
return req_env
212228

213-
def set_request_setup_session(token: str = None, client_pid: int = 0, client_application: str = None, on_behalf_of: int = None):
214-
reqi = SetupSession (client_pid, client_application, on_behalf_of)
229+
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):
230+
reqi = SetupSession (client_pid, client_application, on_behalf_of, client_user, client_sudo_user)
215231
req = Request(setup_session=reqi)
216232
req_env = RequestEnvelope(token, req)
217233
return req_env
@@ -222,9 +238,9 @@ def set_request_session_of_pid(token: str = None, client_pid: int = 0):
222238
req_env = RequestEnvelope(token, req)
223239
return req_env
224240

225-
def set_request_session_update_pid(token: str = None, client_pid: int = 0):
226-
reqi = SessionUpdatePid (client_pid)
227-
req = Request(session_update_pid=reqi)
241+
def set_request_session_exists(token: str = None, dummy: int = None):
242+
reqi = SessionExists (dummy)
243+
req = Request(session_exists=reqi)
228244
req_env = RequestEnvelope(token, req)
229245
return req_env
230246

@@ -258,6 +274,18 @@ def set_request_delete(token: str = None, path: list[str] = []):
258274
req_env = RequestEnvelope(token, req)
259275
return req_env
260276

277+
def set_request_aux_set(token: str = None, path: list[str] = [], script_name: str = "", tag_value: str = None):
278+
reqi = AuxSet (path, script_name, tag_value)
279+
req = Request(aux_set=reqi)
280+
req_env = RequestEnvelope(token, req)
281+
return req_env
282+
283+
def set_request_aux_delete(token: str = None, path: list[str] = [], script_name: str = "", tag_value: str = None):
284+
reqi = AuxDelete (path, script_name, tag_value)
285+
req = Request(aux_delete=reqi)
286+
req_env = RequestEnvelope(token, req)
287+
return req_env
288+
261289
def set_request_discard(token: str = None, dummy: int = None):
262290
reqi = Discard (dummy)
263291
req = Request(discard=reqi)
@@ -270,14 +298,14 @@ def set_request_session_changed(token: str = None, dummy: int = None):
270298
req_env = RequestEnvelope(token, req)
271299
return req_env
272300

273-
def set_request_rename(token: str = None, edit_level: list[str] = [], from_: str = "", to: str = ""):
274-
reqi = Rename (edit_level, from_, to)
301+
def set_request_rename(token: str = None, edit_level: list[str] = [], source: str = "", destination: str = ""):
302+
reqi = Rename (edit_level, source, destination)
275303
req = Request(rename=reqi)
276304
req_env = RequestEnvelope(token, req)
277305
return req_env
278306

279-
def set_request_copy(token: str = None, edit_level: list[str] = [], from_: str = "", to: str = ""):
280-
reqi = Copy (edit_level, from_, to)
307+
def set_request_copy(token: str = None, edit_level: list[str] = [], source: str = "", destination: str = ""):
308+
reqi = Copy (edit_level, source, destination)
281309
req = Request(copy=reqi)
282310
req_env = RequestEnvelope(token, req)
283311
return req_env

python/vyos/utils/configfs.py

Lines changed: 51 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -13,25 +13,57 @@
1313
# You should have received a copy of the GNU Lesser General Public
1414
# License along with this library. If not, see <http://www.gnu.org/licenses/>.
1515

16+
# pylint: disable=import-outside-toplevel
17+
1618
import os
1719

20+
from vyos.utils.backend import vyconf_backend
21+
from vyos.utils.boot import boot_configuration_complete
22+
23+
1824
def delete_cli_node(cli_path: list):
19-
from shutil import rmtree
20-
for config_dir in ['VYATTA_TEMP_CONFIG_DIR', 'VYATTA_CHANGES_ONLY_DIR']:
21-
tmp = os.path.join(os.environ[config_dir], '/'.join(cli_path))
22-
# delete CLI node
23-
if os.path.exists(tmp):
24-
rmtree(tmp)
25-
26-
def add_cli_node(cli_path: list, value: str=None):
27-
from vyos.utils.auth import get_current_user
28-
from vyos.utils.file import write_file
29-
30-
current_user = get_current_user()
31-
for config_dir in ['VYATTA_TEMP_CONFIG_DIR', 'VYATTA_CHANGES_ONLY_DIR']:
32-
# store new value
33-
tmp = os.path.join(os.environ[config_dir], '/'.join(cli_path))
34-
write_file(f'{tmp}/node.val', value, user=current_user, group='vyattacfg', mode=0o664)
35-
# mark CLI node as modified
36-
if config_dir == 'VYATTA_CHANGES_ONLY_DIR':
37-
write_file(f'{tmp}/.modified', '', user=current_user, group='vyattacfg', mode=0o664)
25+
if vyconf_backend() and boot_configuration_complete():
26+
# pylint: disable=redefined-outer-name
27+
from vyos.utils.session import delete_cli_node
28+
29+
delete_cli_node(cli_path)
30+
else:
31+
from shutil import rmtree
32+
33+
for config_dir in ['VYATTA_TEMP_CONFIG_DIR', 'VYATTA_CHANGES_ONLY_DIR']:
34+
tmp = os.path.join(os.environ[config_dir], '/'.join(cli_path))
35+
# delete CLI node
36+
if os.path.exists(tmp):
37+
rmtree(tmp)
38+
39+
40+
def add_cli_node(cli_path: list, value: str = None):
41+
if vyconf_backend() and boot_configuration_complete():
42+
# pylint: disable=redefined-outer-name
43+
from vyos.utils.session import add_cli_node
44+
45+
add_cli_node(cli_path, value)
46+
else:
47+
from vyos.utils.auth import get_current_user
48+
from vyos.utils.file import write_file
49+
50+
current_user = get_current_user()
51+
for config_dir in ['VYATTA_TEMP_CONFIG_DIR', 'VYATTA_CHANGES_ONLY_DIR']:
52+
# store new value
53+
tmp = os.path.join(os.environ[config_dir], '/'.join(cli_path))
54+
write_file(
55+
f'{tmp}/node.val',
56+
value,
57+
user=current_user,
58+
group='vyattacfg',
59+
mode=0o664,
60+
)
61+
# mark CLI node as modified
62+
if config_dir == 'VYATTA_CHANGES_ONLY_DIR':
63+
write_file(
64+
f'{tmp}/.modified',
65+
'',
66+
user=current_user,
67+
group='vyattacfg',
68+
mode=0o664,
69+
)

0 commit comments

Comments
 (0)