summaryrefslogtreecommitdiff
path: root/src/session.ml
diff options
context:
space:
mode:
authorDaniil Baturin <daniil@baturin.org>2024-11-07 18:02:08 +0000
committerGitHub <noreply@github.com>2024-11-07 18:02:08 +0000
commit196fdd7fdf6dcf751b7364c59e34278bfd0193e3 (patch)
treecfeff0991481c8281e24cf1698b20a76854059a4 /src/session.ml
parentdd9271b4304c6b1a5a2576821d1b2b8fd3aa6bf5 (diff)
parent9b90d3cc4da72c13ef4270150e4b547ff03fc813 (diff)
downloadvyconf-196fdd7fdf6dcf751b7364c59e34278bfd0193e3.tar.gz
vyconf-196fdd7fdf6dcf751b7364c59e34278bfd0193e3.zip
Merge pull request #11 from jestabro/vyconf-minimal
T6718: use the vyconf daemon for validation of set commands
Diffstat (limited to 'src/session.ml')
-rw-r--r--src/session.ml71
1 files changed, 43 insertions, 28 deletions
diff --git a/src/session.ml b/src/session.ml
index 832bfe6..a8eccad 100644
--- a/src/session.ml
+++ b/src/session.ml
@@ -1,5 +1,6 @@
-module CT = Config_tree
-module RT = Reference_tree
+module CT = Vyos1x.Config_tree
+module VT = Vyos1x.Vytree
+module RT = Vyos1x.Reference_tree
module D = Directories
exception Session_error of string
@@ -16,7 +17,7 @@ type world = {
}
type session_data = {
- proposed_config : Config_tree.t;
+ proposed_config : CT.t;
modified: bool;
conf_mode: bool;
changeset: cfg_op list;
@@ -36,12 +37,12 @@ let make world client_app user = {
let string_of_op op =
match op with
| CfgSet (path, value, _) ->
- let path_str = Util.string_of_list path in
+ let path_str = Vyos1x.Util.string_of_list path in
(match value with
| None -> Printf.sprintf "set %s" path_str
| Some v -> Printf.sprintf "set %s \"%s\"" path_str v)
| CfgDelete (path, value) ->
- let path_str = Util.string_of_list path in
+ let path_str = Vyos1x.Util.string_of_list path in
(match value with
| None -> Printf.sprintf "delete %s" path_str
| Some v -> Printf.sprintf "delete %s \"%s\"" path_str v)
@@ -63,52 +64,66 @@ let rec apply_changes changeset config =
| [] -> config
| c :: cs -> apply_changes cs (apply_cfg_op c config)
+let validate w _s path =
+ try
+ RT.validate_path D.(w.dirs.validators) w.reference_tree path
+ with RT.Validation_error x -> raise (Session_error x)
+
+let split_path w _s path =
+ RT.split_path w.reference_tree path
+
let set w s path =
- let path, value = RT.validate_path D.(w.dirs.validators) w.reference_tree path in
- let value_behaviour = if RT.is_multi w.reference_tree path then CT.AddValue else CT.ReplaceValue in
+ let _ = validate w s path in
+ let path, value = split_path w s path in
+ let refpath = RT.refpath w.reference_tree path in
+ let value_behaviour = if RT.is_multi w.reference_tree refpath then CT.AddValue else CT.ReplaceValue in
let op = CfgSet (path, value, value_behaviour) in
let config = apply_cfg_op op s.proposed_config in
{s with proposed_config=config; changeset=(op :: s.changeset)}
let delete w s path =
- let path, value = RT.validate_path D.(w.dirs.validators) w.reference_tree path in
+ let _ = validate w s path in
+ let path, value = split_path w s path in
let op = CfgDelete (path, value) in
let config = apply_cfg_op op s.proposed_config in
{s with proposed_config=config; changeset=(op :: s.changeset)}
let get_value w s path =
- if not (Vytree.exists s.proposed_config path) then
- raise (Session_error ("Path does not exist"))
- else if not (RT.is_leaf w.reference_tree path) then
+ if not (VT.exists s.proposed_config path) then
+ raise (Session_error ("Config path does not exist"))
+ else let refpath = RT.refpath w.reference_tree path in
+ if not (RT.is_leaf w.reference_tree refpath) then
raise (Session_error "Cannot get a value of a non-leaf node")
- else if (RT.is_multi w.reference_tree path) then
+ else if (RT.is_multi w.reference_tree refpath) then
raise (Session_error "This node can have more than one value")
- else if (RT.is_valueless w.reference_tree path) then
+ else if (RT.is_valueless w.reference_tree refpath) then
raise (Session_error "This node can have more than one value")
else CT.get_value s.proposed_config path
let get_values w s path =
- if not (Vytree.exists s.proposed_config path) then
- raise (Session_error ("Path does not exist"))
- else if not (RT.is_leaf w.reference_tree path) then
+ if not (VT.exists s.proposed_config path) then
+ raise (Session_error ("Config path does not exist"))
+ else let refpath = RT.refpath w.reference_tree path in
+ if not (RT.is_leaf w.reference_tree refpath) then
raise (Session_error "Cannot get a value of a non-leaf node")
- else if not (RT.is_multi w.reference_tree path) then
+ else if not (RT.is_multi w.reference_tree refpath) then
raise (Session_error "This node can have only one value")
- else CT.get_values s.proposed_config path
+ else CT.get_values s.proposed_config path
let list_children w s path =
- if not (Vytree.exists s.proposed_config path) then
- raise (Session_error ("Path does not exist"))
- else if (RT.is_leaf w.reference_tree path) then
+ if not (VT.exists s.proposed_config path) then
+ raise (Session_error ("Config path does not exist"))
+ else let refpath = RT.refpath w.reference_tree path in
+ if (RT.is_leaf w.reference_tree refpath) then
raise (Session_error "Cannot list children of a leaf node")
- else Vytree.children_of_path s.proposed_config path
+ else VT.children_of_path s.proposed_config path
-let exists w s path =
- Vytree.exists s.proposed_config path
+let exists _w s path =
+ VT.exists s.proposed_config path
-let show_config w s path fmt =
- let open Vyconf_types in
- if (path <> []) && not (Vytree.exists s.proposed_config path) then
+let show_config _w s path fmt =
+ let open Vyconf_connect.Vyconf_pbt in
+ if (path <> []) && not (VT.exists s.proposed_config path) then
raise (Session_error ("Path does not exist"))
else
let node = s.proposed_config in
@@ -117,5 +132,5 @@ let show_config w s path fmt =
| Json ->
let node =
(match path with [] -> s.proposed_config |
- _ as ps -> Vytree.get s.proposed_config ps) in
+ _ as ps -> VT.get s.proposed_config ps) in
CT.to_yojson node |> Yojson.Safe.pretty_to_string