diff options
Diffstat (limited to 'src')
43 files changed, 3161 insertions, 3310 deletions
diff --git a/src/adapter/vy_delete.ml b/src/adapter/vy_delete.ml new file mode 100644 index 0000000..304e74b --- /dev/null +++ b/src/adapter/vy_delete.ml @@ -0,0 +1,30 @@ +let () = + let path_list = Array.to_list (Array.sub Sys.argv 1 (Array.length Sys.argv - 1)) + in + let () = + if List.length path_list = 0 then + (Printf.printf "no path specified\n"; exit 1) + in + let handle = + let h = Vyos1x_adapter.cstore_handle_init () in + if not (Vyos1x_adapter.cstore_in_config_session_handle h) then + (Vyos1x_adapter.cstore_handle_free h; + Printf.printf "not in config session\n"; exit 1) + else Some h + in + let output = + match handle with + | Some h -> Vyos1x_adapter.cstore_delete_path h path_list + | None -> "missing session handle" + in + let ret = + if output = "" then 0 + else 1 + in + let () = + match handle with + | Some h -> Vyos1x_adapter.cstore_handle_free h + | None -> () + in + let () = print_endline output in + exit ret diff --git a/src/adapter/vy_load_config.ml b/src/adapter/vy_load_config.ml new file mode 100644 index 0000000..66bbfb8 --- /dev/null +++ b/src/adapter/vy_load_config.ml @@ -0,0 +1,47 @@ +(* Adapter load_config + *) + +open Vyos1x + +let read_config filename = + let ch = open_in filename in + let s = really_input_string ch (in_channel_length ch) in + let ct = + try + Ok (Parser.from_string s) + with Vyos1x.Util.Syntax_error (opt, msg) -> + begin + match opt with + | None -> Error msg + | Some (line, pos) -> + let out = Printf.sprintf "%s line %d pos %d\n" msg line pos + in Error out + end + in + close_in ch; + ct + +let read_configs f g = + let l = read_config f in + let r = read_config g in + match l, r with + | Ok left, Ok right -> Ok (left, right) + | Error msg_l, Error msg_r -> Error (msg_l ^ msg_r) + | Error msg_l, _ -> Error msg_l + | _, Error msg_r -> Error msg_r + + +let args = [] +let usage = Printf.sprintf "Usage: %s <config> <new config>" Sys.argv.(0) + +let () = if Array.length Sys.argv <> 3 then (Arg.usage args usage; exit 1) + +let () = +let left_name = Sys.argv.(1) in +let right_name = Sys.argv.(2) in +let read = read_configs left_name right_name in +let res = + match read with + | Ok (left, right) -> Vyos1x_adapter.load_config left right + | Error msg -> msg +in Printf.printf "%s\n" res diff --git a/src/adapter/vy_set.ml b/src/adapter/vy_set.ml new file mode 100644 index 0000000..b631de0 --- /dev/null +++ b/src/adapter/vy_set.ml @@ -0,0 +1,77 @@ +let valid = ref false + +let format_out l = + let fl = List.filter (fun s -> (String.length s) > 0) l in + String.concat "\n\n" fl + +let is_valid v = + match v with + | None -> true + | Some _ -> false + +let valid_err v = + Option.value v ~default:"" + +let () = + let path_list = Array.to_list (Array.sub Sys.argv 1 (Array.length Sys.argv - 1)) + in + let () = + if List.length path_list = 0 then + (Printf.printf "no path specified\n"; exit 1) + in + let legacy = + try + let _ = Sys.getenv "LEGACY_VALIDATE" in + true + with Not_found -> false + in + let no_set = + try + let _ = Sys.getenv "LEGACY_NO_SET" in + true + with Not_found -> false + in + let handle = + if legacy || not no_set then + let h = Vyos1x_adapter.cstore_handle_init () in + if not (Vyos1x_adapter.cstore_in_config_session_handle h) then + (Vyos1x_adapter.cstore_handle_free h; + Printf.printf "not in config session\n"; exit 1) + else Some h + else None + in + let valid = + if not legacy then + Vyos1x_adapter.vyconf_validate_path path_list + else + begin + let out = + match handle with + | Some h -> Vyos1x_adapter.legacy_validate_path h path_list + | None -> "missing session handle" + in + match out with + | "" -> None + | _ -> Some out + end + in + let res = + if not no_set && (is_valid valid) then + match handle with + | Some h -> + Vyos1x_adapter.cstore_set_path h path_list + | None -> "missing session handle" + else "" + in + let ret = + if (is_valid valid) && (res = "") then 0 + else 1 + in + let output = format_out [(valid_err valid); res] in + let () = + match handle with + | Some h -> Vyos1x_adapter.cstore_handle_free h + | None -> () + in + let () = print_endline output in + exit ret diff --git a/src/adapter/vyos1x_adapter.ml b/src/adapter/vyos1x_adapter.ml new file mode 100644 index 0000000..5835f5a --- /dev/null +++ b/src/adapter/vyos1x_adapter.ml @@ -0,0 +1,140 @@ +open Ctypes +open Foreign + +let libvyatta = Dl.dlopen ~flags:[Dl.RTLD_LAZY] ~filename:"libvyatta-cfg.so" + +let cstore_init = foreign ~from:libvyatta "vy_cstore_init" (void @-> returning uint64_t) +let cstore_free = foreign ~from:libvyatta "vy_cstore_free" (uint64_t @-> returning void) +let in_session = foreign ~from:libvyatta "vy_in_session" (uint64_t @-> returning int) +let cstore_set_path = foreign ~from:libvyatta "vy_set_path" (uint64_t @-> (ptr void) @-> size_t @-> returning string) +let cstore_del_path = foreign ~from:libvyatta "vy_delete_path" (uint64_t @-> (ptr void) @-> size_t @-> returning string) +let cstore_validate_path = foreign ~from:libvyatta "vy_validate_path" (uint64_t @-> (ptr void) @-> size_t @-> returning string) +let cstore_legacy_set_path = foreign ~from:libvyatta "vy_legacy_set_path" (uint64_t @-> (ptr void) @-> size_t @-> returning string) + +let cstore_handle_init () = Unsigned.UInt64.to_int (cstore_init ()) +let cstore_handle_free h = cstore_free (Unsigned.UInt64.of_int h) +let cstore_in_config_session_handle h = in_session (Unsigned.UInt64.of_int h) = 1 +let cstore_in_config_session () = cstore_in_config_session_handle (cstore_handle_init ()) + +let cstore_set_path handle path = + let len = List.length path in + let arr = CArray.of_list string path in + cstore_set_path (Unsigned.UInt64.of_int handle) (to_voidp (CArray.start arr)) (Unsigned.Size_t.of_int len) + +let legacy_validate_path handle path = + let len = List.length path in + let arr = CArray.of_list string path in + cstore_validate_path (Unsigned.UInt64.of_int handle) (to_voidp (CArray.start arr)) (Unsigned.Size_t.of_int len) + +let legacy_set_path handle path = + let len = List.length path in + let arr = CArray.of_list string path in + cstore_legacy_set_path (Unsigned.UInt64.of_int handle) (to_voidp (CArray.start arr)) (Unsigned.Size_t.of_int len) + +let cstore_delete_path handle path = + let len = List.length path in + let arr = CArray.of_list string path in + cstore_del_path (Unsigned.UInt64.of_int handle) (to_voidp (CArray.start arr)) (Unsigned.Size_t.of_int len) + +let set_path_reversed handle path _len = + let path = List.rev path in + cstore_set_path handle path + +let delete_path_reversed handle path _len = + let path = List.rev path in + cstore_delete_path handle path + +module VC = Client.Vyconf_client_session + +let get_sockname = + "/var/run/vyconfd.sock" + +let vyconf_validate_path path = + let socket = get_sockname in + let token = VC.session_init socket in + match token with + | Error e -> Some e + | Ok token -> + let out = VC.session_validate_path socket token path in + let _ = VC.session_free socket token in + match out with + | Ok _ -> None + | Error e -> Some e + +open Vyos1x + +module CT = Config_tree +module CD = Config_diff + +module ValueSet = Set.Make(String) + +let add_value handle acc out v = + let acc = v :: acc in + out ^ (set_path_reversed handle acc (List.length acc)) + +let add_values handle acc out vs = + match vs with + | [] -> out ^ (set_path_reversed handle acc (List.length acc)) + | _ -> List.fold_left (add_value handle acc) out vs + +let rec add_path handle acc out (node : CT.t) = + let acc = (Vytree.name_of_node node) :: acc in + let children = Vytree.children_of_node node in + match children with + | [] -> let data = Vytree.data_of_node node in + let values = data.values in + add_values handle acc out values + | _ -> List.fold_left (add_path handle acc) out children + +let del_value handle acc out v = + let acc = v :: acc in + out ^ (delete_path_reversed handle acc (List.length acc)) + +let del_values handle acc out vs = + match vs with + | [] -> out ^ (delete_path_reversed handle acc (List.length acc)) + | _ -> List.fold_left (del_value handle acc) out vs + +let del_path handle path out = + out ^ (cstore_delete_path handle path) + +(* +let update_data (CD.Diff_cstore data) m = + CD.Diff_cstore { data with out = m; } +*) + +let cstore_diff ?recurse:_ (path : string list) (CD.Diff_cstore res) (m : CD.change) = + let handle = res.handle in + match m with + | Added -> let node = Vytree.get res.right path in + let acc = List.tl (List.rev path) in + CD.Diff_cstore { res with out = add_path handle acc res.out node } + | Subtracted -> CD.Diff_cstore { res with out = del_path handle path res.out } + | Unchanged -> CD.Diff_cstore (res) + | Updated v -> + let ov = CT.get_values res.left path in + let acc = List.rev path in + match ov, v with + | [x], [y] -> let out = del_value handle acc res.out x in + let out = add_value handle acc out y in + CD.Diff_cstore { res with out = out } + | _, _ -> let ov_set = ValueSet.of_list ov in + let v_set = ValueSet.of_list v in + let sub_vals = ValueSet.elements (ValueSet.diff ov_set v_set) in + let add_vals = ValueSet.elements (ValueSet.diff v_set ov_set) in + let out = del_values handle acc res.out sub_vals in + let out = add_values handle acc out add_vals in + CD.Diff_cstore { res with out = out } + +let load_config left right = + let h = cstore_handle_init () in + if not (cstore_in_config_session_handle h) then + (cstore_handle_free h; + let out = "not in config session\n" in + out) + else + let dcstore = CD.make_diff_cstore left right h in + let dcstore = CD.diff [] cstore_diff dcstore (Option.some left, Option.some right) in + let ret = CD.eval_result dcstore in + cstore_handle_free h; + ret.out diff --git a/src/adapter/vyos1x_adapter.mli b/src/adapter/vyos1x_adapter.mli new file mode 100644 index 0000000..cb40e2b --- /dev/null +++ b/src/adapter/vyos1x_adapter.mli @@ -0,0 +1,16 @@ +open Vyos1x + +val cstore_handle_init : unit -> int +val cstore_handle_free : int -> unit +val cstore_in_config_session_handle : int -> bool +val cstore_in_config_session : unit -> bool +val cstore_set_path : int -> string list -> string +val legacy_validate_path : int -> string list -> string +val legacy_set_path : int -> string list -> string +val cstore_delete_path : int -> string list -> string +val set_path_reversed : int -> string list -> int -> string +val delete_path_reversed : int -> string list -> int -> string + +val vyconf_validate_path : string list -> string option + +val load_config : Config_tree.t -> Config_tree.t -> string diff --git a/src/config_tree.ml b/src/config_tree.ml deleted file mode 100644 index 28cfcdd..0000000 --- a/src/config_tree.ml +++ /dev/null @@ -1,345 +0,0 @@ -type value_behaviour = AddValue | ReplaceValue - -exception Duplicate_value -exception Node_has_no_value -exception No_such_value -exception Useless_set - -type config_node_data = { - values: string list; - comment: string option; - inactive: bool; - ephemeral: bool; -} [@@deriving yojson] - -type t = config_node_data Vytree.t [@@deriving yojson] - -let default_data = { - values = []; - comment = None; - inactive = false; - ephemeral = false; -} - -let make name = Vytree.make default_data name - -let replace_value node path value = - let data = {default_data with values=[value]} in - Vytree.update node path data - -let add_value node path value = - let node' = Vytree.get node path in - let data = Vytree.data_of_node node' in - let values = data.values in - match (Vylist.find (fun x -> x = value) values) with - | Some _ -> raise Duplicate_value - | None -> - let values = values @ [value] in - Vytree.update node path ({data with values=values}) - -let delete_value node path value = - let data = Vytree.data_of_node @@ Vytree.get node path in - let values = Vylist.remove (fun x -> x = value) data.values in - Vytree.update node path {data with values=values} - -let set_value node path value behaviour = - match behaviour with - | AddValue -> add_value node path value - | ReplaceValue -> replace_value node path value - -let set node path value behaviour = - if (Vytree.exists node path) then - (match value with - | None -> raise Useless_set - | Some v -> set_value node path v behaviour) - else - let path_existing = Vytree.get_existent_path node path in - let path_remaining = Vylist.complement path path_existing in - let values = match value with None -> [] | Some v -> [v] in - Vytree.insert_multi_level default_data node path_existing path_remaining {default_data with values=values} - -let get_values node path = - let node' = Vytree.get node path in - let data = Vytree.data_of_node node' in - data.values - -let get_value node path = - let values = get_values node path in - match values with - | [] -> raise Node_has_no_value - | x :: _ -> x - -let delete node path value = - match value with - | Some v -> - (let values = get_values node path in - if Vylist.in_list values v then - (match values with - | [_] -> Vytree.delete node path - | _ -> delete_value node path v) - else raise No_such_value) - | None -> - Vytree.delete node path - -let set_comment node path comment = - let data = Vytree.get_data node path in - Vytree.update node path {data with comment=comment} - -let get_comment node path = - let data = Vytree.get_data node path in - data.comment - -let set_inactive node path inactive = - let data = Vytree.get_data node path in - Vytree.update node path {data with inactive=inactive} - -let is_inactive node path = - let data = Vytree.get_data node path in - data.inactive - -let set_ephemeral node path ephemeral = - let data = Vytree.get_data node path in - Vytree.update node path {data with ephemeral=ephemeral} - -let is_ephemeral node path = - let data = Vytree.get_data node path in - data.ephemeral - -module Renderer = -struct - (* TODO Replace use of Printf with Format *) - - module L = List - module S = String - module PF = Printf - module VT = Vytree - module RT = Reference_tree - - (* Nodes are ordered based on a comarison of their names *) - let compare cmp node1 node2 = - let name1 = VT.name_of_node node1 in - let name2 = VT.name_of_node node2 in - cmp name1 name2 - - let indentation indent level = S.make (level * indent) ' ' - - let render_inactive data = if data.inactive then "#INACTIVE " else "" - let render_ephemeral data = if data.ephemeral then "#EPHEMERAL " else "" - - let render_comment data indents = - match data.comment with - | None -> "" - (* Trailing indentation for the rest of the material on the next line *) - | Some c -> PF.sprintf "/*%s*/\n%s" c indents - - let render_tag = function - | None -> "" - | Some tag -> PF.sprintf "%s " tag - - let render_outer indents data name tag = - [render_comment data indents ; - render_inactive data; - render_ephemeral data; - render_tag tag; - name] - |> S.concat "" - - let render_values ?(valueless=false) values = - let quote_if_needed s = - try - let _ = Pcre.exec ~pat:"[\\s;{}#\\[\\]\"\']" s in - Printf.sprintf "\"%s\"" s - with Not_found -> s - in - match values with - | [] -> if valueless then ";" else "{ }" - | [v] -> PF.sprintf "%s;" (quote_if_needed v) - | _ as vs -> S.concat "; " (List.map quote_if_needed vs) |> PF.sprintf "[%s];" - - let render_inner_and_outer indents inner outer = - if inner = "" - (* Hidden or empty descendents yield empty nodes *) - then PF.sprintf "%s%s { }" indents outer - else PF.sprintf "%s%s %s" indents outer inner - - let render - ?(indent=4) - ?(reftree=None) - ?(cmp=BatString.numeric_compare) - ?(showephemeral=false) - ?(showinactive=false) - (config_tree:t) - = - let is_hidden data = - (not showephemeral && data.ephemeral) || - (not showinactive && data.inactive) - in - let rec render_node level ?tag node = - let data = VT.data_of_node node in - let name = VT.name_of_node node in - (* Hide inactive and ephemeral when necessary *) - if is_hidden data then "" - else - let indents = indentation indent level in - let outer = render_outer indents data name tag in - let inner = (* Children are ignored if the node has values *) - match data.values with - | [] -> VT.children_of_node node |> render_children level - | values -> render_values values - in - PF.sprintf "%s%s %s" indents outer inner - and render_children level = function - | [] -> "{ }" - | children -> - let indents = indentation indent level in - let render_child node = render_node (level + 1) node in - let rendered_children = L.map render_child children |> S.concat "\n" - in - if rendered_children = "" then "{ }" - else PF.sprintf "{\n%s\n%s}" rendered_children indents - in - (* Walks the reftree and config_tree side-by-side *) - let rec render_node_rt level tag rt node = - let data = VT.data_of_node node in - let name = VT.name_of_node node in - let rt_data = VT.data_of_node rt in - let rt_name = VT.name_of_node rt in - (* Hide inactive and ephemeral when necessary *) - if is_hidden data then "" - else - (* TODO refactor this ugly approach*) - let (outer_name, level', inner) = - let open RT in - let children = VT.children_of_node node in - let ordered = rt_data.keep_order in - match rt_data.node_type with - | Tag -> - ("", 0, render_children_rt level (Some name) ordered rt children) - | Other -> - (name, level, render_children_rt level None ordered rt children) - | Leaf -> - (name, level, render_values ~valueless:rt_data.valueless data.values) - in - let indents = indentation indent level' in - let outer = render_outer indents data outer_name tag in - (* Do not insert a space before ; for valueless nodes *) - if rt_data.valueless then PF.sprintf "%s%s%s" indents outer inner - else PF.sprintf "%s%s %s" indents outer inner - and render_children_rt level tag ordered rt = function - | [] -> "{ }" - | children -> - let is_tagged = BatOption.is_some tag in - let indents = indentation indent level in - let reorder nodes = - if ordered then nodes - else L.sort (compare cmp) nodes - in - let render_child node = - let level' = if is_tagged then level else level + 1 in - let node_reftree = VT.find rt (VT.name_of_node node) in - (* If there is no reftree for a node, default to stand-alone *) - match node_reftree with - | Some rt' -> render_node_rt level' tag rt' node - | None -> render_node level' ?tag node - in - let rendered_children = children - |> reorder - |> L.map render_child - |> S.concat "\n" - in - if rendered_children = "" then "{ }" - else if is_tagged - then rendered_children - else PF.sprintf "{\n%s\n%s}" rendered_children indents - in - match reftree with - | None -> render_node 0 config_tree - | Some rt -> render_node_rt 0 None rt config_tree - - - (* Rendering configs as set commands *) - let render_set_path path value = - let v = Printf.sprintf "\'%s\'" value in - List.append path [v] |> String.concat " " |> Printf.sprintf "set %s" - - let rec render_commands ?(reftree=None) ?(alwayssort=false) path ct = - let new_path = List.append path [Vytree.name_of_node ct] in - let new_path_str = String.concat " " new_path in - let data = Vytree.data_of_node ct in - (* Get the node comment, if any *) - let comment = BatOption.default "" data.comment in - let comment_cmd = (if comment = "" then "" else Printf.sprintf "comment %s \'%s\'" new_path_str comment) in - (* Sort child names, if required *) - let child_names = Vytree.list_children ct in - let child_names = - begin - match reftree with - | Some rt -> - if ((RT.get_keep_order rt path) && (not alwayssort)) then child_names - else (List.sort BatString.numeric_compare child_names) - | None -> - if alwayssort then (List.sort BatString.numeric_compare child_names) - else child_names - end - in - (* Now handle the different cases for nodes with and without children *) - match child_names with - | [] -> - (* This is a leaf node *) - let values = List.map String.escaped data.values in - let cmds = - begin - match values with - | [] -> - (* Valueless leaf node *) - String.concat " " new_path |> Printf.sprintf "set %s" - | [v] -> - (* Single value, just one command *) - render_set_path new_path v - | vs -> - (* A leaf node with multiple values *) - List.map (render_set_path new_path) vs |> String.concat "\n" - end - in - if comment_cmd = "" then cmds else Printf.sprintf "%s\n%s" cmds comment_cmd - | children -> - (* A node with children *) - let children = List.map (fun n -> Vytree.get ct [n]) child_names in - let rendered_children = List.map (render_commands ~reftree:reftree ~alwayssort:alwayssort new_path) children in - let cmds = String.concat "\n" rendered_children in - if comment_cmd = "" then cmds else Printf.sprintf "%s\n%s" cmds comment_cmd - - -end (* Renderer *) - -let render = Renderer.render - -let render_at_level - ?(indent=4) - ?(reftree=None) - ?(cmp=BatString.numeric_compare) - ?(showephemeral=false) - ?(showinactive=false) - node - path = - let node = - match path with - | [] -> node - | _ -> Vytree.get node path - in - let children = Vytree.children_of_node node in - let child_configs = List.map (render ~indent:indent ~reftree:reftree ~cmp:cmp ~showephemeral:showephemeral ~showinactive:showinactive) children in - String.concat "\n" child_configs - -let render_commands ?(reftree=None) ?(alwayssort=false) ?(sortchildren=false) node path = - let node = - match path with - | [] -> node - | _ -> Vytree.get node path - in - let children = - if sortchildren then Vytree.sorted_children_of_node (BatString.numeric_compare) node - else Vytree.children_of_node node - in - let commands = List.map (Renderer.render_commands ~reftree:reftree ~alwayssort:alwayssort path) children in - String.concat "\n" commands diff --git a/src/config_tree.mli b/src/config_tree.mli deleted file mode 100644 index 79426e3..0000000 --- a/src/config_tree.mli +++ /dev/null @@ -1,78 +0,0 @@ -type value_behaviour = AddValue | ReplaceValue - -exception Duplicate_value -exception Node_has_no_value -exception No_such_value -exception Useless_set - -type config_node_data = { - values : string list; - comment : string option; - inactive : bool; - ephemeral : bool; -} [@@deriving yojson] - -type t = config_node_data Vytree.t [@@deriving yojson] - -val default_data : config_node_data - -val make : string -> t - -val set : t -> string list -> string option -> value_behaviour -> t - -val delete : t -> string list -> string option -> t - -val get_values : t -> string list -> string list - -val get_value : t -> string list -> string - -val set_comment : t -> string list -> string option -> t - -val get_comment : t -> string list -> string option - -val set_inactive : t -> string list -> bool -> t - -val is_inactive : t -> string list -> bool - -val set_ephemeral : t -> string list -> bool -> t - -val is_ephemeral : t -> string list -> bool - -(** Interface to two rendering routines: - 1. The stand-alone routine, when [reftree] is not provided - 2. The reference-tree guided routine, when [reftree] is provided. - - If an {i incomplete} reftree is supplied, then the remaining portion of the - config tree will be rendered according to the stand-alone routine. - - If an {i incompatible} reftree is supplied (i.e., the name of the nodes of - the reftree do not match the name of the nodes in the config tree), then the - exception {! Config_tree.Renderer.Inapt_reftree} is raised. - - @param indent spaces by which each level of nesting should be indented - @param reftree optional reference tree used to instruct rendering - @param cmp function used to sort the order of children, overruled - if [reftree] specifies [keep_order] for a node - @param showephemeral boolean determining whether ephemeral nodes are shown - @param showinactive boolean determining whether inactive nodes are shown -*) -val render : - ?indent:int -> - ?reftree:(Reference_tree.t option)-> - ?cmp:(string -> string -> int) -> - ?showephemeral:bool -> - ?showinactive:bool -> - t -> - string - -val render_at_level : - ?indent:int -> - ?reftree:(Reference_tree.t option)-> - ?cmp:(string -> string -> int) -> - ?showephemeral:bool -> - ?showinactive:bool -> - t -> - string list -> - string - -val render_commands: ?reftree:(Reference_tree.t option) -> ?alwayssort:bool -> ?sortchildren:bool -> t -> string list -> string diff --git a/src/curly_lexer.mll b/src/curly_lexer.mll deleted file mode 100644 index 32e566a..0000000 --- a/src/curly_lexer.mll +++ /dev/null @@ -1,90 +0,0 @@ -{ - -open Curly_parser - -exception Error of string - -} - -rule token = parse -| [' ' '\t' '\r'] - { token lexbuf } -| '\n' - { Lexing.new_line lexbuf; token lexbuf } -| '"' - { read_string (Buffer.create 16) lexbuf } -| ''' - { read_single_quoted_string (Buffer.create 16) lexbuf } -| "//" [^ '\n']+ '\n' - { Lexing.new_line lexbuf ; token lexbuf } -| "/*" - { read_comment (Buffer.create 16) lexbuf } -| "#INACTIVE" - { INACTIVE } -| "#EPHEMERAL" - { EPHEMERAL } -| '{' - { LEFT_BRACE } -| '}' - { RIGHT_BRACE } -| '[' - { LEFT_BRACKET } -| ']' - { RIGHT_BRACKET } -| ';' - { SEMI } -| [^ ' ' '\t' '\n' '\r' '{' '}' '[' ']' ';' '#' '"' ''' ]+ as s - { IDENTIFIER s} -| eof - { EOF } -| _ -{ raise (Error (Printf.sprintf "At offset %d: unexpected character.\n" (Lexing.lexeme_start lexbuf))) } - -and read_string buf = - parse - | '"' { STRING (Buffer.contents buf) } - | '\\' '/' { Buffer.add_char buf '/'; read_string buf lexbuf } - | '\\' '\\' { Buffer.add_char buf '\\'; read_string buf lexbuf } - | '\\' 'b' { Buffer.add_char buf '\b'; read_string buf lexbuf } - | '\\' 'f' { Buffer.add_char buf '\012'; read_string buf lexbuf } - | '\\' 'n' { Buffer.add_char buf '\n'; read_string buf lexbuf } - | '\\' 'r' { Buffer.add_char buf '\r'; read_string buf lexbuf } - | '\\' 't' { Buffer.add_char buf '\t'; read_string buf lexbuf } - | '\\' '\'' { Buffer.add_char buf '\''; read_string buf lexbuf } - | '\\' '"' { Buffer.add_char buf '"'; read_string buf lexbuf } - | '\n' { Lexing.new_line lexbuf; Buffer.add_char buf '\n'; read_string buf lexbuf } - | [^ '"' '\\']+ - { Buffer.add_string buf (Lexing.lexeme lexbuf); - read_string buf lexbuf - } - | _ { raise (Error (Printf.sprintf "Illegal string character: %s" (Lexing.lexeme lexbuf))) } - | eof { raise (Error ("String is not terminated")) } - -and read_single_quoted_string buf = - parse - | ''' { STRING (Buffer.contents buf) } - | '\\' '/' { Buffer.add_char buf '/'; read_string buf lexbuf } - | '\\' '\\' { Buffer.add_char buf '\\'; read_string buf lexbuf } - | '\\' 'b' { Buffer.add_char buf '\b'; read_string buf lexbuf } - | '\\' 'f' { Buffer.add_char buf '\012'; read_string buf lexbuf } - | '\\' 'n' { Buffer.add_char buf '\n'; read_string buf lexbuf } - | '\\' 'r' { Buffer.add_char buf '\r'; read_string buf lexbuf } - | '\\' 't' { Buffer.add_char buf '\t'; read_string buf lexbuf } - | '\\' '\'' { Buffer.add_char buf '\''; read_string buf lexbuf } - | '\\' '"' { Buffer.add_char buf '"'; read_string buf lexbuf } - | '\n' { Lexing.new_line lexbuf; Buffer.add_char buf '\n'; read_string buf lexbuf } - | [^ ''' '\\']+ - { Buffer.add_string buf (Lexing.lexeme lexbuf); - read_single_quoted_string buf lexbuf - } - | _ { raise (Error (Printf.sprintf "Illegal string character: %s" (Lexing.lexeme lexbuf))) } - | eof { raise (Error ("String is not terminated")) } - -and read_comment buf = - parse - | "*/" - { COMMENT (Buffer.contents buf) } - | _ - { Buffer.add_string buf (Lexing.lexeme lexbuf); - read_comment buf lexbuf - } diff --git a/src/curly_parser.mly b/src/curly_parser.mly deleted file mode 100644 index be5aadc..0000000 --- a/src/curly_parser.mly +++ /dev/null @@ -1,114 +0,0 @@ -%{ - open Config_tree - - exception Duplicate_child of (string * string) - - (* Used for checking if after merging immediate children, - any of them have duplicate children inside, - e.g. "interfaces { ethernet eth0 {...} ethernet eth0 {...} }" *) - let find_duplicate_children n = - let rec aux xs = - let xs = List.sort compare xs in - match xs with - | [] | [_] -> () - | x :: x' :: xs -> - if x = x' then raise (Duplicate_child (Vytree.name_of_node n, x)) - else aux (x' :: xs) - in - aux @@ Vytree.list_children n - - (* When merging nodes with values, append values of subsequent nodes to the - first one *) - let merge_data l r = {l with values=(List.append l.values r.values)} -%} - -%token <string> IDENTIFIER -%token <string> STRING -%token <string> COMMENT -%token INACTIVE -%token EPHEMERAL -%token LEFT_BRACE -%token RIGHT_BRACE -%token LEFT_BRACKET -%token RIGHT_BRACKET -%token SEMI -%token EOF - -%start <Config_tree.t> config -%% - -opt_comment: - | (* empty *) { None } - | c = COMMENT { Some (String.trim c) } -; - -value: - | v = STRING - { v } - | v = IDENTIFIER - { v } -; - -values: - | v = value { [v] } - | LEFT_BRACKET; vs = separated_nonempty_list(SEMI, value); RIGHT_BRACKET - { (List.rev vs) } -; - -leaf_node: - | comment = opt_comment; inactive = boption(INACTIVE); ephemeral = boption(EPHEMERAL); - name = IDENTIFIER; values = values; SEMI - { Vytree.make_full {values=(List.rev values); comment=comment; inactive=inactive; ephemeral=ephemeral} name []} - | comment = opt_comment; inactive = boption(INACTIVE); ephemeral = boption(EPHEMERAL); - name = IDENTIFIER; SEMI (* valueless node *) - { Vytree.make_full {default_data with comment=comment; inactive=inactive; ephemeral=ephemeral} name [] } -; - -node: - | comment = opt_comment; inactive = boption(INACTIVE); ephemeral = boption(EPHEMERAL); - name = IDENTIFIER; LEFT_BRACE; children = list(node_content); RIGHT_BRACE - { - let node = - Vytree.make_full {default_data with comment=comment; inactive=inactive; ephemeral=ephemeral} name [] in - let node = List.fold_left Vytree.adopt node (List.rev children) |> Vytree.merge_children merge_data in - try - List.iter find_duplicate_children (Vytree.children_of_node node); - node - with - | Duplicate_child (child, dup) -> - failwith (Printf.sprintf "Node \"%s %s\" has two children named \"%s\"" name child dup) - } -; - -tag_node: - | comment = opt_comment; inactive = boption(INACTIVE); ephemeral = boption(EPHEMERAL); - name = IDENTIFIER; tag = IDENTIFIER; LEFT_BRACE; children = list(node_content); RIGHT_BRACE - { - let outer_node = Vytree.make_full default_data name [] in - let inner_node = - Vytree.make_full {default_data with comment=comment; inactive=inactive; ephemeral=ephemeral} tag [] in - let inner_node = List.fold_left Vytree.adopt inner_node (List.rev children) |> Vytree.merge_children merge_data in - let node = Vytree.adopt outer_node inner_node in - try - List.iter find_duplicate_children (Vytree.children_of_node inner_node); - node - with - | Duplicate_child (child, dup) -> - failwith (Printf.sprintf "Node \"%s %s %s\" has two children named \"%s\"" name tag child dup) - } - -node_content: n = node { n } | n = leaf_node { n } | n = tag_node { n }; - -%public config: - | ns = list(node); EOF - { - let root = make "root" in - let root = List.fold_left Vytree.adopt root (List.rev ns) |> Vytree.merge_children merge_data in - try - List.iter find_duplicate_children (Vytree.children_of_node root); - root - with - | Duplicate_child (child, dup) -> - failwith (Printf.sprintf "Node \"%s\" has two children named \"%s\"" child dup) - } -; diff --git a/src/defaults.ml b/src/defaults.ml index b6d0030..9ce36e5 100644 --- a/src/defaults.ml +++ b/src/defaults.ml @@ -7,7 +7,7 @@ type vyconf_defaults = { } let defaults = { - config_file = "/etc/vyconfd.conf"; + config_file = "/etc/vyos/vyconfd.conf"; pid_file = "/var/run/vyconfd.pid"; socket = "/var/run/vyconfd.sock"; log_template = "$(date) $(name)[$(pid)]: $(message)"; diff --git a/src/directories.ml b/src/directories.ml index 3b7156f..c28f055 100644 --- a/src/directories.ml +++ b/src/directories.ml @@ -33,12 +33,19 @@ let make basepath conf = We do not try to check if they are readable at this point, it's just to fail early if they don't even exist and we shouldn't bother trying *) + +let check_dir d = + if FU.test FU.Is_dir d then () + else raise (Failure (Printf.sprintf "%s does not exist or is not a directory" d)) + let test dirs = - let check_dir d = - if FU.test FU.Is_dir d then () - else raise (Failure (Printf.sprintf "%s does not exist or is not a directory" d)) in let l = [dirs.components; dirs.validators; dirs.migrators; dirs.component_definitions; dirs.interface_definitions] in try List.iter check_dir l; Ok () with Failure msg -> Error msg + +let test_validators_dir dirs = + try + check_dir dirs.validators; Ok () + with Failure msg -> Error msg diff --git a/src/directories.mli b/src/directories.mli index 9a7a376..fb01f16 100644 --- a/src/directories.mli +++ b/src/directories.mli @@ -9,3 +9,5 @@ type t = { val make : string -> Vyconf_config.t -> t val test : t -> (unit, string) result + +val test_validators_dir : t -> (unit, string) result diff --git a/src/dune b/src/dune new file mode 100644 index 0000000..2fef6cc --- /dev/null +++ b/src/dune @@ -0,0 +1,79 @@ +(include_subdirs unqualified) + +(library + (name vyconf_connect) + (public_name vyconf.vyconf-connect) + (modules vyconf_pbt message) + (libraries lwt lwt.unix lwt_log lwt_ppx ocaml-protoc fileutils ppx_deriving_yojson) + (preprocess (pps lwt_ppx ppx_deriving_yojson))) + +(library + (name vyconfd_config) + (modules vyconf_config session directories defaults) + (libraries vyos1x-config vyconf_connect toml sha ppx_deriving.show) + (preprocess (pps ppx_deriving.show ppx_deriving_yojson))) + +(library + (name client) + (public_name vyconf.vyconf-client) + (modules vyconf_client vyconf_client_session) + (libraries vyos1x-config vyconf_connect lwt lwt.unix lwt_log lwt_ppx ocaml-protoc toml sha + yojson ppx_deriving.show ppx_deriving_yojson) + (preprocess (pps lwt_ppx ppx_deriving.show ppx_deriving_yojson))) + +(executable + (name vyconfd) + (public_name vyconfd) + (modules vyconfd startup version) + (libraries vyos1x-config vyconfd_config vyconf_connect) + (preprocess (pps lwt_ppx))) + +(executable + (name vycli) + (public_name vycli) + (modules vycli) + (libraries client) + (preprocess (pps lwt_ppx))) + +(executable + (name validate) + (public_name validate) + (modules validate) + (libraries client)) + +(rule + (alias protoc) + (mode promote) + (targets vyconf_pbt.ml vyconf_pbt.mli) + (action + (chdir + %{project_root} + (progn + (run ocaml-protoc --ml_out src data/vyconf.proto) + (run mv src/vyconf.ml src/vyconf_pbt.ml) + (run mv src/vyconf.mli src/vyconf_pbt.mli))))) + +(library + (name vyos1x_adapter) + (public_name vyconf.vyos1x-adapter) + (libraries vyos1x-config vyconf.vyconf-client ctypes ctypes-foreign lwt lwt.unix lwt_log lwt_ppx) + (modules vyos1x_adapter) + (preprocess (pps lwt_ppx ppx_deriving_yojson))) + +(executable + (name vy_set) + (public_name vy_set) + (libraries vyos1x_adapter vyconf.vyconf-client) + (modules vy_set)) + +(executable + (name vy_delete) + (public_name vy_delete) + (libraries vyos1x_adapter vyconf.vyconf-client) + (modules vy_delete)) + +(executable + (name vy_load_config) + (public_name vy_load_config) + (libraries vyos1x_adapter vyos1x-config) + (modules vy_load_config)) diff --git a/src/message.ml b/src/message.ml index 3629f0d..d4cc374 100644 --- a/src/message.ml +++ b/src/message.ml @@ -3,6 +3,11 @@ Messages are preceded by a length header, four bytes in network order. *) +(** Makes a hex dump of a byte string *) +let hexdump b = + let dump = ref "" in + Bytes.iter (fun c -> dump := Char.code c |> Printf.sprintf "%s %02x" !dump) b; + !dump let read ic = let header = Bytes.create 4 in @@ -12,14 +17,14 @@ let read ic = if length < 0 then failwith (Printf.sprintf "Bad message length: %d" length) else let buffer = Bytes.create length in let%lwt () = Lwt_io.read_into_exactly ic buffer 0 length in - Lwt_log.debug (Util.hexdump buffer |> Printf.sprintf "Read mesage: %s") |> Lwt.ignore_result; + Lwt_log.debug (hexdump buffer |> Printf.sprintf "Read mesage: %s") |> Lwt.ignore_result; Lwt.return buffer let write oc msg = let length = Bytes.length msg in let length' = Int32.of_int length in Lwt_log.debug (Printf.sprintf "Write length: %d\n" length) |> Lwt.ignore_result; - Lwt_log.debug (Util.hexdump msg |> Printf.sprintf "Write message: %s") |> Lwt.ignore_result; + Lwt_log.debug (hexdump msg |> Printf.sprintf "Write message: %s") |> Lwt.ignore_result; if length' < 0l then failwith (Printf.sprintf "Bad message length: %d" length) else let header = Bytes.create 4 in let () = EndianBytes.BigEndian.set_int32 header 0 length' in diff --git a/src/reference_tree.ml b/src/reference_tree.ml deleted file mode 100644 index 45789eb..0000000 --- a/src/reference_tree.ml +++ /dev/null @@ -1,237 +0,0 @@ -type node_type = Leaf | Tag | Other - -type ref_node_data = { - node_type: node_type; - constraints: (Value_checker.value_constraint list); - help: string; - value_help: (string * string) list; - constraint_error_message: string; - multi: bool; - valueless: bool; - owner: string option; - keep_order: bool; - hidden: bool; - secret: bool; -} - -type t = ref_node_data Vytree.t - -exception Bad_interface_definition of string - -exception Validation_error of string - -let default_data = { - node_type = Other; - constraints = []; - help = "No help available"; - value_help = []; - constraint_error_message = "Invalid value"; - multi = false; - valueless = false; - owner = None; - keep_order = false; - hidden = false; - secret = false; -} - -let default = Vytree.make default_data "root" - -(* Loading from XML *) - -let node_type_of_string s = - match s with - | "node" -> Other - | "tagNode" -> Tag - | "leafNode" -> Leaf - | _ -> raise (Bad_interface_definition - (Printf.sprintf "node, tagNode, or leafNode expected, %s found" s)) - -let load_constraint_from_xml d c = - let aux d c = - match c with - | Xml.Element ("regex", _, [Xml.PCData s]) -> - let cs = (Value_checker.Regex s) :: d.constraints in - {d with constraints=cs} - | Xml.Element ("validator", [("name", n); ("argument", a)], _) -> - let cs = (Value_checker.External (n, Some a)) :: d.constraints in - {d with constraints=cs} - | Xml.Element ("validator", [("name", n)], _) -> - let cs = (Value_checker.External (n, None)) :: d.constraints in - {d with constraints=cs} - | _ -> raise (Bad_interface_definition "Malformed constraint") - in Xml.fold aux d c - -let data_from_xml d x = - let aux d x = - match x with - | Xml.Element ("help", _, [Xml.PCData s]) -> {d with help=s} - | Xml.Element ("valueHelp", _, - [Xml.Element ("format", _, [Xml.PCData fmt]); - Xml.Element ("description", _, [Xml.PCData descr])]) -> - let vhs = d.value_help in - let vhs' = (fmt, descr) :: vhs in - {d with value_help=vhs'} - | Xml.Element ("multi", _, _) -> {d with multi=true} - | Xml.Element ("valueless", _, _) -> {d with valueless=true} - | Xml.Element ("constraintErrorMessage", _, [Xml.PCData s]) -> - {d with constraint_error_message=s} - | Xml.Element ("constraint", _, _) -> load_constraint_from_xml d x - | Xml.Element ("hidden", _, _) -> {d with hidden=true} - | Xml.Element ("secret", _, _) -> {d with secret=true} - | Xml.Element ("keepChildOrder", _, _) -> {d with keep_order=true} - | _ -> raise (Bad_interface_definition "Malformed property tag") - in Xml.fold aux d x - -let rec insert_from_xml basepath reftree xml = - match xml with - | Xml.Element (tag, _, _) -> - let props = Util.find_xml_child "properties" xml in - let data = - (match props with - | None -> default_data - | Some p -> data_from_xml default_data p) - in - let node_type = node_type_of_string (Xml.tag xml) in - let node_owner = try let o = Xml.attrib xml "owner" in Some o - with _ -> None - in - let data = {data with node_type=node_type; owner=node_owner} in - let name = Xml.attrib xml "name" in - let path = basepath @ [name] in - let new_tree = Vytree.insert reftree path data in - (match node_type with - | Leaf -> new_tree - | _ -> - let children = Util.find_xml_child "children" xml in - (match children with - | None -> raise (Bad_interface_definition (Printf.sprintf "Node %s has no children" name)) - | Some c -> List.fold_left (insert_from_xml path) new_tree (Xml.children c))) - | _ -> raise (Bad_interface_definition "PCData not allowed here") - -let load_from_xml reftree file = - let xml_to_reftree xml reftree = - match xml with - | Xml.Element ("interfaceDefinition", attrs, children) -> - List.fold_left (insert_from_xml []) reftree children - | _ -> raise (Bad_interface_definition "Should start with <interfaceDefinition>") - in - try - let xml = Xml.parse_file file in - xml_to_reftree xml reftree - with - | Xml.File_not_found msg -> raise (Bad_interface_definition msg) - | Xml.Error e -> raise (Bad_interface_definition (Xml.error e)) - -(* Validation function *) - -let has_illegal_characters name = - (** Checks if string name has illegal characters in it. - All whitespace, curly braces, square brackets, and quotes - are disallowed due to their special significance to the curly config - format parser *) - try Some (Pcre.get_substring (Pcre.exec ~pat:"[\\s\\{\\}\\[\\]\"\'#]" name) 0) - with Not_found -> None - -(** Takes a list of string that represents a configuration path that may have - node value at the end, validates it, and splits it into path and value parts. - - A list of strings is a valid path that can be created in the config tree unless: - 1. It's a tag node without a child - 2. It's a non-valueless leaf node without a value - 3. It's a valueless node with a value - 4. It's a non-valueless leaf node with garbage after the value - 5. It's a non-leaf, non-tag node with a name that doesn't exist - in the reference tree - *) -let rec validate_path validators_dir node path = - let show_path p = Printf.sprintf "[%s]" @@ Util.string_of_list (List.rev p) in - let rec aux node path acc = - let data = Vytree.data_of_node node in - match data.node_type with - | Leaf -> - (match path with - | [] -> - if data.valueless then (List.rev acc, None) - else raise (Validation_error - (Printf.sprintf "Node %s requires a value" (show_path acc) )) - | [p] -> - if not data.valueless then - (if (Value_checker.validate_any validators_dir data.constraints p) then (List.rev acc, Some p) - else raise (Validation_error data.constraint_error_message)) - else raise (Validation_error - (Printf.sprintf "Node %s cannot have a value" (show_path acc))) - | p :: ps -> raise (Validation_error (Printf.sprintf "Path %s is too long" (show_path acc)))) - | Tag -> - (match path with - | p :: p' :: ps -> - (match (has_illegal_characters p) with - | Some c -> raise (Validation_error (Printf.sprintf "Illegal character \"%s\" in node name \"%s\"" c p)) - | None -> - if (Value_checker.validate_any validators_dir data.constraints p) then - let child = Vytree.find node p' in - (match child with - | Some c -> aux c ps (p' :: p :: acc) - | None -> raise (Validation_error (Printf.sprintf "Node %s has no child %s" (show_path acc) p'))) - else raise (Validation_error (Printf.sprintf "%s is not a valid child name for node %s" p (show_path acc)))) - | [p] -> if (Value_checker.validate_any validators_dir data.constraints p) then (List.rev acc, None) - else raise (Validation_error (Printf.sprintf "Node %s has no child %s" (show_path acc) p)) - | _ -> raise (Validation_error (Printf.sprintf "Path %s is incomplete" (show_path acc)))) - | Other -> - (match path with - | [] -> (List.rev acc, None) - | p :: ps -> - let child = Vytree.find node p in - (match child with - | Some c -> aux c ps (p :: acc) - | None -> raise (Validation_error ((Printf.sprintf "Path %s is incomplete" (show_path acc)))))) - in aux node path [] - -let is_multi reftree path = - let data = Vytree.get_data reftree path in - data.multi - -let is_hidden reftree path = - let data = Vytree.get_data reftree path in - data.hidden - -let is_secret reftree path = - let data = Vytree.get_data reftree path in - data.secret - -let is_tag reftree path = - let data = Vytree.get_data reftree path in - match data.node_type with - | Tag -> true - | _ -> false - -let is_leaf reftree path = - let data = Vytree.get_data reftree path in - match data.node_type with - | Leaf -> true - | _ -> false - -let is_valueless reftree path = - let data = Vytree.get_data reftree path in - data.valueless - -let get_keep_order reftree path = - let data = Vytree.get_data reftree path in - data.keep_order - -let get_owner reftree path = - let data = Vytree.get_data reftree path in - data.owner - -let get_help_string reftree path = - let data = Vytree.get_data reftree path in - data.help - -let get_value_help reftree path = - let data = Vytree.get_data reftree path in - data.value_help - -let get_completion_data reftree path = - let aux node = - let data = Vytree.data_of_node node in - (data.node_type, data.multi, data.help) - in List.map aux (Vytree.children_of_node @@ Vytree.get reftree path) diff --git a/src/reference_tree.mli b/src/reference_tree.mli deleted file mode 100644 index 33813d5..0000000 --- a/src/reference_tree.mli +++ /dev/null @@ -1,51 +0,0 @@ -type node_type = Leaf | Tag | Other - -type ref_node_data = { - node_type: node_type; - constraints: (Value_checker.value_constraint list); - help: string; - value_help: (string * string) list; - constraint_error_message: string; - multi: bool; - valueless: bool; - owner: string option; - keep_order: bool; - hidden: bool; - secret: bool; -} - -exception Bad_interface_definition of string - -exception Validation_error of string - -type t = ref_node_data Vytree.t - -val default_data : ref_node_data - -val default : t - -val load_from_xml : t -> string -> t - -val validate_path : string -> t -> string list -> string list * string option - -val is_multi : t -> string list -> bool - -val is_hidden : t -> string list -> bool - -val is_secret : t -> string list -> bool - -val is_tag : t -> string list -> bool - -val is_leaf : t -> string list -> bool - -val is_valueless : t -> string list -> bool - -val get_keep_order : t -> string list -> bool - -val get_owner : t -> string list -> string option - -val get_help_string : t -> string list -> string - -val get_value_help : t -> string list -> (string * string) list - -val get_completion_data : t -> string list -> (node_type * bool * string) list 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 diff --git a/src/session.mli b/src/session.mli index 299f2ca..16d8e35 100644 --- a/src/session.mli +++ b/src/session.mli @@ -1,16 +1,16 @@ type cfg_op = - | CfgSet of string list * string option * Config_tree.value_behaviour + | CfgSet of string list * string option * Vyos1x.Config_tree.value_behaviour | CfgDelete of string list * string option type world = { - running_config: Config_tree.t; - reference_tree: Reference_tree.t; + running_config: Vyos1x.Config_tree.t; + reference_tree: Vyos1x.Reference_tree.t; vyconf_config: Vyconf_config.t; dirs: Directories.t } type session_data = { - proposed_config : Config_tree.t; + proposed_config : Vyos1x.Config_tree.t; modified: bool; conf_mode: bool; changeset: cfg_op list; @@ -22,6 +22,12 @@ exception Session_error of string val make : world -> string -> string -> session_data +val set_modified : session_data -> session_data + +val apply_changes : cfg_op list -> Vyos1x.Config_tree.t -> Vyos1x.Config_tree.t + +val validate : world -> session_data -> string list -> unit + val set : world -> session_data -> string list -> session_data val delete : world -> session_data -> string list -> session_data @@ -36,4 +42,4 @@ val list_children : world -> session_data -> string list -> string list val string_of_op : cfg_op -> string -val show_config : world -> session_data -> string list -> Vyconf_types.request_config_format -> string +val show_config : world -> session_data -> string list -> Vyconf_connect.Vyconf_pbt.request_config_format -> string diff --git a/src/startup.ml b/src/startup.ml index cea5f02..db0d719 100644 --- a/src/startup.ml +++ b/src/startup.ml @@ -33,7 +33,7 @@ let setup_logger daemonize log_file template = (** Load the config file or panic if it fails *) let load_daemon_config path = - let result = Vyconf_config.load path in + let result = Vyconfd_config.Vyconf_config.load path in match result with | Ok cfg -> cfg | Error err -> @@ -41,7 +41,13 @@ let load_daemon_config path = (** Check if appliance directories exist and panic if they don't *) let check_dirs dirs = - let res = Directories.test dirs in + let res = Vyconfd_config.Directories.test dirs in + match res with + | Ok _ -> () + | Error err -> panic err + +let check_validators_dir dirs = + let res = Vyconfd_config.Directories.test_validators_dir dirs in match res with | Ok _ -> () | Error err -> panic err @@ -61,6 +67,7 @@ let create_socket sockfile = let backlog = 10 in let%lwt sock = socket PF_UNIX SOCK_STREAM 0 |> Lwt.return in let%lwt () = Lwt_unix.bind sock @@ ADDR_UNIX(sockfile) in + let%lwt () = Lwt_unix.chmod sockfile 0o775 in listen sock backlog; Lwt.return sock @@ -75,11 +82,21 @@ let create_server accept_connection sock = let load_config file = try let chan = open_in file in - let config = Curly_parser.config Curly_lexer.token (Lexing.from_channel chan) in + let s = really_input_string chan (in_channel_length chan) in + let config = Vyos1x.Parser.from_string s in Ok config with | Sys_error msg -> Error msg - | Curly_parser.Error -> Error "Parse error" + | Vyos1x.Util.Syntax_error (opt, msg) -> + begin + match opt with + | None -> + let out = Printf.sprintf "Parse error: %s\n" msg + in Error out + | Some (line, pos) -> + let out = Printf.sprintf "Parse error: %s line %d pos %d\n" msg line pos + in Error out + end (** Load the appliance configuration file or the fallback config *) let load_config_failsafe main fallback = @@ -99,10 +116,10 @@ let load_config_failsafe main fallback = (* Load interface definitions from a directory into a reference tree *) let load_interface_definitions dir = - let open Reference_tree in + let open Vyos1x.Reference_tree in let relative_paths = FileUtil.ls dir in let absolute_paths = - try Ok (List.map Util.absolute_path relative_paths) + try Ok (List.map Vyos1x.Util.absolute_path relative_paths) with Sys_error no_dir_msg -> Error no_dir_msg in let load_aux tree file = @@ -114,3 +131,10 @@ let load_interface_definitions dir = | Error msg -> Error msg end with Bad_interface_definition msg -> Error msg +module I = Vyos1x.Internal.Make(Vyos1x.Reference_tree) + +let read_reference_tree file = + try + let reftree = I.read_internal file in + Ok reftree + with Sys_error msg -> Error msg diff --git a/src/startup.mli b/src/startup.mli index c32ddea..84fb99e 100644 --- a/src/startup.mli +++ b/src/startup.mli @@ -2,9 +2,11 @@ val panic : string -> 'a val setup_logger : bool -> string option -> Lwt_log.template -> unit Lwt.t -val load_daemon_config : string -> Vyconf_config.t +val load_daemon_config : string -> Vyconfd_config.Vyconf_config.t -val check_dirs : Directories.t -> unit +val check_dirs : Vyconfd_config.Directories.t -> unit + +val check_validators_dir : Vyconfd_config.Directories.t -> unit val create_socket : string -> Lwt_unix.file_descr Lwt.t @@ -12,8 +14,10 @@ val create_server : (Lwt_unix.file_descr * Lwt_unix.sockaddr -> unit Lwt.t) -> Lwt_unix.file_descr -> unit -> 'a Lwt.t -val load_config : string -> (Config_tree.t, string) result +val load_config : string -> (Vyos1x.Config_tree.t, string) result + +val load_config_failsafe : string -> string -> Vyos1x.Config_tree.t -val load_config_failsafe : string -> string -> Config_tree.t +val load_interface_definitions : string -> (Vyos1x.Reference_tree.t, string) result -val load_interface_definitions : string -> (Reference_tree.t, string) result +val read_reference_tree : string -> (Vyos1x.Reference_tree.t, string) result diff --git a/src/util.ml b/src/util.ml deleted file mode 100644 index c4bbd96..0000000 --- a/src/util.ml +++ /dev/null @@ -1,38 +0,0 @@ -(** The unavoidable module for functions that don't fit anywhere else *) - -(** Find a child node in xml-lite *) -let find_xml_child name xml = - let find_aux e = - match e with - | Xml.Element (name', _, _) when name' = name -> true - | _ -> false - in - match xml with - | Xml.Element (_, _, children) -> Vylist.find find_aux children - | Xml.PCData _ -> None - -(** Convert a list of strings to a string of unquoted, space separated words *) -let string_of_list ss = - let rec aux xs acc = - match xs with - | [] -> acc - | x :: xs' -> aux xs' (Printf.sprintf "%s %s" acc x) - in - match ss with - | [] -> "" - | x :: xs -> Printf.sprintf "%s%s" x (aux xs "") - -(** Convert a list of strings to JSON *) -let json_of_list ss = - let ss = List.map (fun x -> `String x) ss in - Yojson.Safe.to_string (`List ss) - -(** Convert a relative path to an absolute path based on the current working directory *) -let absolute_path relative_path = - FilePath.make_absolute (Sys.getcwd ()) relative_path - -(** Makes a hex dump of a byte string *) -let hexdump b = - let dump = ref "" in - Bytes.iter (fun c -> dump := Char.code c |> Printf.sprintf "%s %02x" !dump) b; - !dump diff --git a/src/util.mli b/src/util.mli deleted file mode 100644 index 4c11d9e..0000000 --- a/src/util.mli +++ /dev/null @@ -1,9 +0,0 @@ -val find_xml_child : string -> Xml.xml -> Xml.xml option - -val string_of_list : string list -> string - -val json_of_list : string list -> string - -val absolute_path : FilePath.filename -> FilePath.filename - -val hexdump : bytes -> string diff --git a/src/validate.ml b/src/validate.ml new file mode 100644 index 0000000..7b3b596 --- /dev/null +++ b/src/validate.ml @@ -0,0 +1,32 @@ +open Client.Vyconf_client_session + +let path_opt = ref "" + +let usage = "Usage: " ^ Sys.argv.(0) ^ " [options]" + +let args = [ + ("--path", Arg.String (fun s -> path_opt := s), "<string> Configuration path"); + ] + +let get_sockname = + "/var/run/vyconfd.sock" + +let main socket path_list = + let token = session_init socket in + match token with + | Error e -> "Failed to initialize session: " ^ e + | Ok token -> + let out = session_validate_path socket token path_list + in + let _ = session_free socket token in + match out with + | Error e -> "Failed to validate path: " ^ e + | Ok _ -> "No error" + +let _ = + let () = Arg.parse args (fun _ -> ()) usage in + let path_list = Vyos1x.Util.list_of_path !path_opt in + let socket = get_sockname in + let result = main socket path_list in + let () = print_endline result in + exit 0 diff --git a/src/value_checker.ml b/src/value_checker.ml deleted file mode 100644 index aa88f7b..0000000 --- a/src/value_checker.ml +++ /dev/null @@ -1,39 +0,0 @@ -module F = Filename - -type value_constraint = Regex of string | External of string * string option - -exception Bad_validator of string - -let validate_value dir value_constraint value = - match value_constraint with - | Regex s -> - (try - let _ = Pcre.exec ~pat:s value in true - with Not_found -> false) - | External (v, c) -> - (* XXX: Using Unix.system is a bad idea on multiple levels, - especially when the input comes directly from the user... - We should do something about it. - *) - let validator = F.concat dir v in - let arg = BatOption.default "" c in - let safe_arg = Printf.sprintf "'%s'" (Pcre.qreplace ~pat:"\"" ~templ:"\\\"" arg) in - let result = Unix.system (Printf.sprintf "%s %s %s" validator safe_arg value) in - match result with - | Unix.WEXITED 0 -> true - | Unix.WEXITED 127 -> raise (Bad_validator (Printf.sprintf "Could not execute validator %s" validator)) - | _ -> false - -(* If no constraints given, consider it valid. - Otherwise consider it valid if it satisfies at least - one constraint *) -let validate_any validators constraints value = - let rec aux validators constraints value = - match constraints with - | [] -> false - | c :: cs -> if validate_value validators c value then true - else aux validators cs value - in - match constraints with - | [] -> true - | _ -> aux validators constraints value diff --git a/src/value_checker.mli b/src/value_checker.mli deleted file mode 100644 index d786f5e..0000000 --- a/src/value_checker.mli +++ /dev/null @@ -1,7 +0,0 @@ -type value_constraint = Regex of string | External of string * string option - -exception Bad_validator of string - -val validate_value : string -> value_constraint -> string -> bool - -val validate_any : string -> value_constraint list -> string -> bool diff --git a/src/vycli.ml b/src/vycli.ml index e00a4e3..1430a5a 100644 --- a/src/vycli.ml +++ b/src/vycli.ml @@ -1,5 +1,5 @@ -open Vyconf_client -open Vyconf_types +open Client.Vyconf_client +open Vyconf_connect.Vyconf_pbt type op_t = | OpStatus @@ -10,6 +10,7 @@ type op_t = | OpGetValue | OpGetValues | OpListChildren + | OpValidate let token : string option ref = ref None let conf_format_opt = ref "curly" @@ -34,6 +35,7 @@ let args = [ ("--list-children", Arg.Unit (fun () -> op := Some OpListChildren), "List children of the node at the specified path"); ("--show-config", Arg.Unit (fun () -> op := Some OpShowConfig), "Show the configuration at the specified path"); ("--status", Arg.Unit (fun () -> op := Some OpStatus), "Send a status/keepalive message"); + ("--validate", Arg.Unit (fun () -> op := Some OpValidate), "Validate path"); ] let config_format_of_string s = @@ -49,7 +51,7 @@ let output_format_of_string s = | _ -> failwith (Printf.sprintf "Unknown output format %s, should be plain or json" s) let main socket op path out_format config_format = - let%lwt client = Vyconf_client.create ~token:!token socket out_format config_format in + let%lwt client = Client.Vyconf_client.create ~token:!token socket out_format config_format in let%lwt result = match op with | None -> Error "Operation required" |> Lwt.return | Some o -> @@ -60,7 +62,7 @@ let main socket op path out_format config_format = begin match resp.status with | Success -> Ok "" |> Lwt.return - | _ -> Error (BatOption.default "" resp.error) |> Lwt.return + | _ -> Error (Option.value resp.error ~default:"") |> Lwt.return end | OpSetupSession -> let%lwt resp = setup_session client "vycli" in @@ -74,6 +76,7 @@ let main socket op path out_format config_format = | OpGetValues -> get_values client path | OpListChildren -> list_children client path | OpShowConfig -> show_config client path + | OpValidate -> validate client path | _ -> Error "Unimplemented" |> Lwt.return end in match result with @@ -81,8 +84,8 @@ let main socket op path out_format config_format = | Error e -> let%lwt () = Lwt_io.write Lwt_io.stderr (Printf.sprintf "%s\n" e) in Lwt.return 1 let _ = - let () = Arg.parse args (fun f -> ()) usage in - let path = String.trim !path_opt |> Pcre.split ~pat:"\\s+" in + let () = Arg.parse args (fun _ -> ()) usage in + let path = Vyos1x.Util.list_of_path !path_opt in let out_format = output_format_of_string !out_format_opt in let config_format = config_format_of_string !conf_format_opt in let result = Lwt_main.run (main !socket !op path out_format config_format) in exit result diff --git a/src/vyconf_client.ml b/src/vyconf_client.ml index db7d9c1..94348b2 100644 --- a/src/vyconf_client.ml +++ b/src/vyconf_client.ml @@ -1,5 +1,4 @@ -include Vyconf_pb -include Vyconf_types +include Vyconf_connect.Vyconf_pbt type t = { sock: Lwt_unix.file_descr; @@ -22,8 +21,8 @@ let create ?(token=None) sockfile out_format conf_format = let open Lwt_unix in let sock = socket PF_UNIX SOCK_STREAM 0 in let%lwt () = connect sock (ADDR_UNIX sockfile) in - let ic = Lwt_io.of_fd Lwt_io.Input sock in - let oc = Lwt_io.of_fd Lwt_io.Output sock in + let ic = Lwt_io.of_fd ~mode:Lwt_io.Input sock in + let oc = Lwt_io.of_fd ~mode:Lwt_io.Output sock in Lwt.return { sock=sock; ic=ic; oc=oc; enc=(Pbrt.Encoder.create ()); closed=false; @@ -43,11 +42,11 @@ let shutdown client = let do_request client req = let enc = Pbrt.Encoder.create () in - let () = encode_request_envelope {token=client.session; request=req} enc in + let () = encode_pb_request_envelope {token=client.session; request=req} enc in let msg = Pbrt.Encoder.to_bytes enc in - let%lwt () = Message.write client.oc msg in - let%lwt resp = Message.read client.ic in - decode_response (Pbrt.Decoder.of_bytes resp) |> Lwt.return + let%lwt () = Vyconf_connect.Message.write client.oc msg in + let%lwt resp = Vyconf_connect.Message.read client.ic in + decode_pb_response (Pbrt.Decoder.of_bytes resp) |> Lwt.return let get_status client = let req = Status in @@ -55,7 +54,7 @@ let get_status client = Lwt.return resp let setup_session ?(on_behalf_of=None) client client_app = - if BatOption.is_some client.session then Lwt.return (Error "Client is already associated with a session") else + if Option.is_some client.session then Lwt.return (Error "Client is already associated with a session") else let id = on_behalf_of |> (function None -> None | Some x -> (Some (Int32.of_int x))) in let req = Setup_session {client_application=(Some client_app); on_behalf_of=id} in let%lwt resp = do_request client req in @@ -64,7 +63,16 @@ let setup_session ?(on_behalf_of=None) client client_app = (match resp.output with | Some token -> Ok {client with session=(Some token)} | None -> Error "setup_session did not return a session token!") |> Lwt.return - | _ -> Error (BatOption.default "Unknown error" resp.error) |> Lwt.return + | _ -> Error (Option.value resp.error ~default:"Unknown error") |> Lwt.return + +let teardown_session ?(on_behalf_of=None) client = + let id = on_behalf_of |> (function None -> None | Some x -> (Some (Int32.of_int x))) in + let req = Teardown {on_behalf_of=id} in + let%lwt resp = do_request client req in + match resp.status with + | Success -> Ok "" |> Lwt.return + | Fail -> Error (Option.value resp.error ~default:"") |> Lwt.return + | _ -> Error (Option.value resp.error ~default:"") |> Lwt.return let exists client path = let req = Exists {path=path} in @@ -72,33 +80,40 @@ let exists client path = match resp.status with | Success -> Lwt.return (Ok "") | Fail -> Lwt.return (Error "") - | _ -> Error (BatOption.default "" resp.error) |> Lwt.return + | _ -> Error (Option.value resp.error ~default:"") |> Lwt.return let get_value client path = let req = Get_value {path=path; output_format=(Some client.out_format)} in let%lwt resp = do_request client req in match resp.status with | Success -> unwrap resp.output |> Lwt.return - | _ -> Error (BatOption.default ""resp.error) |> Lwt.return + | _ -> Error (Option.value resp.error ~default:"") |> Lwt.return let get_values client path = let req = Get_values {path=path; output_format=(Some client.out_format)} in let%lwt resp = do_request client req in match resp.status with | Success -> unwrap resp.output |> Lwt.return - | _ -> Error (BatOption.default "" resp.error) |> Lwt.return + | _ -> Error (Option.value resp.error ~default:"") |> Lwt.return let list_children client path = let req = List_children {path=path; output_format=(Some client.out_format)} in let%lwt resp = do_request client req in match resp.status with | Success -> unwrap resp.output |> Lwt.return - | _ -> Error (BatOption.default "" resp.error) |> Lwt.return + | _ -> Error (Option.value resp.error ~default:"") |> Lwt.return let show_config client path = let req = Show_config {path=path; format=(Some client.conf_format)} in let%lwt resp = do_request client req in match resp.status with | Success -> unwrap resp.output |> Lwt.return - | _ -> Error (BatOption.default "" resp.error) |> Lwt.return + | _ -> Error (Option.value resp.error ~default:"") |> Lwt.return +let validate client path = + let req = Validate {path=path; output_format=(Some client.out_format)} in + let%lwt resp = do_request client req in + match resp.status with + | Success -> Lwt.return (Ok "") + | Fail -> Error (Option.value resp.error ~default:"") |> Lwt.return + | _ -> Error (Option.value resp.error ~default:"") |> Lwt.return diff --git a/src/vyconf_client.mli b/src/vyconf_client.mli index 8eaada8..0feb063 100644 --- a/src/vyconf_client.mli +++ b/src/vyconf_client.mli @@ -19,7 +19,7 @@ type response = { } -val create : ?token:(string option) -> string -> Vyconf_types.request_output_format -> Vyconf_types.request_config_format -> t Lwt.t +val create : ?token:(string option) -> string -> Vyconf_connect.Vyconf_pbt.request_output_format -> Vyconf_connect.Vyconf_pbt.request_config_format -> t Lwt.t val get_token : t -> (string, string) result Lwt.t @@ -29,6 +29,8 @@ val get_status : t -> response Lwt.t val setup_session : ?on_behalf_of:(int option) -> t -> string -> (t, string) result Lwt.t +val teardown_session : ?on_behalf_of:(int option) -> t -> (string, string) result Lwt.t + val exists : t -> string list -> (string, string) result Lwt.t val get_value : t -> string list -> (string, string) result Lwt.t @@ -38,3 +40,5 @@ val get_values : t -> string list -> (string, string) result Lwt.t val list_children : t -> string list -> (string, string) result Lwt.t val show_config : t -> string list -> (string, string) result Lwt.t + +val validate : t -> string list -> (string, string) result Lwt.t diff --git a/src/vyconf_client_session.ml b/src/vyconf_client_session.ml new file mode 100644 index 0000000..70a2a13 --- /dev/null +++ b/src/vyconf_client_session.ml @@ -0,0 +1,64 @@ +open Vyconf_connect.Vyconf_pbt + +type op_t = + | OpSetupSession + | OpExists + | OpTeardownSession + | OpShowConfig + | OpValidate + +let config_format_of_string s = + match s with + | "curly" -> Curly + | "json" -> Json + | _ -> failwith (Printf.sprintf "Unknown config format %s, should be curly or json" s) + +let output_format_of_string s = + match s with + | "plain" -> Out_plain + | "json" -> Out_json + | _ -> failwith (Printf.sprintf "Unknown output format %s, should be plain or json" s) + +let call_op ?(out_format="plain") ?(config_format="curly") socket token op path = + let config_format = config_format_of_string config_format in + let out_format = output_format_of_string out_format in + let run = + let%lwt client = + Vyconf_client.create ~token:token socket out_format config_format + in + let%lwt result = match op with + | None -> Error "Operation required" |> Lwt.return + | Some o -> + begin + match o with + | OpSetupSession -> + let%lwt resp = Vyconf_client.setup_session client "vyconf_client_session" in + begin + match resp with + | Ok c -> Vyconf_client.get_token c + | Error e -> Error e |> Lwt.return + end + | OpExists -> Vyconf_client.exists client path + | OpTeardownSession -> Vyconf_client.teardown_session client + | OpShowConfig -> Vyconf_client.show_config client path + | OpValidate -> Vyconf_client.validate client path + end + in + Lwt.return result + in + Lwt_main.run run + +let session_init ?(out_format="plain") ?(config_format="curly") socket = + call_op ~out_format:out_format ~config_format:config_format socket None (Some OpSetupSession) [] + +let session_free socket token = + call_op socket (Some token) (Some OpTeardownSession) [] + +let session_validate_path socket token path = + call_op socket (Some token) (Some OpValidate) path + +let session_show_config socket token path = + call_op socket (Some token) (Some OpShowConfig) path + +let session_path_exists socket token path = + call_op socket (Some token) (Some OpExists) path diff --git a/src/vyconf_client_session.mli b/src/vyconf_client_session.mli new file mode 100644 index 0000000..98fa3c2 --- /dev/null +++ b/src/vyconf_client_session.mli @@ -0,0 +1,16 @@ +type op_t = + | OpSetupSession + | OpExists + | OpTeardownSession + | OpShowConfig + | OpValidate + +val session_init : ?out_format:string -> ?config_format:string -> string -> (string, string) result + +val session_free : string -> string -> (string, string) result + +val session_validate_path : string -> string -> string list -> (string, string) result + +val session_show_config : string -> string -> string list -> (string, string) result + +val session_path_exists : string -> string -> string list -> (string, string) result diff --git a/src/vyconf_config.ml b/src/vyconf_config.ml index 7a87c1a..2640c9b 100644 --- a/src/vyconf_config.ml +++ b/src/vyconf_config.ml @@ -7,6 +7,7 @@ type t = { config_dir: string; primary_config: string; fallback_config: string; + reference_tree: string; socket: string; pid_file: string; log_file: string option; @@ -23,6 +24,7 @@ let empty_config = { config_dir = ""; primary_config = ""; fallback_config = ""; + reference_tree = ""; socket = ""; pid_file = ""; log_file = None; @@ -37,7 +39,7 @@ let get_field conf tbl_name field_name = (* NB: TomlLenses module uses "table" and "field" names for function names, hence tbl_name and field_name *) - TomlLenses.(get conf (key tbl_name |-- table |-- key field_name |-- string)) + Toml.Lenses.(get conf (key tbl_name |-- table |-- key field_name |-- string)) let mandatory_field conf table field = let value = get_field conf table field in @@ -47,7 +49,7 @@ let mandatory_field conf table field = let optional_field default conf table field = let value = get_field conf table field in - BatOption.default default value + Option.value value ~default:default let load filename = try @@ -61,6 +63,7 @@ let load filename = let conf = {conf with program_dir = mandatory_field conf_toml "appliance" "program_dir"} in let conf = {conf with primary_config = mandatory_field conf_toml "appliance" "primary_config"} in let conf = {conf with fallback_config = mandatory_field conf_toml "appliance" "fallback_config"} in + let conf = {conf with reference_tree = mandatory_field conf_toml "appliance" "reference_tree"} in (* Optional fields *) let conf = {conf with pid_file = optional_field defaults.pid_file conf_toml "vyconf" "pid_file"} in let conf = {conf with socket = optional_field defaults.socket conf_toml "vyconf" "socket"} in diff --git a/src/vyconf_config.mli b/src/vyconf_config.mli index ed30b35..1cfeffa 100644 --- a/src/vyconf_config.mli +++ b/src/vyconf_config.mli @@ -5,6 +5,7 @@ type t = { config_dir: string; primary_config: string; fallback_config: string; + reference_tree: string; socket: string; pid_file: string; log_file: string option; diff --git a/src/vyconf_pb.ml b/src/vyconf_pb.ml deleted file mode 100644 index 4dced0f..0000000 --- a/src/vyconf_pb.ml +++ /dev/null @@ -1,1121 +0,0 @@ -[@@@ocaml.warning "-27-30-39"] - -type request_setup_session_mutable = { - mutable client_application : string option; - mutable on_behalf_of : int32 option; -} - -let default_request_setup_session_mutable () : request_setup_session_mutable = { - client_application = None; - on_behalf_of = None; -} - -type request_set_mutable = { - mutable path : string list; - mutable ephemeral : bool option; -} - -let default_request_set_mutable () : request_set_mutable = { - path = []; - ephemeral = None; -} - -type request_delete_mutable = { - mutable path : string list; -} - -let default_request_delete_mutable () : request_delete_mutable = { - path = []; -} - -type request_rename_mutable = { - mutable edit_level : string list; - mutable from : string; - mutable to_ : string; -} - -let default_request_rename_mutable () : request_rename_mutable = { - edit_level = []; - from = ""; - to_ = ""; -} - -type request_copy_mutable = { - mutable edit_level : string list; - mutable from : string; - mutable to_ : string; -} - -let default_request_copy_mutable () : request_copy_mutable = { - edit_level = []; - from = ""; - to_ = ""; -} - -type request_comment_mutable = { - mutable path : string list; - mutable comment : string; -} - -let default_request_comment_mutable () : request_comment_mutable = { - path = []; - comment = ""; -} - -type request_commit_mutable = { - mutable confirm : bool option; - mutable confirm_timeout : int32 option; - mutable comment : string option; -} - -let default_request_commit_mutable () : request_commit_mutable = { - confirm = None; - confirm_timeout = None; - comment = None; -} - -type request_rollback_mutable = { - mutable revision : int32; -} - -let default_request_rollback_mutable () : request_rollback_mutable = { - revision = 0l; -} - -type request_load_mutable = { - mutable location : string; - mutable format : Vyconf_types.request_config_format option; -} - -let default_request_load_mutable () : request_load_mutable = { - location = ""; - format = None; -} - -type request_merge_mutable = { - mutable location : string; - mutable format : Vyconf_types.request_config_format option; -} - -let default_request_merge_mutable () : request_merge_mutable = { - location = ""; - format = None; -} - -type request_save_mutable = { - mutable location : string; - mutable format : Vyconf_types.request_config_format option; -} - -let default_request_save_mutable () : request_save_mutable = { - location = ""; - format = None; -} - -type request_show_config_mutable = { - mutable path : string list; - mutable format : Vyconf_types.request_config_format option; -} - -let default_request_show_config_mutable () : request_show_config_mutable = { - path = []; - format = None; -} - -type request_exists_mutable = { - mutable path : string list; -} - -let default_request_exists_mutable () : request_exists_mutable = { - path = []; -} - -type request_get_value_mutable = { - mutable path : string list; - mutable output_format : Vyconf_types.request_output_format option; -} - -let default_request_get_value_mutable () : request_get_value_mutable = { - path = []; - output_format = None; -} - -type request_get_values_mutable = { - mutable path : string list; - mutable output_format : Vyconf_types.request_output_format option; -} - -let default_request_get_values_mutable () : request_get_values_mutable = { - path = []; - output_format = None; -} - -type request_list_children_mutable = { - mutable path : string list; - mutable output_format : Vyconf_types.request_output_format option; -} - -let default_request_list_children_mutable () : request_list_children_mutable = { - path = []; - output_format = None; -} - -type request_run_op_mode_mutable = { - mutable path : string list; - mutable output_format : Vyconf_types.request_output_format option; -} - -let default_request_run_op_mode_mutable () : request_run_op_mode_mutable = { - path = []; - output_format = None; -} - -type request_enter_configuration_mode_mutable = { - mutable exclusive : bool; - mutable override_exclusive : bool; -} - -let default_request_enter_configuration_mode_mutable () : request_enter_configuration_mode_mutable = { - exclusive = false; - override_exclusive = false; -} - -type request_envelope_mutable = { - mutable token : string option; - mutable request : Vyconf_types.request; -} - -let default_request_envelope_mutable () : request_envelope_mutable = { - token = None; - request = Vyconf_types.default_request (); -} - -type response_mutable = { - mutable status : Vyconf_types.status; - mutable output : string option; - mutable error : string option; - mutable warning : string option; -} - -let default_response_mutable () : response_mutable = { - status = Vyconf_types.default_status (); - output = None; - error = None; - warning = None; -} - - -let rec decode_request_config_format d = - match Pbrt.Decoder.int_as_varint d with - | 0 -> (Vyconf_types.Curly:Vyconf_types.request_config_format) - | 1 -> (Vyconf_types.Json:Vyconf_types.request_config_format) - | _ -> Pbrt.Decoder.malformed_variant "request_config_format" - -let rec decode_request_output_format d = - match Pbrt.Decoder.int_as_varint d with - | 0 -> (Vyconf_types.Out_plain:Vyconf_types.request_output_format) - | 1 -> (Vyconf_types.Out_json:Vyconf_types.request_output_format) - | _ -> Pbrt.Decoder.malformed_variant "request_output_format" - -let rec decode_request_setup_session d = - let v = default_request_setup_session_mutable () in - let continue__= ref true in - while !continue__ do - match Pbrt.Decoder.key d with - | None -> ( - ); continue__ := false - | Some (1, Pbrt.Bytes) -> begin - v.client_application <- Some (Pbrt.Decoder.string d); - end - | Some (1, pk) -> - Pbrt.Decoder.unexpected_payload "Message(request_setup_session), field(1)" pk - | Some (2, Pbrt.Varint) -> begin - v.on_behalf_of <- Some (Pbrt.Decoder.int32_as_varint d); - end - | Some (2, pk) -> - Pbrt.Decoder.unexpected_payload "Message(request_setup_session), field(2)" pk - | Some (_, payload_kind) -> Pbrt.Decoder.skip d payload_kind - done; - ({ - Vyconf_types.client_application = v.client_application; - Vyconf_types.on_behalf_of = v.on_behalf_of; - } : Vyconf_types.request_setup_session) - -let rec decode_request_set d = - let v = default_request_set_mutable () in - let continue__= ref true in - while !continue__ do - match Pbrt.Decoder.key d with - | None -> ( - v.path <- List.rev v.path; - ); continue__ := false - | Some (1, Pbrt.Bytes) -> begin - v.path <- (Pbrt.Decoder.string d) :: v.path; - end - | Some (1, pk) -> - Pbrt.Decoder.unexpected_payload "Message(request_set), field(1)" pk - | Some (3, Pbrt.Varint) -> begin - v.ephemeral <- Some (Pbrt.Decoder.bool d); - end - | Some (3, pk) -> - Pbrt.Decoder.unexpected_payload "Message(request_set), field(3)" pk - | Some (_, payload_kind) -> Pbrt.Decoder.skip d payload_kind - done; - ({ - Vyconf_types.path = v.path; - Vyconf_types.ephemeral = v.ephemeral; - } : Vyconf_types.request_set) - -let rec decode_request_delete d = - let v = default_request_delete_mutable () in - let continue__= ref true in - while !continue__ do - match Pbrt.Decoder.key d with - | None -> ( - v.path <- List.rev v.path; - ); continue__ := false - | Some (1, Pbrt.Bytes) -> begin - v.path <- (Pbrt.Decoder.string d) :: v.path; - end - | Some (1, pk) -> - Pbrt.Decoder.unexpected_payload "Message(request_delete), field(1)" pk - | Some (_, payload_kind) -> Pbrt.Decoder.skip d payload_kind - done; - ({ - Vyconf_types.path = v.path; - } : Vyconf_types.request_delete) - -let rec decode_request_rename d = - let v = default_request_rename_mutable () in - let continue__= ref true in - let to__is_set = ref false in - let from_is_set = ref false in - while !continue__ do - match Pbrt.Decoder.key d with - | None -> ( - v.edit_level <- List.rev v.edit_level; - ); continue__ := false - | Some (1, Pbrt.Bytes) -> begin - v.edit_level <- (Pbrt.Decoder.string d) :: v.edit_level; - end - | Some (1, pk) -> - Pbrt.Decoder.unexpected_payload "Message(request_rename), field(1)" pk - | Some (2, Pbrt.Bytes) -> begin - v.from <- Pbrt.Decoder.string d; from_is_set := true; - end - | Some (2, pk) -> - Pbrt.Decoder.unexpected_payload "Message(request_rename), field(2)" pk - | Some (3, Pbrt.Bytes) -> begin - v.to_ <- Pbrt.Decoder.string d; to__is_set := true; - end - | Some (3, pk) -> - Pbrt.Decoder.unexpected_payload "Message(request_rename), field(3)" pk - | Some (_, payload_kind) -> Pbrt.Decoder.skip d payload_kind - done; - begin if not !to__is_set then Pbrt.Decoder.missing_field "to_" end; - begin if not !from_is_set then Pbrt.Decoder.missing_field "from" end; - ({ - Vyconf_types.edit_level = v.edit_level; - Vyconf_types.from = v.from; - Vyconf_types.to_ = v.to_; - } : Vyconf_types.request_rename) - -let rec decode_request_copy d = - let v = default_request_copy_mutable () in - let continue__= ref true in - let to__is_set = ref false in - let from_is_set = ref false in - while !continue__ do - match Pbrt.Decoder.key d with - | None -> ( - v.edit_level <- List.rev v.edit_level; - ); continue__ := false - | Some (1, Pbrt.Bytes) -> begin - v.edit_level <- (Pbrt.Decoder.string d) :: v.edit_level; - end - | Some (1, pk) -> - Pbrt.Decoder.unexpected_payload "Message(request_copy), field(1)" pk - | Some (2, Pbrt.Bytes) -> begin - v.from <- Pbrt.Decoder.string d; from_is_set := true; - end - | Some (2, pk) -> - Pbrt.Decoder.unexpected_payload "Message(request_copy), field(2)" pk - | Some (3, Pbrt.Bytes) -> begin - v.to_ <- Pbrt.Decoder.string d; to__is_set := true; - end - | Some (3, pk) -> - Pbrt.Decoder.unexpected_payload "Message(request_copy), field(3)" pk - | Some (_, payload_kind) -> Pbrt.Decoder.skip d payload_kind - done; - begin if not !to__is_set then Pbrt.Decoder.missing_field "to_" end; - begin if not !from_is_set then Pbrt.Decoder.missing_field "from" end; - ({ - Vyconf_types.edit_level = v.edit_level; - Vyconf_types.from = v.from; - Vyconf_types.to_ = v.to_; - } : Vyconf_types.request_copy) - -let rec decode_request_comment d = - let v = default_request_comment_mutable () in - let continue__= ref true in - let comment_is_set = ref false in - while !continue__ do - match Pbrt.Decoder.key d with - | None -> ( - v.path <- List.rev v.path; - ); continue__ := false - | Some (1, Pbrt.Bytes) -> begin - v.path <- (Pbrt.Decoder.string d) :: v.path; - end - | Some (1, pk) -> - Pbrt.Decoder.unexpected_payload "Message(request_comment), field(1)" pk - | Some (2, Pbrt.Bytes) -> begin - v.comment <- Pbrt.Decoder.string d; comment_is_set := true; - end - | Some (2, pk) -> - Pbrt.Decoder.unexpected_payload "Message(request_comment), field(2)" pk - | Some (_, payload_kind) -> Pbrt.Decoder.skip d payload_kind - done; - begin if not !comment_is_set then Pbrt.Decoder.missing_field "comment" end; - ({ - Vyconf_types.path = v.path; - Vyconf_types.comment = v.comment; - } : Vyconf_types.request_comment) - -let rec decode_request_commit d = - let v = default_request_commit_mutable () in - let continue__= ref true in - while !continue__ do - match Pbrt.Decoder.key d with - | None -> ( - ); continue__ := false - | Some (1, Pbrt.Varint) -> begin - v.confirm <- Some (Pbrt.Decoder.bool d); - end - | Some (1, pk) -> - Pbrt.Decoder.unexpected_payload "Message(request_commit), field(1)" pk - | Some (2, Pbrt.Varint) -> begin - v.confirm_timeout <- Some (Pbrt.Decoder.int32_as_varint d); - end - | Some (2, pk) -> - Pbrt.Decoder.unexpected_payload "Message(request_commit), field(2)" pk - | Some (3, Pbrt.Bytes) -> begin - v.comment <- Some (Pbrt.Decoder.string d); - end - | Some (3, pk) -> - Pbrt.Decoder.unexpected_payload "Message(request_commit), field(3)" pk - | Some (_, payload_kind) -> Pbrt.Decoder.skip d payload_kind - done; - ({ - Vyconf_types.confirm = v.confirm; - Vyconf_types.confirm_timeout = v.confirm_timeout; - Vyconf_types.comment = v.comment; - } : Vyconf_types.request_commit) - -let rec decode_request_rollback d = - let v = default_request_rollback_mutable () in - let continue__= ref true in - let revision_is_set = ref false in - while !continue__ do - match Pbrt.Decoder.key d with - | None -> ( - ); continue__ := false - | Some (1, Pbrt.Varint) -> begin - v.revision <- Pbrt.Decoder.int32_as_varint d; revision_is_set := true; - end - | Some (1, pk) -> - Pbrt.Decoder.unexpected_payload "Message(request_rollback), field(1)" pk - | Some (_, payload_kind) -> Pbrt.Decoder.skip d payload_kind - done; - begin if not !revision_is_set then Pbrt.Decoder.missing_field "revision" end; - ({ - Vyconf_types.revision = v.revision; - } : Vyconf_types.request_rollback) - -let rec decode_request_load d = - let v = default_request_load_mutable () in - let continue__= ref true in - let location_is_set = ref false in - while !continue__ do - match Pbrt.Decoder.key d with - | None -> ( - ); continue__ := false - | Some (1, Pbrt.Bytes) -> begin - v.location <- Pbrt.Decoder.string d; location_is_set := true; - end - | Some (1, pk) -> - Pbrt.Decoder.unexpected_payload "Message(request_load), field(1)" pk - | Some (2, Pbrt.Varint) -> begin - v.format <- Some (decode_request_config_format d); - end - | Some (2, pk) -> - Pbrt.Decoder.unexpected_payload "Message(request_load), field(2)" pk - | Some (_, payload_kind) -> Pbrt.Decoder.skip d payload_kind - done; - begin if not !location_is_set then Pbrt.Decoder.missing_field "location" end; - ({ - Vyconf_types.location = v.location; - Vyconf_types.format = v.format; - } : Vyconf_types.request_load) - -let rec decode_request_merge d = - let v = default_request_merge_mutable () in - let continue__= ref true in - let location_is_set = ref false in - while !continue__ do - match Pbrt.Decoder.key d with - | None -> ( - ); continue__ := false - | Some (1, Pbrt.Bytes) -> begin - v.location <- Pbrt.Decoder.string d; location_is_set := true; - end - | Some (1, pk) -> - Pbrt.Decoder.unexpected_payload "Message(request_merge), field(1)" pk - | Some (2, Pbrt.Varint) -> begin - v.format <- Some (decode_request_config_format d); - end - | Some (2, pk) -> - Pbrt.Decoder.unexpected_payload "Message(request_merge), field(2)" pk - | Some (_, payload_kind) -> Pbrt.Decoder.skip d payload_kind - done; - begin if not !location_is_set then Pbrt.Decoder.missing_field "location" end; - ({ - Vyconf_types.location = v.location; - Vyconf_types.format = v.format; - } : Vyconf_types.request_merge) - -let rec decode_request_save d = - let v = default_request_save_mutable () in - let continue__= ref true in - let location_is_set = ref false in - while !continue__ do - match Pbrt.Decoder.key d with - | None -> ( - ); continue__ := false - | Some (1, Pbrt.Bytes) -> begin - v.location <- Pbrt.Decoder.string d; location_is_set := true; - end - | Some (1, pk) -> - Pbrt.Decoder.unexpected_payload "Message(request_save), field(1)" pk - | Some (2, Pbrt.Varint) -> begin - v.format <- Some (decode_request_config_format d); - end - | Some (2, pk) -> - Pbrt.Decoder.unexpected_payload "Message(request_save), field(2)" pk - | Some (_, payload_kind) -> Pbrt.Decoder.skip d payload_kind - done; - begin if not !location_is_set then Pbrt.Decoder.missing_field "location" end; - ({ - Vyconf_types.location = v.location; - Vyconf_types.format = v.format; - } : Vyconf_types.request_save) - -let rec decode_request_show_config d = - let v = default_request_show_config_mutable () in - let continue__= ref true in - while !continue__ do - match Pbrt.Decoder.key d with - | None -> ( - v.path <- List.rev v.path; - ); continue__ := false - | Some (1, Pbrt.Bytes) -> begin - v.path <- (Pbrt.Decoder.string d) :: v.path; - end - | Some (1, pk) -> - Pbrt.Decoder.unexpected_payload "Message(request_show_config), field(1)" pk - | Some (2, Pbrt.Varint) -> begin - v.format <- Some (decode_request_config_format d); - end - | Some (2, pk) -> - Pbrt.Decoder.unexpected_payload "Message(request_show_config), field(2)" pk - | Some (_, payload_kind) -> Pbrt.Decoder.skip d payload_kind - done; - ({ - Vyconf_types.path = v.path; - Vyconf_types.format = v.format; - } : Vyconf_types.request_show_config) - -let rec decode_request_exists d = - let v = default_request_exists_mutable () in - let continue__= ref true in - while !continue__ do - match Pbrt.Decoder.key d with - | None -> ( - v.path <- List.rev v.path; - ); continue__ := false - | Some (1, Pbrt.Bytes) -> begin - v.path <- (Pbrt.Decoder.string d) :: v.path; - end - | Some (1, pk) -> - Pbrt.Decoder.unexpected_payload "Message(request_exists), field(1)" pk - | Some (_, payload_kind) -> Pbrt.Decoder.skip d payload_kind - done; - ({ - Vyconf_types.path = v.path; - } : Vyconf_types.request_exists) - -let rec decode_request_get_value d = - let v = default_request_get_value_mutable () in - let continue__= ref true in - while !continue__ do - match Pbrt.Decoder.key d with - | None -> ( - v.path <- List.rev v.path; - ); continue__ := false - | Some (1, Pbrt.Bytes) -> begin - v.path <- (Pbrt.Decoder.string d) :: v.path; - end - | Some (1, pk) -> - Pbrt.Decoder.unexpected_payload "Message(request_get_value), field(1)" pk - | Some (2, Pbrt.Varint) -> begin - v.output_format <- Some (decode_request_output_format d); - end - | Some (2, pk) -> - Pbrt.Decoder.unexpected_payload "Message(request_get_value), field(2)" pk - | Some (_, payload_kind) -> Pbrt.Decoder.skip d payload_kind - done; - ({ - Vyconf_types.path = v.path; - Vyconf_types.output_format = v.output_format; - } : Vyconf_types.request_get_value) - -let rec decode_request_get_values d = - let v = default_request_get_values_mutable () in - let continue__= ref true in - while !continue__ do - match Pbrt.Decoder.key d with - | None -> ( - v.path <- List.rev v.path; - ); continue__ := false - | Some (1, Pbrt.Bytes) -> begin - v.path <- (Pbrt.Decoder.string d) :: v.path; - end - | Some (1, pk) -> - Pbrt.Decoder.unexpected_payload "Message(request_get_values), field(1)" pk - | Some (2, Pbrt.Varint) -> begin - v.output_format <- Some (decode_request_output_format d); - end - | Some (2, pk) -> - Pbrt.Decoder.unexpected_payload "Message(request_get_values), field(2)" pk - | Some (_, payload_kind) -> Pbrt.Decoder.skip d payload_kind - done; - ({ - Vyconf_types.path = v.path; - Vyconf_types.output_format = v.output_format; - } : Vyconf_types.request_get_values) - -let rec decode_request_list_children d = - let v = default_request_list_children_mutable () in - let continue__= ref true in - while !continue__ do - match Pbrt.Decoder.key d with - | None -> ( - v.path <- List.rev v.path; - ); continue__ := false - | Some (1, Pbrt.Bytes) -> begin - v.path <- (Pbrt.Decoder.string d) :: v.path; - end - | Some (1, pk) -> - Pbrt.Decoder.unexpected_payload "Message(request_list_children), field(1)" pk - | Some (2, Pbrt.Varint) -> begin - v.output_format <- Some (decode_request_output_format d); - end - | Some (2, pk) -> - Pbrt.Decoder.unexpected_payload "Message(request_list_children), field(2)" pk - | Some (_, payload_kind) -> Pbrt.Decoder.skip d payload_kind - done; - ({ - Vyconf_types.path = v.path; - Vyconf_types.output_format = v.output_format; - } : Vyconf_types.request_list_children) - -let rec decode_request_run_op_mode d = - let v = default_request_run_op_mode_mutable () in - let continue__= ref true in - while !continue__ do - match Pbrt.Decoder.key d with - | None -> ( - v.path <- List.rev v.path; - ); continue__ := false - | Some (1, Pbrt.Bytes) -> begin - v.path <- (Pbrt.Decoder.string d) :: v.path; - end - | Some (1, pk) -> - Pbrt.Decoder.unexpected_payload "Message(request_run_op_mode), field(1)" pk - | Some (2, Pbrt.Varint) -> begin - v.output_format <- Some (decode_request_output_format d); - end - | Some (2, pk) -> - Pbrt.Decoder.unexpected_payload "Message(request_run_op_mode), field(2)" pk - | Some (_, payload_kind) -> Pbrt.Decoder.skip d payload_kind - done; - ({ - Vyconf_types.path = v.path; - Vyconf_types.output_format = v.output_format; - } : Vyconf_types.request_run_op_mode) - -let rec decode_request_enter_configuration_mode d = - let v = default_request_enter_configuration_mode_mutable () in - let continue__= ref true in - let override_exclusive_is_set = ref false in - let exclusive_is_set = ref false in - while !continue__ do - match Pbrt.Decoder.key d with - | None -> ( - ); continue__ := false - | Some (1, Pbrt.Varint) -> begin - v.exclusive <- Pbrt.Decoder.bool d; exclusive_is_set := true; - end - | Some (1, pk) -> - Pbrt.Decoder.unexpected_payload "Message(request_enter_configuration_mode), field(1)" pk - | Some (2, Pbrt.Varint) -> begin - v.override_exclusive <- Pbrt.Decoder.bool d; override_exclusive_is_set := true; - end - | Some (2, pk) -> - Pbrt.Decoder.unexpected_payload "Message(request_enter_configuration_mode), field(2)" pk - | Some (_, payload_kind) -> Pbrt.Decoder.skip d payload_kind - done; - begin if not !override_exclusive_is_set then Pbrt.Decoder.missing_field "override_exclusive" end; - begin if not !exclusive_is_set then Pbrt.Decoder.missing_field "exclusive" end; - ({ - Vyconf_types.exclusive = v.exclusive; - Vyconf_types.override_exclusive = v.override_exclusive; - } : Vyconf_types.request_enter_configuration_mode) - -let rec decode_request d = - let rec loop () = - let ret:Vyconf_types.request = match Pbrt.Decoder.key d with - | None -> Pbrt.Decoder.malformed_variant "request" - | Some (1, _) -> (Pbrt.Decoder.empty_nested d ; Vyconf_types.Status) - | Some (2, _) -> Vyconf_types.Setup_session (decode_request_setup_session (Pbrt.Decoder.nested d)) - | Some (3, _) -> Vyconf_types.Set (decode_request_set (Pbrt.Decoder.nested d)) - | Some (4, _) -> Vyconf_types.Delete (decode_request_delete (Pbrt.Decoder.nested d)) - | Some (5, _) -> Vyconf_types.Rename (decode_request_rename (Pbrt.Decoder.nested d)) - | Some (6, _) -> Vyconf_types.Copy (decode_request_copy (Pbrt.Decoder.nested d)) - | Some (7, _) -> Vyconf_types.Comment (decode_request_comment (Pbrt.Decoder.nested d)) - | Some (8, _) -> Vyconf_types.Commit (decode_request_commit (Pbrt.Decoder.nested d)) - | Some (9, _) -> Vyconf_types.Rollback (decode_request_rollback (Pbrt.Decoder.nested d)) - | Some (10, _) -> Vyconf_types.Merge (decode_request_merge (Pbrt.Decoder.nested d)) - | Some (11, _) -> Vyconf_types.Save (decode_request_save (Pbrt.Decoder.nested d)) - | Some (12, _) -> Vyconf_types.Show_config (decode_request_show_config (Pbrt.Decoder.nested d)) - | Some (13, _) -> Vyconf_types.Exists (decode_request_exists (Pbrt.Decoder.nested d)) - | Some (14, _) -> Vyconf_types.Get_value (decode_request_get_value (Pbrt.Decoder.nested d)) - | Some (15, _) -> Vyconf_types.Get_values (decode_request_get_values (Pbrt.Decoder.nested d)) - | Some (16, _) -> Vyconf_types.List_children (decode_request_list_children (Pbrt.Decoder.nested d)) - | Some (17, _) -> Vyconf_types.Run_op_mode (decode_request_run_op_mode (Pbrt.Decoder.nested d)) - | Some (18, _) -> (Pbrt.Decoder.empty_nested d ; Vyconf_types.Confirm) - | Some (19, _) -> Vyconf_types.Configure (decode_request_enter_configuration_mode (Pbrt.Decoder.nested d)) - | Some (20, _) -> (Pbrt.Decoder.empty_nested d ; Vyconf_types.Exit_configure) - | Some (21, _) -> Vyconf_types.Teardown (Pbrt.Decoder.string d) - | Some (n, payload_kind) -> ( - Pbrt.Decoder.skip d payload_kind; - loop () - ) - in - ret - in - loop () - -let rec decode_request_envelope d = - let v = default_request_envelope_mutable () in - let continue__= ref true in - let request_is_set = ref false in - while !continue__ do - match Pbrt.Decoder.key d with - | None -> ( - ); continue__ := false - | Some (1, Pbrt.Bytes) -> begin - v.token <- Some (Pbrt.Decoder.string d); - end - | Some (1, pk) -> - Pbrt.Decoder.unexpected_payload "Message(request_envelope), field(1)" pk - | Some (2, Pbrt.Bytes) -> begin - v.request <- decode_request (Pbrt.Decoder.nested d); request_is_set := true; - end - | Some (2, pk) -> - Pbrt.Decoder.unexpected_payload "Message(request_envelope), field(2)" pk - | Some (_, payload_kind) -> Pbrt.Decoder.skip d payload_kind - done; - begin if not !request_is_set then Pbrt.Decoder.missing_field "request" end; - ({ - Vyconf_types.token = v.token; - Vyconf_types.request = v.request; - } : Vyconf_types.request_envelope) - -let rec decode_status d = - match Pbrt.Decoder.int_as_varint d with - | 0 -> (Vyconf_types.Success:Vyconf_types.status) - | 1 -> (Vyconf_types.Fail:Vyconf_types.status) - | 2 -> (Vyconf_types.Invalid_path:Vyconf_types.status) - | 3 -> (Vyconf_types.Invalid_value:Vyconf_types.status) - | 4 -> (Vyconf_types.Commit_in_progress:Vyconf_types.status) - | 5 -> (Vyconf_types.Configuration_locked:Vyconf_types.status) - | 6 -> (Vyconf_types.Internal_error:Vyconf_types.status) - | 7 -> (Vyconf_types.Permission_denied:Vyconf_types.status) - | 8 -> (Vyconf_types.Path_already_exists:Vyconf_types.status) - | _ -> Pbrt.Decoder.malformed_variant "status" - -let rec decode_response d = - let v = default_response_mutable () in - let continue__= ref true in - let status_is_set = ref false in - while !continue__ do - match Pbrt.Decoder.key d with - | None -> ( - ); continue__ := false - | Some (1, Pbrt.Varint) -> begin - v.status <- decode_status d; status_is_set := true; - end - | Some (1, pk) -> - Pbrt.Decoder.unexpected_payload "Message(response), field(1)" pk - | Some (2, Pbrt.Bytes) -> begin - v.output <- Some (Pbrt.Decoder.string d); - end - | Some (2, pk) -> - Pbrt.Decoder.unexpected_payload "Message(response), field(2)" pk - | Some (3, Pbrt.Bytes) -> begin - v.error <- Some (Pbrt.Decoder.string d); - end - | Some (3, pk) -> - Pbrt.Decoder.unexpected_payload "Message(response), field(3)" pk - | Some (4, Pbrt.Bytes) -> begin - v.warning <- Some (Pbrt.Decoder.string d); - end - | Some (4, pk) -> - Pbrt.Decoder.unexpected_payload "Message(response), field(4)" pk - | Some (_, payload_kind) -> Pbrt.Decoder.skip d payload_kind - done; - begin if not !status_is_set then Pbrt.Decoder.missing_field "status" end; - ({ - Vyconf_types.status = v.status; - Vyconf_types.output = v.output; - Vyconf_types.error = v.error; - Vyconf_types.warning = v.warning; - } : Vyconf_types.response) - -let rec encode_request_config_format (v:Vyconf_types.request_config_format) encoder = - match v with - | Vyconf_types.Curly -> Pbrt.Encoder.int_as_varint (0) encoder - | Vyconf_types.Json -> Pbrt.Encoder.int_as_varint 1 encoder - -let rec encode_request_output_format (v:Vyconf_types.request_output_format) encoder = - match v with - | Vyconf_types.Out_plain -> Pbrt.Encoder.int_as_varint (0) encoder - | Vyconf_types.Out_json -> Pbrt.Encoder.int_as_varint 1 encoder - -let rec encode_request_setup_session (v:Vyconf_types.request_setup_session) encoder = - begin match v.Vyconf_types.client_application with - | Some x -> - Pbrt.Encoder.key (1, Pbrt.Bytes) encoder; - Pbrt.Encoder.string x encoder; - | None -> (); - end; - begin match v.Vyconf_types.on_behalf_of with - | Some x -> - Pbrt.Encoder.key (2, Pbrt.Varint) encoder; - Pbrt.Encoder.int32_as_varint x encoder; - | None -> (); - end; - () - -let rec encode_request_set (v:Vyconf_types.request_set) encoder = - List.iter (fun x -> - Pbrt.Encoder.key (1, Pbrt.Bytes) encoder; - Pbrt.Encoder.string x encoder; - ) v.Vyconf_types.path; - begin match v.Vyconf_types.ephemeral with - | Some x -> - Pbrt.Encoder.key (3, Pbrt.Varint) encoder; - Pbrt.Encoder.bool x encoder; - | None -> (); - end; - () - -let rec encode_request_delete (v:Vyconf_types.request_delete) encoder = - List.iter (fun x -> - Pbrt.Encoder.key (1, Pbrt.Bytes) encoder; - Pbrt.Encoder.string x encoder; - ) v.Vyconf_types.path; - () - -let rec encode_request_rename (v:Vyconf_types.request_rename) encoder = - List.iter (fun x -> - Pbrt.Encoder.key (1, Pbrt.Bytes) encoder; - Pbrt.Encoder.string x encoder; - ) v.Vyconf_types.edit_level; - Pbrt.Encoder.key (2, Pbrt.Bytes) encoder; - Pbrt.Encoder.string v.Vyconf_types.from encoder; - Pbrt.Encoder.key (3, Pbrt.Bytes) encoder; - Pbrt.Encoder.string v.Vyconf_types.to_ encoder; - () - -let rec encode_request_copy (v:Vyconf_types.request_copy) encoder = - List.iter (fun x -> - Pbrt.Encoder.key (1, Pbrt.Bytes) encoder; - Pbrt.Encoder.string x encoder; - ) v.Vyconf_types.edit_level; - Pbrt.Encoder.key (2, Pbrt.Bytes) encoder; - Pbrt.Encoder.string v.Vyconf_types.from encoder; - Pbrt.Encoder.key (3, Pbrt.Bytes) encoder; - Pbrt.Encoder.string v.Vyconf_types.to_ encoder; - () - -let rec encode_request_comment (v:Vyconf_types.request_comment) encoder = - List.iter (fun x -> - Pbrt.Encoder.key (1, Pbrt.Bytes) encoder; - Pbrt.Encoder.string x encoder; - ) v.Vyconf_types.path; - Pbrt.Encoder.key (2, Pbrt.Bytes) encoder; - Pbrt.Encoder.string v.Vyconf_types.comment encoder; - () - -let rec encode_request_commit (v:Vyconf_types.request_commit) encoder = - begin match v.Vyconf_types.confirm with - | Some x -> - Pbrt.Encoder.key (1, Pbrt.Varint) encoder; - Pbrt.Encoder.bool x encoder; - | None -> (); - end; - begin match v.Vyconf_types.confirm_timeout with - | Some x -> - Pbrt.Encoder.key (2, Pbrt.Varint) encoder; - Pbrt.Encoder.int32_as_varint x encoder; - | None -> (); - end; - begin match v.Vyconf_types.comment with - | Some x -> - Pbrt.Encoder.key (3, Pbrt.Bytes) encoder; - Pbrt.Encoder.string x encoder; - | None -> (); - end; - () - -let rec encode_request_rollback (v:Vyconf_types.request_rollback) encoder = - Pbrt.Encoder.key (1, Pbrt.Varint) encoder; - Pbrt.Encoder.int32_as_varint v.Vyconf_types.revision encoder; - () - -let rec encode_request_load (v:Vyconf_types.request_load) encoder = - Pbrt.Encoder.key (1, Pbrt.Bytes) encoder; - Pbrt.Encoder.string v.Vyconf_types.location encoder; - begin match v.Vyconf_types.format with - | Some x -> - Pbrt.Encoder.key (2, Pbrt.Varint) encoder; - encode_request_config_format x encoder; - | None -> (); - end; - () - -let rec encode_request_merge (v:Vyconf_types.request_merge) encoder = - Pbrt.Encoder.key (1, Pbrt.Bytes) encoder; - Pbrt.Encoder.string v.Vyconf_types.location encoder; - begin match v.Vyconf_types.format with - | Some x -> - Pbrt.Encoder.key (2, Pbrt.Varint) encoder; - encode_request_config_format x encoder; - | None -> (); - end; - () - -let rec encode_request_save (v:Vyconf_types.request_save) encoder = - Pbrt.Encoder.key (1, Pbrt.Bytes) encoder; - Pbrt.Encoder.string v.Vyconf_types.location encoder; - begin match v.Vyconf_types.format with - | Some x -> - Pbrt.Encoder.key (2, Pbrt.Varint) encoder; - encode_request_config_format x encoder; - | None -> (); - end; - () - -let rec encode_request_show_config (v:Vyconf_types.request_show_config) encoder = - List.iter (fun x -> - Pbrt.Encoder.key (1, Pbrt.Bytes) encoder; - Pbrt.Encoder.string x encoder; - ) v.Vyconf_types.path; - begin match v.Vyconf_types.format with - | Some x -> - Pbrt.Encoder.key (2, Pbrt.Varint) encoder; - encode_request_config_format x encoder; - | None -> (); - end; - () - -let rec encode_request_exists (v:Vyconf_types.request_exists) encoder = - List.iter (fun x -> - Pbrt.Encoder.key (1, Pbrt.Bytes) encoder; - Pbrt.Encoder.string x encoder; - ) v.Vyconf_types.path; - () - -let rec encode_request_get_value (v:Vyconf_types.request_get_value) encoder = - List.iter (fun x -> - Pbrt.Encoder.key (1, Pbrt.Bytes) encoder; - Pbrt.Encoder.string x encoder; - ) v.Vyconf_types.path; - begin match v.Vyconf_types.output_format with - | Some x -> - Pbrt.Encoder.key (2, Pbrt.Varint) encoder; - encode_request_output_format x encoder; - | None -> (); - end; - () - -let rec encode_request_get_values (v:Vyconf_types.request_get_values) encoder = - List.iter (fun x -> - Pbrt.Encoder.key (1, Pbrt.Bytes) encoder; - Pbrt.Encoder.string x encoder; - ) v.Vyconf_types.path; - begin match v.Vyconf_types.output_format with - | Some x -> - Pbrt.Encoder.key (2, Pbrt.Varint) encoder; - encode_request_output_format x encoder; - | None -> (); - end; - () - -let rec encode_request_list_children (v:Vyconf_types.request_list_children) encoder = - List.iter (fun x -> - Pbrt.Encoder.key (1, Pbrt.Bytes) encoder; - Pbrt.Encoder.string x encoder; - ) v.Vyconf_types.path; - begin match v.Vyconf_types.output_format with - | Some x -> - Pbrt.Encoder.key (2, Pbrt.Varint) encoder; - encode_request_output_format x encoder; - | None -> (); - end; - () - -let rec encode_request_run_op_mode (v:Vyconf_types.request_run_op_mode) encoder = - List.iter (fun x -> - Pbrt.Encoder.key (1, Pbrt.Bytes) encoder; - Pbrt.Encoder.string x encoder; - ) v.Vyconf_types.path; - begin match v.Vyconf_types.output_format with - | Some x -> - Pbrt.Encoder.key (2, Pbrt.Varint) encoder; - encode_request_output_format x encoder; - | None -> (); - end; - () - -let rec encode_request_enter_configuration_mode (v:Vyconf_types.request_enter_configuration_mode) encoder = - Pbrt.Encoder.key (1, Pbrt.Varint) encoder; - Pbrt.Encoder.bool v.Vyconf_types.exclusive encoder; - Pbrt.Encoder.key (2, Pbrt.Varint) encoder; - Pbrt.Encoder.bool v.Vyconf_types.override_exclusive encoder; - () - -let rec encode_request (v:Vyconf_types.request) encoder = - begin match v with - | Vyconf_types.Status -> - Pbrt.Encoder.key (1, Pbrt.Bytes) encoder; - Pbrt.Encoder.empty_nested encoder - | Vyconf_types.Setup_session x -> - Pbrt.Encoder.key (2, Pbrt.Bytes) encoder; - Pbrt.Encoder.nested (encode_request_setup_session x) encoder; - | Vyconf_types.Set x -> - Pbrt.Encoder.key (3, Pbrt.Bytes) encoder; - Pbrt.Encoder.nested (encode_request_set x) encoder; - | Vyconf_types.Delete x -> - Pbrt.Encoder.key (4, Pbrt.Bytes) encoder; - Pbrt.Encoder.nested (encode_request_delete x) encoder; - | Vyconf_types.Rename x -> - Pbrt.Encoder.key (5, Pbrt.Bytes) encoder; - Pbrt.Encoder.nested (encode_request_rename x) encoder; - | Vyconf_types.Copy x -> - Pbrt.Encoder.key (6, Pbrt.Bytes) encoder; - Pbrt.Encoder.nested (encode_request_copy x) encoder; - | Vyconf_types.Comment x -> - Pbrt.Encoder.key (7, Pbrt.Bytes) encoder; - Pbrt.Encoder.nested (encode_request_comment x) encoder; - | Vyconf_types.Commit x -> - Pbrt.Encoder.key (8, Pbrt.Bytes) encoder; - Pbrt.Encoder.nested (encode_request_commit x) encoder; - | Vyconf_types.Rollback x -> - Pbrt.Encoder.key (9, Pbrt.Bytes) encoder; - Pbrt.Encoder.nested (encode_request_rollback x) encoder; - | Vyconf_types.Merge x -> - Pbrt.Encoder.key (10, Pbrt.Bytes) encoder; - Pbrt.Encoder.nested (encode_request_merge x) encoder; - | Vyconf_types.Save x -> - Pbrt.Encoder.key (11, Pbrt.Bytes) encoder; - Pbrt.Encoder.nested (encode_request_save x) encoder; - | Vyconf_types.Show_config x -> - Pbrt.Encoder.key (12, Pbrt.Bytes) encoder; - Pbrt.Encoder.nested (encode_request_show_config x) encoder; - | Vyconf_types.Exists x -> - Pbrt.Encoder.key (13, Pbrt.Bytes) encoder; - Pbrt.Encoder.nested (encode_request_exists x) encoder; - | Vyconf_types.Get_value x -> - Pbrt.Encoder.key (14, Pbrt.Bytes) encoder; - Pbrt.Encoder.nested (encode_request_get_value x) encoder; - | Vyconf_types.Get_values x -> - Pbrt.Encoder.key (15, Pbrt.Bytes) encoder; - Pbrt.Encoder.nested (encode_request_get_values x) encoder; - | Vyconf_types.List_children x -> - Pbrt.Encoder.key (16, Pbrt.Bytes) encoder; - Pbrt.Encoder.nested (encode_request_list_children x) encoder; - | Vyconf_types.Run_op_mode x -> - Pbrt.Encoder.key (17, Pbrt.Bytes) encoder; - Pbrt.Encoder.nested (encode_request_run_op_mode x) encoder; - | Vyconf_types.Confirm -> - Pbrt.Encoder.key (18, Pbrt.Bytes) encoder; - Pbrt.Encoder.empty_nested encoder - | Vyconf_types.Configure x -> - Pbrt.Encoder.key (19, Pbrt.Bytes) encoder; - Pbrt.Encoder.nested (encode_request_enter_configuration_mode x) encoder; - | Vyconf_types.Exit_configure -> - Pbrt.Encoder.key (20, Pbrt.Bytes) encoder; - Pbrt.Encoder.empty_nested encoder - | Vyconf_types.Teardown x -> - Pbrt.Encoder.key (21, Pbrt.Bytes) encoder; - Pbrt.Encoder.string x encoder; - end - -let rec encode_request_envelope (v:Vyconf_types.request_envelope) encoder = - begin match v.Vyconf_types.token with - | Some x -> - Pbrt.Encoder.key (1, Pbrt.Bytes) encoder; - Pbrt.Encoder.string x encoder; - | None -> (); - end; - Pbrt.Encoder.key (2, Pbrt.Bytes) encoder; - Pbrt.Encoder.nested (encode_request v.Vyconf_types.request) encoder; - () - -let rec encode_status (v:Vyconf_types.status) encoder = - match v with - | Vyconf_types.Success -> Pbrt.Encoder.int_as_varint (0) encoder - | Vyconf_types.Fail -> Pbrt.Encoder.int_as_varint 1 encoder - | Vyconf_types.Invalid_path -> Pbrt.Encoder.int_as_varint 2 encoder - | Vyconf_types.Invalid_value -> Pbrt.Encoder.int_as_varint 3 encoder - | Vyconf_types.Commit_in_progress -> Pbrt.Encoder.int_as_varint 4 encoder - | Vyconf_types.Configuration_locked -> Pbrt.Encoder.int_as_varint 5 encoder - | Vyconf_types.Internal_error -> Pbrt.Encoder.int_as_varint 6 encoder - | Vyconf_types.Permission_denied -> Pbrt.Encoder.int_as_varint 7 encoder - | Vyconf_types.Path_already_exists -> Pbrt.Encoder.int_as_varint 8 encoder - -let rec encode_response (v:Vyconf_types.response) encoder = - Pbrt.Encoder.key (1, Pbrt.Varint) encoder; - encode_status v.Vyconf_types.status encoder; - begin match v.Vyconf_types.output with - | Some x -> - Pbrt.Encoder.key (2, Pbrt.Bytes) encoder; - Pbrt.Encoder.string x encoder; - | None -> (); - end; - begin match v.Vyconf_types.error with - | Some x -> - Pbrt.Encoder.key (3, Pbrt.Bytes) encoder; - Pbrt.Encoder.string x encoder; - | None -> (); - end; - begin match v.Vyconf_types.warning with - | Some x -> - Pbrt.Encoder.key (4, Pbrt.Bytes) encoder; - Pbrt.Encoder.string x encoder; - | None -> (); - end; - () diff --git a/src/vyconf_pb.mli b/src/vyconf_pb.mli deleted file mode 100644 index 8a1249c..0000000 --- a/src/vyconf_pb.mli +++ /dev/null @@ -1,151 +0,0 @@ -(** vyconf.proto Binary Encoding *) - - -(** {2 Protobuf Encoding} *) - -val encode_request_config_format : Vyconf_types.request_config_format -> Pbrt.Encoder.t -> unit -(** [encode_request_config_format v encoder] encodes [v] with the given [encoder] *) - -val encode_request_output_format : Vyconf_types.request_output_format -> Pbrt.Encoder.t -> unit -(** [encode_request_output_format v encoder] encodes [v] with the given [encoder] *) - -val encode_request_setup_session : Vyconf_types.request_setup_session -> Pbrt.Encoder.t -> unit -(** [encode_request_setup_session v encoder] encodes [v] with the given [encoder] *) - -val encode_request_set : Vyconf_types.request_set -> Pbrt.Encoder.t -> unit -(** [encode_request_set v encoder] encodes [v] with the given [encoder] *) - -val encode_request_delete : Vyconf_types.request_delete -> Pbrt.Encoder.t -> unit -(** [encode_request_delete v encoder] encodes [v] with the given [encoder] *) - -val encode_request_rename : Vyconf_types.request_rename -> Pbrt.Encoder.t -> unit -(** [encode_request_rename v encoder] encodes [v] with the given [encoder] *) - -val encode_request_copy : Vyconf_types.request_copy -> Pbrt.Encoder.t -> unit -(** [encode_request_copy v encoder] encodes [v] with the given [encoder] *) - -val encode_request_comment : Vyconf_types.request_comment -> Pbrt.Encoder.t -> unit -(** [encode_request_comment v encoder] encodes [v] with the given [encoder] *) - -val encode_request_commit : Vyconf_types.request_commit -> Pbrt.Encoder.t -> unit -(** [encode_request_commit v encoder] encodes [v] with the given [encoder] *) - -val encode_request_rollback : Vyconf_types.request_rollback -> Pbrt.Encoder.t -> unit -(** [encode_request_rollback v encoder] encodes [v] with the given [encoder] *) - -val encode_request_load : Vyconf_types.request_load -> Pbrt.Encoder.t -> unit -(** [encode_request_load v encoder] encodes [v] with the given [encoder] *) - -val encode_request_merge : Vyconf_types.request_merge -> Pbrt.Encoder.t -> unit -(** [encode_request_merge v encoder] encodes [v] with the given [encoder] *) - -val encode_request_save : Vyconf_types.request_save -> Pbrt.Encoder.t -> unit -(** [encode_request_save v encoder] encodes [v] with the given [encoder] *) - -val encode_request_show_config : Vyconf_types.request_show_config -> Pbrt.Encoder.t -> unit -(** [encode_request_show_config v encoder] encodes [v] with the given [encoder] *) - -val encode_request_exists : Vyconf_types.request_exists -> Pbrt.Encoder.t -> unit -(** [encode_request_exists v encoder] encodes [v] with the given [encoder] *) - -val encode_request_get_value : Vyconf_types.request_get_value -> Pbrt.Encoder.t -> unit -(** [encode_request_get_value v encoder] encodes [v] with the given [encoder] *) - -val encode_request_get_values : Vyconf_types.request_get_values -> Pbrt.Encoder.t -> unit -(** [encode_request_get_values v encoder] encodes [v] with the given [encoder] *) - -val encode_request_list_children : Vyconf_types.request_list_children -> Pbrt.Encoder.t -> unit -(** [encode_request_list_children v encoder] encodes [v] with the given [encoder] *) - -val encode_request_run_op_mode : Vyconf_types.request_run_op_mode -> Pbrt.Encoder.t -> unit -(** [encode_request_run_op_mode v encoder] encodes [v] with the given [encoder] *) - -val encode_request_enter_configuration_mode : Vyconf_types.request_enter_configuration_mode -> Pbrt.Encoder.t -> unit -(** [encode_request_enter_configuration_mode v encoder] encodes [v] with the given [encoder] *) - -val encode_request : Vyconf_types.request -> Pbrt.Encoder.t -> unit -(** [encode_request v encoder] encodes [v] with the given [encoder] *) - -val encode_request_envelope : Vyconf_types.request_envelope -> Pbrt.Encoder.t -> unit -(** [encode_request_envelope v encoder] encodes [v] with the given [encoder] *) - -val encode_status : Vyconf_types.status -> Pbrt.Encoder.t -> unit -(** [encode_status v encoder] encodes [v] with the given [encoder] *) - -val encode_response : Vyconf_types.response -> Pbrt.Encoder.t -> unit -(** [encode_response v encoder] encodes [v] with the given [encoder] *) - - -(** {2 Protobuf Decoding} *) - -val decode_request_config_format : Pbrt.Decoder.t -> Vyconf_types.request_config_format -(** [decode_request_config_format decoder] decodes a [request_config_format] value from [decoder] *) - -val decode_request_output_format : Pbrt.Decoder.t -> Vyconf_types.request_output_format -(** [decode_request_output_format decoder] decodes a [request_output_format] value from [decoder] *) - -val decode_request_setup_session : Pbrt.Decoder.t -> Vyconf_types.request_setup_session -(** [decode_request_setup_session decoder] decodes a [request_setup_session] value from [decoder] *) - -val decode_request_set : Pbrt.Decoder.t -> Vyconf_types.request_set -(** [decode_request_set decoder] decodes a [request_set] value from [decoder] *) - -val decode_request_delete : Pbrt.Decoder.t -> Vyconf_types.request_delete -(** [decode_request_delete decoder] decodes a [request_delete] value from [decoder] *) - -val decode_request_rename : Pbrt.Decoder.t -> Vyconf_types.request_rename -(** [decode_request_rename decoder] decodes a [request_rename] value from [decoder] *) - -val decode_request_copy : Pbrt.Decoder.t -> Vyconf_types.request_copy -(** [decode_request_copy decoder] decodes a [request_copy] value from [decoder] *) - -val decode_request_comment : Pbrt.Decoder.t -> Vyconf_types.request_comment -(** [decode_request_comment decoder] decodes a [request_comment] value from [decoder] *) - -val decode_request_commit : Pbrt.Decoder.t -> Vyconf_types.request_commit -(** [decode_request_commit decoder] decodes a [request_commit] value from [decoder] *) - -val decode_request_rollback : Pbrt.Decoder.t -> Vyconf_types.request_rollback -(** [decode_request_rollback decoder] decodes a [request_rollback] value from [decoder] *) - -val decode_request_load : Pbrt.Decoder.t -> Vyconf_types.request_load -(** [decode_request_load decoder] decodes a [request_load] value from [decoder] *) - -val decode_request_merge : Pbrt.Decoder.t -> Vyconf_types.request_merge -(** [decode_request_merge decoder] decodes a [request_merge] value from [decoder] *) - -val decode_request_save : Pbrt.Decoder.t -> Vyconf_types.request_save -(** [decode_request_save decoder] decodes a [request_save] value from [decoder] *) - -val decode_request_show_config : Pbrt.Decoder.t -> Vyconf_types.request_show_config -(** [decode_request_show_config decoder] decodes a [request_show_config] value from [decoder] *) - -val decode_request_exists : Pbrt.Decoder.t -> Vyconf_types.request_exists -(** [decode_request_exists decoder] decodes a [request_exists] value from [decoder] *) - -val decode_request_get_value : Pbrt.Decoder.t -> Vyconf_types.request_get_value -(** [decode_request_get_value decoder] decodes a [request_get_value] value from [decoder] *) - -val decode_request_get_values : Pbrt.Decoder.t -> Vyconf_types.request_get_values -(** [decode_request_get_values decoder] decodes a [request_get_values] value from [decoder] *) - -val decode_request_list_children : Pbrt.Decoder.t -> Vyconf_types.request_list_children -(** [decode_request_list_children decoder] decodes a [request_list_children] value from [decoder] *) - -val decode_request_run_op_mode : Pbrt.Decoder.t -> Vyconf_types.request_run_op_mode -(** [decode_request_run_op_mode decoder] decodes a [request_run_op_mode] value from [decoder] *) - -val decode_request_enter_configuration_mode : Pbrt.Decoder.t -> Vyconf_types.request_enter_configuration_mode -(** [decode_request_enter_configuration_mode decoder] decodes a [request_enter_configuration_mode] value from [decoder] *) - -val decode_request : Pbrt.Decoder.t -> Vyconf_types.request -(** [decode_request decoder] decodes a [request] value from [decoder] *) - -val decode_request_envelope : Pbrt.Decoder.t -> Vyconf_types.request_envelope -(** [decode_request_envelope decoder] decodes a [request_envelope] value from [decoder] *) - -val decode_status : Pbrt.Decoder.t -> Vyconf_types.status -(** [decode_status decoder] decodes a [status] value from [decoder] *) - -val decode_response : Pbrt.Decoder.t -> Vyconf_types.response -(** [decode_response decoder] decodes a [response] value from [decoder] *) diff --git a/src/vyconf_pbt.ml b/src/vyconf_pbt.ml new file mode 100644 index 0000000..4c7fcc6 --- /dev/null +++ b/src/vyconf_pbt.ml @@ -0,0 +1,1827 @@ +[@@@ocaml.warning "-27-30-39-44"] + +type request_config_format = + | Curly + | Json + +type request_output_format = + | Out_plain + | Out_json + +type request_status = unit + +type request_setup_session = { + client_application : string option; + on_behalf_of : int32 option; +} + +type request_teardown = { + on_behalf_of : int32 option; +} + +type request_validate = { + path : string list; + output_format : request_output_format option; +} + +type request_set = { + path : string list; + ephemeral : bool option; +} + +type request_delete = { + path : string list; +} + +type request_rename = { + edit_level : string list; + from : string; + to_ : string; +} + +type request_copy = { + edit_level : string list; + from : string; + to_ : string; +} + +type request_comment = { + path : string list; + comment : string; +} + +type request_commit = { + confirm : bool option; + confirm_timeout : int32 option; + comment : string option; +} + +type request_rollback = { + revision : int32; +} + +type request_load = { + location : string; + format : request_config_format option; +} + +type request_merge = { + location : string; + format : request_config_format option; +} + +type request_save = { + location : string; + format : request_config_format option; +} + +type request_show_config = { + path : string list; + format : request_config_format option; +} + +type request_exists = { + path : string list; +} + +type request_get_value = { + path : string list; + output_format : request_output_format option; +} + +type request_get_values = { + path : string list; + output_format : request_output_format option; +} + +type request_list_children = { + path : string list; + output_format : request_output_format option; +} + +type request_run_op_mode = { + path : string list; + output_format : request_output_format option; +} + +type request_confirm = unit + +type request_enter_configuration_mode = { + exclusive : bool; + override_exclusive : bool; +} + +type request_exit_configuration_mode = unit + +type request = + | Status + | Setup_session of request_setup_session + | Set of request_set + | Delete of request_delete + | Rename of request_rename + | Copy of request_copy + | Comment of request_comment + | Commit of request_commit + | Rollback of request_rollback + | Merge of request_merge + | Save of request_save + | Show_config of request_show_config + | Exists of request_exists + | Get_value of request_get_value + | Get_values of request_get_values + | List_children of request_list_children + | Run_op_mode of request_run_op_mode + | Confirm + | Configure of request_enter_configuration_mode + | Exit_configure + | Validate of request_validate + | Teardown of request_teardown + +type request_envelope = { + token : string option; + request : request; +} + +type status = + | Success + | Fail + | Invalid_path + | Invalid_value + | Commit_in_progress + | Configuration_locked + | Internal_error + | Permission_denied + | Path_already_exists + +type response = { + status : status; + output : string option; + error : string option; + warning : string option; +} + +let rec default_request_config_format () = (Curly:request_config_format) + +let rec default_request_output_format () = (Out_plain:request_output_format) + +let rec default_request_status = () + +let rec default_request_setup_session + ?client_application:((client_application:string option) = None) + ?on_behalf_of:((on_behalf_of:int32 option) = None) + () : request_setup_session = { + client_application; + on_behalf_of; +} + +let rec default_request_teardown + ?on_behalf_of:((on_behalf_of:int32 option) = None) + () : request_teardown = { + on_behalf_of; +} + +let rec default_request_validate + ?path:((path:string list) = []) + ?output_format:((output_format:request_output_format option) = None) + () : request_validate = { + path; + output_format; +} + +let rec default_request_set + ?path:((path:string list) = []) + ?ephemeral:((ephemeral:bool option) = None) + () : request_set = { + path; + ephemeral; +} + +let rec default_request_delete + ?path:((path:string list) = []) + () : request_delete = { + path; +} + +let rec default_request_rename + ?edit_level:((edit_level:string list) = []) + ?from:((from:string) = "") + ?to_:((to_:string) = "") + () : request_rename = { + edit_level; + from; + to_; +} + +let rec default_request_copy + ?edit_level:((edit_level:string list) = []) + ?from:((from:string) = "") + ?to_:((to_:string) = "") + () : request_copy = { + edit_level; + from; + to_; +} + +let rec default_request_comment + ?path:((path:string list) = []) + ?comment:((comment:string) = "") + () : request_comment = { + path; + comment; +} + +let rec default_request_commit + ?confirm:((confirm:bool option) = None) + ?confirm_timeout:((confirm_timeout:int32 option) = None) + ?comment:((comment:string option) = None) + () : request_commit = { + confirm; + confirm_timeout; + comment; +} + +let rec default_request_rollback + ?revision:((revision:int32) = 0l) + () : request_rollback = { + revision; +} + +let rec default_request_load + ?location:((location:string) = "") + ?format:((format:request_config_format option) = None) + () : request_load = { + location; + format; +} + +let rec default_request_merge + ?location:((location:string) = "") + ?format:((format:request_config_format option) = None) + () : request_merge = { + location; + format; +} + +let rec default_request_save + ?location:((location:string) = "") + ?format:((format:request_config_format option) = None) + () : request_save = { + location; + format; +} + +let rec default_request_show_config + ?path:((path:string list) = []) + ?format:((format:request_config_format option) = None) + () : request_show_config = { + path; + format; +} + +let rec default_request_exists + ?path:((path:string list) = []) + () : request_exists = { + path; +} + +let rec default_request_get_value + ?path:((path:string list) = []) + ?output_format:((output_format:request_output_format option) = None) + () : request_get_value = { + path; + output_format; +} + +let rec default_request_get_values + ?path:((path:string list) = []) + ?output_format:((output_format:request_output_format option) = None) + () : request_get_values = { + path; + output_format; +} + +let rec default_request_list_children + ?path:((path:string list) = []) + ?output_format:((output_format:request_output_format option) = None) + () : request_list_children = { + path; + output_format; +} + +let rec default_request_run_op_mode + ?path:((path:string list) = []) + ?output_format:((output_format:request_output_format option) = None) + () : request_run_op_mode = { + path; + output_format; +} + +let rec default_request_confirm = () + +let rec default_request_enter_configuration_mode + ?exclusive:((exclusive:bool) = false) + ?override_exclusive:((override_exclusive:bool) = false) + () : request_enter_configuration_mode = { + exclusive; + override_exclusive; +} + +let rec default_request_exit_configuration_mode = () + +let rec default_request (): request = Status + +let rec default_request_envelope + ?token:((token:string option) = None) + ?request:((request:request) = default_request ()) + () : request_envelope = { + token; + request; +} + +let rec default_status () = (Success:status) + +let rec default_response + ?status:((status:status) = default_status ()) + ?output:((output:string option) = None) + ?error:((error:string option) = None) + ?warning:((warning:string option) = None) + () : response = { + status; + output; + error; + warning; +} + +type request_setup_session_mutable = { + mutable client_application : string option; + mutable on_behalf_of : int32 option; +} + +let default_request_setup_session_mutable () : request_setup_session_mutable = { + client_application = None; + on_behalf_of = None; +} + +type request_teardown_mutable = { + mutable on_behalf_of : int32 option; +} + +let default_request_teardown_mutable () : request_teardown_mutable = { + on_behalf_of = None; +} + +type request_validate_mutable = { + mutable path : string list; + mutable output_format : request_output_format option; +} + +let default_request_validate_mutable () : request_validate_mutable = { + path = []; + output_format = None; +} + +type request_set_mutable = { + mutable path : string list; + mutable ephemeral : bool option; +} + +let default_request_set_mutable () : request_set_mutable = { + path = []; + ephemeral = None; +} + +type request_delete_mutable = { + mutable path : string list; +} + +let default_request_delete_mutable () : request_delete_mutable = { + path = []; +} + +type request_rename_mutable = { + mutable edit_level : string list; + mutable from : string; + mutable to_ : string; +} + +let default_request_rename_mutable () : request_rename_mutable = { + edit_level = []; + from = ""; + to_ = ""; +} + +type request_copy_mutable = { + mutable edit_level : string list; + mutable from : string; + mutable to_ : string; +} + +let default_request_copy_mutable () : request_copy_mutable = { + edit_level = []; + from = ""; + to_ = ""; +} + +type request_comment_mutable = { + mutable path : string list; + mutable comment : string; +} + +let default_request_comment_mutable () : request_comment_mutable = { + path = []; + comment = ""; +} + +type request_commit_mutable = { + mutable confirm : bool option; + mutable confirm_timeout : int32 option; + mutable comment : string option; +} + +let default_request_commit_mutable () : request_commit_mutable = { + confirm = None; + confirm_timeout = None; + comment = None; +} + +type request_rollback_mutable = { + mutable revision : int32; +} + +let default_request_rollback_mutable () : request_rollback_mutable = { + revision = 0l; +} + +type request_load_mutable = { + mutable location : string; + mutable format : request_config_format option; +} + +let default_request_load_mutable () : request_load_mutable = { + location = ""; + format = None; +} + +type request_merge_mutable = { + mutable location : string; + mutable format : request_config_format option; +} + +let default_request_merge_mutable () : request_merge_mutable = { + location = ""; + format = None; +} + +type request_save_mutable = { + mutable location : string; + mutable format : request_config_format option; +} + +let default_request_save_mutable () : request_save_mutable = { + location = ""; + format = None; +} + +type request_show_config_mutable = { + mutable path : string list; + mutable format : request_config_format option; +} + +let default_request_show_config_mutable () : request_show_config_mutable = { + path = []; + format = None; +} + +type request_exists_mutable = { + mutable path : string list; +} + +let default_request_exists_mutable () : request_exists_mutable = { + path = []; +} + +type request_get_value_mutable = { + mutable path : string list; + mutable output_format : request_output_format option; +} + +let default_request_get_value_mutable () : request_get_value_mutable = { + path = []; + output_format = None; +} + +type request_get_values_mutable = { + mutable path : string list; + mutable output_format : request_output_format option; +} + +let default_request_get_values_mutable () : request_get_values_mutable = { + path = []; + output_format = None; +} + +type request_list_children_mutable = { + mutable path : string list; + mutable output_format : request_output_format option; +} + +let default_request_list_children_mutable () : request_list_children_mutable = { + path = []; + output_format = None; +} + +type request_run_op_mode_mutable = { + mutable path : string list; + mutable output_format : request_output_format option; +} + +let default_request_run_op_mode_mutable () : request_run_op_mode_mutable = { + path = []; + output_format = None; +} + +type request_enter_configuration_mode_mutable = { + mutable exclusive : bool; + mutable override_exclusive : bool; +} + +let default_request_enter_configuration_mode_mutable () : request_enter_configuration_mode_mutable = { + exclusive = false; + override_exclusive = false; +} + +type request_envelope_mutable = { + mutable token : string option; + mutable request : request; +} + +let default_request_envelope_mutable () : request_envelope_mutable = { + token = None; + request = default_request (); +} + +type response_mutable = { + mutable status : status; + mutable output : string option; + mutable error : string option; + mutable warning : string option; +} + +let default_response_mutable () : response_mutable = { + status = default_status (); + output = None; + error = None; + warning = None; +} + +[@@@ocaml.warning "-27-30-39"] + +(** {2 Formatters} *) + +let rec pp_request_config_format fmt (v:request_config_format) = + match v with + | Curly -> Format.fprintf fmt "Curly" + | Json -> Format.fprintf fmt "Json" + +let rec pp_request_output_format fmt (v:request_output_format) = + match v with + | Out_plain -> Format.fprintf fmt "Out_plain" + | Out_json -> Format.fprintf fmt "Out_json" + +let rec pp_request_status fmt (v:request_status) = + let pp_i fmt () = + Pbrt.Pp.pp_unit fmt () + in + Pbrt.Pp.pp_brk pp_i fmt () + +let rec pp_request_setup_session fmt (v:request_setup_session) = + let pp_i fmt () = + Pbrt.Pp.pp_record_field ~first:true "client_application" (Pbrt.Pp.pp_option Pbrt.Pp.pp_string) fmt v.client_application; + Pbrt.Pp.pp_record_field ~first:false "on_behalf_of" (Pbrt.Pp.pp_option Pbrt.Pp.pp_int32) fmt v.on_behalf_of; + in + Pbrt.Pp.pp_brk pp_i fmt () + +let rec pp_request_teardown fmt (v:request_teardown) = + let pp_i fmt () = + Pbrt.Pp.pp_record_field ~first:true "on_behalf_of" (Pbrt.Pp.pp_option Pbrt.Pp.pp_int32) fmt v.on_behalf_of; + in + Pbrt.Pp.pp_brk pp_i fmt () + +let rec pp_request_validate fmt (v:request_validate) = + let pp_i fmt () = + Pbrt.Pp.pp_record_field ~first:true "path" (Pbrt.Pp.pp_list Pbrt.Pp.pp_string) fmt v.path; + Pbrt.Pp.pp_record_field ~first:false "output_format" (Pbrt.Pp.pp_option pp_request_output_format) fmt v.output_format; + in + Pbrt.Pp.pp_brk pp_i fmt () + +let rec pp_request_set fmt (v:request_set) = + let pp_i fmt () = + Pbrt.Pp.pp_record_field ~first:true "path" (Pbrt.Pp.pp_list Pbrt.Pp.pp_string) fmt v.path; + Pbrt.Pp.pp_record_field ~first:false "ephemeral" (Pbrt.Pp.pp_option Pbrt.Pp.pp_bool) fmt v.ephemeral; + in + Pbrt.Pp.pp_brk pp_i fmt () + +let rec pp_request_delete fmt (v:request_delete) = + let pp_i fmt () = + Pbrt.Pp.pp_record_field ~first:true "path" (Pbrt.Pp.pp_list Pbrt.Pp.pp_string) fmt v.path; + in + Pbrt.Pp.pp_brk pp_i fmt () + +let rec pp_request_rename fmt (v:request_rename) = + let pp_i fmt () = + Pbrt.Pp.pp_record_field ~first:true "edit_level" (Pbrt.Pp.pp_list Pbrt.Pp.pp_string) fmt v.edit_level; + Pbrt.Pp.pp_record_field ~first:false "from" Pbrt.Pp.pp_string fmt v.from; + Pbrt.Pp.pp_record_field ~first:false "to_" Pbrt.Pp.pp_string fmt v.to_; + in + Pbrt.Pp.pp_brk pp_i fmt () + +let rec pp_request_copy fmt (v:request_copy) = + let pp_i fmt () = + Pbrt.Pp.pp_record_field ~first:true "edit_level" (Pbrt.Pp.pp_list Pbrt.Pp.pp_string) fmt v.edit_level; + Pbrt.Pp.pp_record_field ~first:false "from" Pbrt.Pp.pp_string fmt v.from; + Pbrt.Pp.pp_record_field ~first:false "to_" Pbrt.Pp.pp_string fmt v.to_; + in + Pbrt.Pp.pp_brk pp_i fmt () + +let rec pp_request_comment fmt (v:request_comment) = + let pp_i fmt () = + Pbrt.Pp.pp_record_field ~first:true "path" (Pbrt.Pp.pp_list Pbrt.Pp.pp_string) fmt v.path; + Pbrt.Pp.pp_record_field ~first:false "comment" Pbrt.Pp.pp_string fmt v.comment; + in + Pbrt.Pp.pp_brk pp_i fmt () + +let rec pp_request_commit fmt (v:request_commit) = + let pp_i fmt () = + Pbrt.Pp.pp_record_field ~first:true "confirm" (Pbrt.Pp.pp_option Pbrt.Pp.pp_bool) fmt v.confirm; + Pbrt.Pp.pp_record_field ~first:false "confirm_timeout" (Pbrt.Pp.pp_option Pbrt.Pp.pp_int32) fmt v.confirm_timeout; + Pbrt.Pp.pp_record_field ~first:false "comment" (Pbrt.Pp.pp_option Pbrt.Pp.pp_string) fmt v.comment; + in + Pbrt.Pp.pp_brk pp_i fmt () + +let rec pp_request_rollback fmt (v:request_rollback) = + let pp_i fmt () = + Pbrt.Pp.pp_record_field ~first:true "revision" Pbrt.Pp.pp_int32 fmt v.revision; + in + Pbrt.Pp.pp_brk pp_i fmt () + +let rec pp_request_load fmt (v:request_load) = + let pp_i fmt () = + Pbrt.Pp.pp_record_field ~first:true "location" Pbrt.Pp.pp_string fmt v.location; + Pbrt.Pp.pp_record_field ~first:false "format" (Pbrt.Pp.pp_option pp_request_config_format) fmt v.format; + in + Pbrt.Pp.pp_brk pp_i fmt () + +let rec pp_request_merge fmt (v:request_merge) = + let pp_i fmt () = + Pbrt.Pp.pp_record_field ~first:true "location" Pbrt.Pp.pp_string fmt v.location; + Pbrt.Pp.pp_record_field ~first:false "format" (Pbrt.Pp.pp_option pp_request_config_format) fmt v.format; + in + Pbrt.Pp.pp_brk pp_i fmt () + +let rec pp_request_save fmt (v:request_save) = + let pp_i fmt () = + Pbrt.Pp.pp_record_field ~first:true "location" Pbrt.Pp.pp_string fmt v.location; + Pbrt.Pp.pp_record_field ~first:false "format" (Pbrt.Pp.pp_option pp_request_config_format) fmt v.format; + in + Pbrt.Pp.pp_brk pp_i fmt () + +let rec pp_request_show_config fmt (v:request_show_config) = + let pp_i fmt () = + Pbrt.Pp.pp_record_field ~first:true "path" (Pbrt.Pp.pp_list Pbrt.Pp.pp_string) fmt v.path; + Pbrt.Pp.pp_record_field ~first:false "format" (Pbrt.Pp.pp_option pp_request_config_format) fmt v.format; + in + Pbrt.Pp.pp_brk pp_i fmt () + +let rec pp_request_exists fmt (v:request_exists) = + let pp_i fmt () = + Pbrt.Pp.pp_record_field ~first:true "path" (Pbrt.Pp.pp_list Pbrt.Pp.pp_string) fmt v.path; + in + Pbrt.Pp.pp_brk pp_i fmt () + +let rec pp_request_get_value fmt (v:request_get_value) = + let pp_i fmt () = + Pbrt.Pp.pp_record_field ~first:true "path" (Pbrt.Pp.pp_list Pbrt.Pp.pp_string) fmt v.path; + Pbrt.Pp.pp_record_field ~first:false "output_format" (Pbrt.Pp.pp_option pp_request_output_format) fmt v.output_format; + in + Pbrt.Pp.pp_brk pp_i fmt () + +let rec pp_request_get_values fmt (v:request_get_values) = + let pp_i fmt () = + Pbrt.Pp.pp_record_field ~first:true "path" (Pbrt.Pp.pp_list Pbrt.Pp.pp_string) fmt v.path; + Pbrt.Pp.pp_record_field ~first:false "output_format" (Pbrt.Pp.pp_option pp_request_output_format) fmt v.output_format; + in + Pbrt.Pp.pp_brk pp_i fmt () + +let rec pp_request_list_children fmt (v:request_list_children) = + let pp_i fmt () = + Pbrt.Pp.pp_record_field ~first:true "path" (Pbrt.Pp.pp_list Pbrt.Pp.pp_string) fmt v.path; + Pbrt.Pp.pp_record_field ~first:false "output_format" (Pbrt.Pp.pp_option pp_request_output_format) fmt v.output_format; + in + Pbrt.Pp.pp_brk pp_i fmt () + +let rec pp_request_run_op_mode fmt (v:request_run_op_mode) = + let pp_i fmt () = + Pbrt.Pp.pp_record_field ~first:true "path" (Pbrt.Pp.pp_list Pbrt.Pp.pp_string) fmt v.path; + Pbrt.Pp.pp_record_field ~first:false "output_format" (Pbrt.Pp.pp_option pp_request_output_format) fmt v.output_format; + in + Pbrt.Pp.pp_brk pp_i fmt () + +let rec pp_request_confirm fmt (v:request_confirm) = + let pp_i fmt () = + Pbrt.Pp.pp_unit fmt () + in + Pbrt.Pp.pp_brk pp_i fmt () + +let rec pp_request_enter_configuration_mode fmt (v:request_enter_configuration_mode) = + let pp_i fmt () = + Pbrt.Pp.pp_record_field ~first:true "exclusive" Pbrt.Pp.pp_bool fmt v.exclusive; + Pbrt.Pp.pp_record_field ~first:false "override_exclusive" Pbrt.Pp.pp_bool fmt v.override_exclusive; + in + Pbrt.Pp.pp_brk pp_i fmt () + +let rec pp_request_exit_configuration_mode fmt (v:request_exit_configuration_mode) = + let pp_i fmt () = + Pbrt.Pp.pp_unit fmt () + in + Pbrt.Pp.pp_brk pp_i fmt () + +let rec pp_request fmt (v:request) = + match v with + | Status -> Format.fprintf fmt "Status" + | Setup_session x -> Format.fprintf fmt "@[<hv2>Setup_session(@,%a)@]" pp_request_setup_session x + | Set x -> Format.fprintf fmt "@[<hv2>Set(@,%a)@]" pp_request_set x + | Delete x -> Format.fprintf fmt "@[<hv2>Delete(@,%a)@]" pp_request_delete x + | Rename x -> Format.fprintf fmt "@[<hv2>Rename(@,%a)@]" pp_request_rename x + | Copy x -> Format.fprintf fmt "@[<hv2>Copy(@,%a)@]" pp_request_copy x + | Comment x -> Format.fprintf fmt "@[<hv2>Comment(@,%a)@]" pp_request_comment x + | Commit x -> Format.fprintf fmt "@[<hv2>Commit(@,%a)@]" pp_request_commit x + | Rollback x -> Format.fprintf fmt "@[<hv2>Rollback(@,%a)@]" pp_request_rollback x + | Merge x -> Format.fprintf fmt "@[<hv2>Merge(@,%a)@]" pp_request_merge x + | Save x -> Format.fprintf fmt "@[<hv2>Save(@,%a)@]" pp_request_save x + | Show_config x -> Format.fprintf fmt "@[<hv2>Show_config(@,%a)@]" pp_request_show_config x + | Exists x -> Format.fprintf fmt "@[<hv2>Exists(@,%a)@]" pp_request_exists x + | Get_value x -> Format.fprintf fmt "@[<hv2>Get_value(@,%a)@]" pp_request_get_value x + | Get_values x -> Format.fprintf fmt "@[<hv2>Get_values(@,%a)@]" pp_request_get_values x + | List_children x -> Format.fprintf fmt "@[<hv2>List_children(@,%a)@]" pp_request_list_children x + | Run_op_mode x -> Format.fprintf fmt "@[<hv2>Run_op_mode(@,%a)@]" pp_request_run_op_mode x + | Confirm -> Format.fprintf fmt "Confirm" + | Configure x -> Format.fprintf fmt "@[<hv2>Configure(@,%a)@]" pp_request_enter_configuration_mode x + | Exit_configure -> Format.fprintf fmt "Exit_configure" + | Validate x -> Format.fprintf fmt "@[<hv2>Validate(@,%a)@]" pp_request_validate x + | Teardown x -> Format.fprintf fmt "@[<hv2>Teardown(@,%a)@]" pp_request_teardown x + +let rec pp_request_envelope fmt (v:request_envelope) = + let pp_i fmt () = + Pbrt.Pp.pp_record_field ~first:true "token" (Pbrt.Pp.pp_option Pbrt.Pp.pp_string) fmt v.token; + Pbrt.Pp.pp_record_field ~first:false "request" pp_request fmt v.request; + in + Pbrt.Pp.pp_brk pp_i fmt () + +let rec pp_status fmt (v:status) = + match v with + | Success -> Format.fprintf fmt "Success" + | Fail -> Format.fprintf fmt "Fail" + | Invalid_path -> Format.fprintf fmt "Invalid_path" + | Invalid_value -> Format.fprintf fmt "Invalid_value" + | Commit_in_progress -> Format.fprintf fmt "Commit_in_progress" + | Configuration_locked -> Format.fprintf fmt "Configuration_locked" + | Internal_error -> Format.fprintf fmt "Internal_error" + | Permission_denied -> Format.fprintf fmt "Permission_denied" + | Path_already_exists -> Format.fprintf fmt "Path_already_exists" + +let rec pp_response fmt (v:response) = + let pp_i fmt () = + Pbrt.Pp.pp_record_field ~first:true "status" pp_status fmt v.status; + Pbrt.Pp.pp_record_field ~first:false "output" (Pbrt.Pp.pp_option Pbrt.Pp.pp_string) fmt v.output; + Pbrt.Pp.pp_record_field ~first:false "error" (Pbrt.Pp.pp_option Pbrt.Pp.pp_string) fmt v.error; + Pbrt.Pp.pp_record_field ~first:false "warning" (Pbrt.Pp.pp_option Pbrt.Pp.pp_string) fmt v.warning; + in + Pbrt.Pp.pp_brk pp_i fmt () + +[@@@ocaml.warning "-27-30-39"] + +(** {2 Protobuf Encoding} *) + +let rec encode_pb_request_config_format (v:request_config_format) encoder = + match v with + | Curly -> Pbrt.Encoder.int_as_varint (0) encoder + | Json -> Pbrt.Encoder.int_as_varint 1 encoder + +let rec encode_pb_request_output_format (v:request_output_format) encoder = + match v with + | Out_plain -> Pbrt.Encoder.int_as_varint (0) encoder + | Out_json -> Pbrt.Encoder.int_as_varint 1 encoder + +let rec encode_pb_request_status (v:request_status) encoder = +() + +let rec encode_pb_request_setup_session (v:request_setup_session) encoder = + begin match v.client_application with + | Some x -> + Pbrt.Encoder.string x encoder; + Pbrt.Encoder.key 1 Pbrt.Bytes encoder; + | None -> (); + end; + begin match v.on_behalf_of with + | Some x -> + Pbrt.Encoder.int32_as_varint x encoder; + Pbrt.Encoder.key 2 Pbrt.Varint encoder; + | None -> (); + end; + () + +let rec encode_pb_request_teardown (v:request_teardown) encoder = + begin match v.on_behalf_of with + | Some x -> + Pbrt.Encoder.int32_as_varint x encoder; + Pbrt.Encoder.key 1 Pbrt.Varint encoder; + | None -> (); + end; + () + +let rec encode_pb_request_validate (v:request_validate) encoder = + Pbrt.List_util.rev_iter_with (fun x encoder -> + Pbrt.Encoder.string x encoder; + Pbrt.Encoder.key 1 Pbrt.Bytes encoder; + ) v.path encoder; + begin match v.output_format with + | Some x -> + encode_pb_request_output_format x encoder; + Pbrt.Encoder.key 2 Pbrt.Varint encoder; + | None -> (); + end; + () + +let rec encode_pb_request_set (v:request_set) encoder = + Pbrt.List_util.rev_iter_with (fun x encoder -> + Pbrt.Encoder.string x encoder; + Pbrt.Encoder.key 1 Pbrt.Bytes encoder; + ) v.path encoder; + begin match v.ephemeral with + | Some x -> + Pbrt.Encoder.bool x encoder; + Pbrt.Encoder.key 3 Pbrt.Varint encoder; + | None -> (); + end; + () + +let rec encode_pb_request_delete (v:request_delete) encoder = + Pbrt.List_util.rev_iter_with (fun x encoder -> + Pbrt.Encoder.string x encoder; + Pbrt.Encoder.key 1 Pbrt.Bytes encoder; + ) v.path encoder; + () + +let rec encode_pb_request_rename (v:request_rename) encoder = + Pbrt.List_util.rev_iter_with (fun x encoder -> + Pbrt.Encoder.string x encoder; + Pbrt.Encoder.key 1 Pbrt.Bytes encoder; + ) v.edit_level encoder; + Pbrt.Encoder.string v.from encoder; + Pbrt.Encoder.key 2 Pbrt.Bytes encoder; + Pbrt.Encoder.string v.to_ encoder; + Pbrt.Encoder.key 3 Pbrt.Bytes encoder; + () + +let rec encode_pb_request_copy (v:request_copy) encoder = + Pbrt.List_util.rev_iter_with (fun x encoder -> + Pbrt.Encoder.string x encoder; + Pbrt.Encoder.key 1 Pbrt.Bytes encoder; + ) v.edit_level encoder; + Pbrt.Encoder.string v.from encoder; + Pbrt.Encoder.key 2 Pbrt.Bytes encoder; + Pbrt.Encoder.string v.to_ encoder; + Pbrt.Encoder.key 3 Pbrt.Bytes encoder; + () + +let rec encode_pb_request_comment (v:request_comment) encoder = + Pbrt.List_util.rev_iter_with (fun x encoder -> + Pbrt.Encoder.string x encoder; + Pbrt.Encoder.key 1 Pbrt.Bytes encoder; + ) v.path encoder; + Pbrt.Encoder.string v.comment encoder; + Pbrt.Encoder.key 2 Pbrt.Bytes encoder; + () + +let rec encode_pb_request_commit (v:request_commit) encoder = + begin match v.confirm with + | Some x -> + Pbrt.Encoder.bool x encoder; + Pbrt.Encoder.key 1 Pbrt.Varint encoder; + | None -> (); + end; + begin match v.confirm_timeout with + | Some x -> + Pbrt.Encoder.int32_as_varint x encoder; + Pbrt.Encoder.key 2 Pbrt.Varint encoder; + | None -> (); + end; + begin match v.comment with + | Some x -> + Pbrt.Encoder.string x encoder; + Pbrt.Encoder.key 3 Pbrt.Bytes encoder; + | None -> (); + end; + () + +let rec encode_pb_request_rollback (v:request_rollback) encoder = + Pbrt.Encoder.int32_as_varint v.revision encoder; + Pbrt.Encoder.key 1 Pbrt.Varint encoder; + () + +let rec encode_pb_request_load (v:request_load) encoder = + Pbrt.Encoder.string v.location encoder; + Pbrt.Encoder.key 1 Pbrt.Bytes encoder; + begin match v.format with + | Some x -> + encode_pb_request_config_format x encoder; + Pbrt.Encoder.key 2 Pbrt.Varint encoder; + | None -> (); + end; + () + +let rec encode_pb_request_merge (v:request_merge) encoder = + Pbrt.Encoder.string v.location encoder; + Pbrt.Encoder.key 1 Pbrt.Bytes encoder; + begin match v.format with + | Some x -> + encode_pb_request_config_format x encoder; + Pbrt.Encoder.key 2 Pbrt.Varint encoder; + | None -> (); + end; + () + +let rec encode_pb_request_save (v:request_save) encoder = + Pbrt.Encoder.string v.location encoder; + Pbrt.Encoder.key 1 Pbrt.Bytes encoder; + begin match v.format with + | Some x -> + encode_pb_request_config_format x encoder; + Pbrt.Encoder.key 2 Pbrt.Varint encoder; + | None -> (); + end; + () + +let rec encode_pb_request_show_config (v:request_show_config) encoder = + Pbrt.List_util.rev_iter_with (fun x encoder -> + Pbrt.Encoder.string x encoder; + Pbrt.Encoder.key 1 Pbrt.Bytes encoder; + ) v.path encoder; + begin match v.format with + | Some x -> + encode_pb_request_config_format x encoder; + Pbrt.Encoder.key 2 Pbrt.Varint encoder; + | None -> (); + end; + () + +let rec encode_pb_request_exists (v:request_exists) encoder = + Pbrt.List_util.rev_iter_with (fun x encoder -> + Pbrt.Encoder.string x encoder; + Pbrt.Encoder.key 1 Pbrt.Bytes encoder; + ) v.path encoder; + () + +let rec encode_pb_request_get_value (v:request_get_value) encoder = + Pbrt.List_util.rev_iter_with (fun x encoder -> + Pbrt.Encoder.string x encoder; + Pbrt.Encoder.key 1 Pbrt.Bytes encoder; + ) v.path encoder; + begin match v.output_format with + | Some x -> + encode_pb_request_output_format x encoder; + Pbrt.Encoder.key 2 Pbrt.Varint encoder; + | None -> (); + end; + () + +let rec encode_pb_request_get_values (v:request_get_values) encoder = + Pbrt.List_util.rev_iter_with (fun x encoder -> + Pbrt.Encoder.string x encoder; + Pbrt.Encoder.key 1 Pbrt.Bytes encoder; + ) v.path encoder; + begin match v.output_format with + | Some x -> + encode_pb_request_output_format x encoder; + Pbrt.Encoder.key 2 Pbrt.Varint encoder; + | None -> (); + end; + () + +let rec encode_pb_request_list_children (v:request_list_children) encoder = + Pbrt.List_util.rev_iter_with (fun x encoder -> + Pbrt.Encoder.string x encoder; + Pbrt.Encoder.key 1 Pbrt.Bytes encoder; + ) v.path encoder; + begin match v.output_format with + | Some x -> + encode_pb_request_output_format x encoder; + Pbrt.Encoder.key 2 Pbrt.Varint encoder; + | None -> (); + end; + () + +let rec encode_pb_request_run_op_mode (v:request_run_op_mode) encoder = + Pbrt.List_util.rev_iter_with (fun x encoder -> + Pbrt.Encoder.string x encoder; + Pbrt.Encoder.key 1 Pbrt.Bytes encoder; + ) v.path encoder; + begin match v.output_format with + | Some x -> + encode_pb_request_output_format x encoder; + Pbrt.Encoder.key 2 Pbrt.Varint encoder; + | None -> (); + end; + () + +let rec encode_pb_request_confirm (v:request_confirm) encoder = +() + +let rec encode_pb_request_enter_configuration_mode (v:request_enter_configuration_mode) encoder = + Pbrt.Encoder.bool v.exclusive encoder; + Pbrt.Encoder.key 1 Pbrt.Varint encoder; + Pbrt.Encoder.bool v.override_exclusive encoder; + Pbrt.Encoder.key 2 Pbrt.Varint encoder; + () + +let rec encode_pb_request_exit_configuration_mode (v:request_exit_configuration_mode) encoder = +() + +let rec encode_pb_request (v:request) encoder = + begin match v with + | Status -> + Pbrt.Encoder.key 1 Pbrt.Bytes encoder; + Pbrt.Encoder.empty_nested encoder + | Setup_session x -> + Pbrt.Encoder.nested encode_pb_request_setup_session x encoder; + Pbrt.Encoder.key 2 Pbrt.Bytes encoder; + | Set x -> + Pbrt.Encoder.nested encode_pb_request_set x encoder; + Pbrt.Encoder.key 3 Pbrt.Bytes encoder; + | Delete x -> + Pbrt.Encoder.nested encode_pb_request_delete x encoder; + Pbrt.Encoder.key 4 Pbrt.Bytes encoder; + | Rename x -> + Pbrt.Encoder.nested encode_pb_request_rename x encoder; + Pbrt.Encoder.key 5 Pbrt.Bytes encoder; + | Copy x -> + Pbrt.Encoder.nested encode_pb_request_copy x encoder; + Pbrt.Encoder.key 6 Pbrt.Bytes encoder; + | Comment x -> + Pbrt.Encoder.nested encode_pb_request_comment x encoder; + Pbrt.Encoder.key 7 Pbrt.Bytes encoder; + | Commit x -> + Pbrt.Encoder.nested encode_pb_request_commit x encoder; + Pbrt.Encoder.key 8 Pbrt.Bytes encoder; + | Rollback x -> + Pbrt.Encoder.nested encode_pb_request_rollback x encoder; + Pbrt.Encoder.key 9 Pbrt.Bytes encoder; + | Merge x -> + Pbrt.Encoder.nested encode_pb_request_merge x encoder; + Pbrt.Encoder.key 10 Pbrt.Bytes encoder; + | Save x -> + Pbrt.Encoder.nested encode_pb_request_save x encoder; + Pbrt.Encoder.key 11 Pbrt.Bytes encoder; + | Show_config x -> + Pbrt.Encoder.nested encode_pb_request_show_config x encoder; + Pbrt.Encoder.key 12 Pbrt.Bytes encoder; + | Exists x -> + Pbrt.Encoder.nested encode_pb_request_exists x encoder; + Pbrt.Encoder.key 13 Pbrt.Bytes encoder; + | Get_value x -> + Pbrt.Encoder.nested encode_pb_request_get_value x encoder; + Pbrt.Encoder.key 14 Pbrt.Bytes encoder; + | Get_values x -> + Pbrt.Encoder.nested encode_pb_request_get_values x encoder; + Pbrt.Encoder.key 15 Pbrt.Bytes encoder; + | List_children x -> + Pbrt.Encoder.nested encode_pb_request_list_children x encoder; + Pbrt.Encoder.key 16 Pbrt.Bytes encoder; + | Run_op_mode x -> + Pbrt.Encoder.nested encode_pb_request_run_op_mode x encoder; + Pbrt.Encoder.key 17 Pbrt.Bytes encoder; + | Confirm -> + Pbrt.Encoder.key 18 Pbrt.Bytes encoder; + Pbrt.Encoder.empty_nested encoder + | Configure x -> + Pbrt.Encoder.nested encode_pb_request_enter_configuration_mode x encoder; + Pbrt.Encoder.key 19 Pbrt.Bytes encoder; + | Exit_configure -> + Pbrt.Encoder.key 20 Pbrt.Bytes encoder; + Pbrt.Encoder.empty_nested encoder + | Validate x -> + Pbrt.Encoder.nested encode_pb_request_validate x encoder; + Pbrt.Encoder.key 21 Pbrt.Bytes encoder; + | Teardown x -> + Pbrt.Encoder.nested encode_pb_request_teardown x encoder; + Pbrt.Encoder.key 22 Pbrt.Bytes encoder; + end + +let rec encode_pb_request_envelope (v:request_envelope) encoder = + begin match v.token with + | Some x -> + Pbrt.Encoder.string x encoder; + Pbrt.Encoder.key 1 Pbrt.Bytes encoder; + | None -> (); + end; + Pbrt.Encoder.nested encode_pb_request v.request encoder; + Pbrt.Encoder.key 2 Pbrt.Bytes encoder; + () + +let rec encode_pb_status (v:status) encoder = + match v with + | Success -> Pbrt.Encoder.int_as_varint (0) encoder + | Fail -> Pbrt.Encoder.int_as_varint 1 encoder + | Invalid_path -> Pbrt.Encoder.int_as_varint 2 encoder + | Invalid_value -> Pbrt.Encoder.int_as_varint 3 encoder + | Commit_in_progress -> Pbrt.Encoder.int_as_varint 4 encoder + | Configuration_locked -> Pbrt.Encoder.int_as_varint 5 encoder + | Internal_error -> Pbrt.Encoder.int_as_varint 6 encoder + | Permission_denied -> Pbrt.Encoder.int_as_varint 7 encoder + | Path_already_exists -> Pbrt.Encoder.int_as_varint 8 encoder + +let rec encode_pb_response (v:response) encoder = + encode_pb_status v.status encoder; + Pbrt.Encoder.key 1 Pbrt.Varint encoder; + begin match v.output with + | Some x -> + Pbrt.Encoder.string x encoder; + Pbrt.Encoder.key 2 Pbrt.Bytes encoder; + | None -> (); + end; + begin match v.error with + | Some x -> + Pbrt.Encoder.string x encoder; + Pbrt.Encoder.key 3 Pbrt.Bytes encoder; + | None -> (); + end; + begin match v.warning with + | Some x -> + Pbrt.Encoder.string x encoder; + Pbrt.Encoder.key 4 Pbrt.Bytes encoder; + | None -> (); + end; + () + +[@@@ocaml.warning "-27-30-39"] + +(** {2 Protobuf Decoding} *) + +let rec decode_pb_request_config_format d = + match Pbrt.Decoder.int_as_varint d with + | 0 -> (Curly:request_config_format) + | 1 -> (Json:request_config_format) + | _ -> Pbrt.Decoder.malformed_variant "request_config_format" + +let rec decode_pb_request_output_format d = + match Pbrt.Decoder.int_as_varint d with + | 0 -> (Out_plain:request_output_format) + | 1 -> (Out_json:request_output_format) + | _ -> Pbrt.Decoder.malformed_variant "request_output_format" + +let rec decode_pb_request_status d = + match Pbrt.Decoder.key d with + | None -> (); + | Some (_, pk) -> + Pbrt.Decoder.unexpected_payload "Unexpected fields in empty message(request_status)" pk + +let rec decode_pb_request_setup_session d = + let v = default_request_setup_session_mutable () in + let continue__= ref true in + while !continue__ do + match Pbrt.Decoder.key d with + | None -> ( + ); continue__ := false + | Some (1, Pbrt.Bytes) -> begin + v.client_application <- Some (Pbrt.Decoder.string d); + end + | Some (1, pk) -> + Pbrt.Decoder.unexpected_payload "Message(request_setup_session), field(1)" pk + | Some (2, Pbrt.Varint) -> begin + v.on_behalf_of <- Some (Pbrt.Decoder.int32_as_varint d); + end + | Some (2, pk) -> + Pbrt.Decoder.unexpected_payload "Message(request_setup_session), field(2)" pk + | Some (_, payload_kind) -> Pbrt.Decoder.skip d payload_kind + done; + ({ + client_application = v.client_application; + on_behalf_of = v.on_behalf_of; + } : request_setup_session) + +let rec decode_pb_request_teardown d = + let v = default_request_teardown_mutable () in + let continue__= ref true in + while !continue__ do + match Pbrt.Decoder.key d with + | None -> ( + ); continue__ := false + | Some (1, Pbrt.Varint) -> begin + v.on_behalf_of <- Some (Pbrt.Decoder.int32_as_varint d); + end + | Some (1, pk) -> + Pbrt.Decoder.unexpected_payload "Message(request_teardown), field(1)" pk + | Some (_, payload_kind) -> Pbrt.Decoder.skip d payload_kind + done; + ({ + on_behalf_of = v.on_behalf_of; + } : request_teardown) + +let rec decode_pb_request_validate d = + let v = default_request_validate_mutable () in + let continue__= ref true in + while !continue__ do + match Pbrt.Decoder.key d with + | None -> ( + v.path <- List.rev v.path; + ); continue__ := false + | Some (1, Pbrt.Bytes) -> begin + v.path <- (Pbrt.Decoder.string d) :: v.path; + end + | Some (1, pk) -> + Pbrt.Decoder.unexpected_payload "Message(request_validate), field(1)" pk + | Some (2, Pbrt.Varint) -> begin + v.output_format <- Some (decode_pb_request_output_format d); + end + | Some (2, pk) -> + Pbrt.Decoder.unexpected_payload "Message(request_validate), field(2)" pk + | Some (_, payload_kind) -> Pbrt.Decoder.skip d payload_kind + done; + ({ + path = v.path; + output_format = v.output_format; + } : request_validate) + +let rec decode_pb_request_set d = + let v = default_request_set_mutable () in + let continue__= ref true in + while !continue__ do + match Pbrt.Decoder.key d with + | None -> ( + v.path <- List.rev v.path; + ); continue__ := false + | Some (1, Pbrt.Bytes) -> begin + v.path <- (Pbrt.Decoder.string d) :: v.path; + end + | Some (1, pk) -> + Pbrt.Decoder.unexpected_payload "Message(request_set), field(1)" pk + | Some (3, Pbrt.Varint) -> begin + v.ephemeral <- Some (Pbrt.Decoder.bool d); + end + | Some (3, pk) -> + Pbrt.Decoder.unexpected_payload "Message(request_set), field(3)" pk + | Some (_, payload_kind) -> Pbrt.Decoder.skip d payload_kind + done; + ({ + path = v.path; + ephemeral = v.ephemeral; + } : request_set) + +let rec decode_pb_request_delete d = + let v = default_request_delete_mutable () in + let continue__= ref true in + while !continue__ do + match Pbrt.Decoder.key d with + | None -> ( + v.path <- List.rev v.path; + ); continue__ := false + | Some (1, Pbrt.Bytes) -> begin + v.path <- (Pbrt.Decoder.string d) :: v.path; + end + | Some (1, pk) -> + Pbrt.Decoder.unexpected_payload "Message(request_delete), field(1)" pk + | Some (_, payload_kind) -> Pbrt.Decoder.skip d payload_kind + done; + ({ + path = v.path; + } : request_delete) + +let rec decode_pb_request_rename d = + let v = default_request_rename_mutable () in + let continue__= ref true in + let to__is_set = ref false in + let from_is_set = ref false in + while !continue__ do + match Pbrt.Decoder.key d with + | None -> ( + v.edit_level <- List.rev v.edit_level; + ); continue__ := false + | Some (1, Pbrt.Bytes) -> begin + v.edit_level <- (Pbrt.Decoder.string d) :: v.edit_level; + end + | Some (1, pk) -> + Pbrt.Decoder.unexpected_payload "Message(request_rename), field(1)" pk + | Some (2, Pbrt.Bytes) -> begin + v.from <- Pbrt.Decoder.string d; from_is_set := true; + end + | Some (2, pk) -> + Pbrt.Decoder.unexpected_payload "Message(request_rename), field(2)" pk + | Some (3, Pbrt.Bytes) -> begin + v.to_ <- Pbrt.Decoder.string d; to__is_set := true; + end + | Some (3, pk) -> + Pbrt.Decoder.unexpected_payload "Message(request_rename), field(3)" pk + | Some (_, payload_kind) -> Pbrt.Decoder.skip d payload_kind + done; + begin if not !to__is_set then Pbrt.Decoder.missing_field "to_" end; + begin if not !from_is_set then Pbrt.Decoder.missing_field "from" end; + ({ + edit_level = v.edit_level; + from = v.from; + to_ = v.to_; + } : request_rename) + +let rec decode_pb_request_copy d = + let v = default_request_copy_mutable () in + let continue__= ref true in + let to__is_set = ref false in + let from_is_set = ref false in + while !continue__ do + match Pbrt.Decoder.key d with + | None -> ( + v.edit_level <- List.rev v.edit_level; + ); continue__ := false + | Some (1, Pbrt.Bytes) -> begin + v.edit_level <- (Pbrt.Decoder.string d) :: v.edit_level; + end + | Some (1, pk) -> + Pbrt.Decoder.unexpected_payload "Message(request_copy), field(1)" pk + | Some (2, Pbrt.Bytes) -> begin + v.from <- Pbrt.Decoder.string d; from_is_set := true; + end + | Some (2, pk) -> + Pbrt.Decoder.unexpected_payload "Message(request_copy), field(2)" pk + | Some (3, Pbrt.Bytes) -> begin + v.to_ <- Pbrt.Decoder.string d; to__is_set := true; + end + | Some (3, pk) -> + Pbrt.Decoder.unexpected_payload "Message(request_copy), field(3)" pk + | Some (_, payload_kind) -> Pbrt.Decoder.skip d payload_kind + done; + begin if not !to__is_set then Pbrt.Decoder.missing_field "to_" end; + begin if not !from_is_set then Pbrt.Decoder.missing_field "from" end; + ({ + edit_level = v.edit_level; + from = v.from; + to_ = v.to_; + } : request_copy) + +let rec decode_pb_request_comment d = + let v = default_request_comment_mutable () in + let continue__= ref true in + let comment_is_set = ref false in + while !continue__ do + match Pbrt.Decoder.key d with + | None -> ( + v.path <- List.rev v.path; + ); continue__ := false + | Some (1, Pbrt.Bytes) -> begin + v.path <- (Pbrt.Decoder.string d) :: v.path; + end + | Some (1, pk) -> + Pbrt.Decoder.unexpected_payload "Message(request_comment), field(1)" pk + | Some (2, Pbrt.Bytes) -> begin + v.comment <- Pbrt.Decoder.string d; comment_is_set := true; + end + | Some (2, pk) -> + Pbrt.Decoder.unexpected_payload "Message(request_comment), field(2)" pk + | Some (_, payload_kind) -> Pbrt.Decoder.skip d payload_kind + done; + begin if not !comment_is_set then Pbrt.Decoder.missing_field "comment" end; + ({ + path = v.path; + comment = v.comment; + } : request_comment) + +let rec decode_pb_request_commit d = + let v = default_request_commit_mutable () in + let continue__= ref true in + while !continue__ do + match Pbrt.Decoder.key d with + | None -> ( + ); continue__ := false + | Some (1, Pbrt.Varint) -> begin + v.confirm <- Some (Pbrt.Decoder.bool d); + end + | Some (1, pk) -> + Pbrt.Decoder.unexpected_payload "Message(request_commit), field(1)" pk + | Some (2, Pbrt.Varint) -> begin + v.confirm_timeout <- Some (Pbrt.Decoder.int32_as_varint d); + end + | Some (2, pk) -> + Pbrt.Decoder.unexpected_payload "Message(request_commit), field(2)" pk + | Some (3, Pbrt.Bytes) -> begin + v.comment <- Some (Pbrt.Decoder.string d); + end + | Some (3, pk) -> + Pbrt.Decoder.unexpected_payload "Message(request_commit), field(3)" pk + | Some (_, payload_kind) -> Pbrt.Decoder.skip d payload_kind + done; + ({ + confirm = v.confirm; + confirm_timeout = v.confirm_timeout; + comment = v.comment; + } : request_commit) + +let rec decode_pb_request_rollback d = + let v = default_request_rollback_mutable () in + let continue__= ref true in + let revision_is_set = ref false in + while !continue__ do + match Pbrt.Decoder.key d with + | None -> ( + ); continue__ := false + | Some (1, Pbrt.Varint) -> begin + v.revision <- Pbrt.Decoder.int32_as_varint d; revision_is_set := true; + end + | Some (1, pk) -> + Pbrt.Decoder.unexpected_payload "Message(request_rollback), field(1)" pk + | Some (_, payload_kind) -> Pbrt.Decoder.skip d payload_kind + done; + begin if not !revision_is_set then Pbrt.Decoder.missing_field "revision" end; + ({ + revision = v.revision; + } : request_rollback) + +let rec decode_pb_request_load d = + let v = default_request_load_mutable () in + let continue__= ref true in + let location_is_set = ref false in + while !continue__ do + match Pbrt.Decoder.key d with + | None -> ( + ); continue__ := false + | Some (1, Pbrt.Bytes) -> begin + v.location <- Pbrt.Decoder.string d; location_is_set := true; + end + | Some (1, pk) -> + Pbrt.Decoder.unexpected_payload "Message(request_load), field(1)" pk + | Some (2, Pbrt.Varint) -> begin + v.format <- Some (decode_pb_request_config_format d); + end + | Some (2, pk) -> + Pbrt.Decoder.unexpected_payload "Message(request_load), field(2)" pk + | Some (_, payload_kind) -> Pbrt.Decoder.skip d payload_kind + done; + begin if not !location_is_set then Pbrt.Decoder.missing_field "location" end; + ({ + location = v.location; + format = v.format; + } : request_load) + +let rec decode_pb_request_merge d = + let v = default_request_merge_mutable () in + let continue__= ref true in + let location_is_set = ref false in + while !continue__ do + match Pbrt.Decoder.key d with + | None -> ( + ); continue__ := false + | Some (1, Pbrt.Bytes) -> begin + v.location <- Pbrt.Decoder.string d; location_is_set := true; + end + | Some (1, pk) -> + Pbrt.Decoder.unexpected_payload "Message(request_merge), field(1)" pk + | Some (2, Pbrt.Varint) -> begin + v.format <- Some (decode_pb_request_config_format d); + end + | Some (2, pk) -> + Pbrt.Decoder.unexpected_payload "Message(request_merge), field(2)" pk + | Some (_, payload_kind) -> Pbrt.Decoder.skip d payload_kind + done; + begin if not !location_is_set then Pbrt.Decoder.missing_field "location" end; + ({ + location = v.location; + format = v.format; + } : request_merge) + +let rec decode_pb_request_save d = + let v = default_request_save_mutable () in + let continue__= ref true in + let location_is_set = ref false in + while !continue__ do + match Pbrt.Decoder.key d with + | None -> ( + ); continue__ := false + | Some (1, Pbrt.Bytes) -> begin + v.location <- Pbrt.Decoder.string d; location_is_set := true; + end + | Some (1, pk) -> + Pbrt.Decoder.unexpected_payload "Message(request_save), field(1)" pk + | Some (2, Pbrt.Varint) -> begin + v.format <- Some (decode_pb_request_config_format d); + end + | Some (2, pk) -> + Pbrt.Decoder.unexpected_payload "Message(request_save), field(2)" pk + | Some (_, payload_kind) -> Pbrt.Decoder.skip d payload_kind + done; + begin if not !location_is_set then Pbrt.Decoder.missing_field "location" end; + ({ + location = v.location; + format = v.format; + } : request_save) + +let rec decode_pb_request_show_config d = + let v = default_request_show_config_mutable () in + let continue__= ref true in + while !continue__ do + match Pbrt.Decoder.key d with + | None -> ( + v.path <- List.rev v.path; + ); continue__ := false + | Some (1, Pbrt.Bytes) -> begin + v.path <- (Pbrt.Decoder.string d) :: v.path; + end + | Some (1, pk) -> + Pbrt.Decoder.unexpected_payload "Message(request_show_config), field(1)" pk + | Some (2, Pbrt.Varint) -> begin + v.format <- Some (decode_pb_request_config_format d); + end + | Some (2, pk) -> + Pbrt.Decoder.unexpected_payload "Message(request_show_config), field(2)" pk + | Some (_, payload_kind) -> Pbrt.Decoder.skip d payload_kind + done; + ({ + path = v.path; + format = v.format; + } : request_show_config) + +let rec decode_pb_request_exists d = + let v = default_request_exists_mutable () in + let continue__= ref true in + while !continue__ do + match Pbrt.Decoder.key d with + | None -> ( + v.path <- List.rev v.path; + ); continue__ := false + | Some (1, Pbrt.Bytes) -> begin + v.path <- (Pbrt.Decoder.string d) :: v.path; + end + | Some (1, pk) -> + Pbrt.Decoder.unexpected_payload "Message(request_exists), field(1)" pk + | Some (_, payload_kind) -> Pbrt.Decoder.skip d payload_kind + done; + ({ + path = v.path; + } : request_exists) + +let rec decode_pb_request_get_value d = + let v = default_request_get_value_mutable () in + let continue__= ref true in + while !continue__ do + match Pbrt.Decoder.key d with + | None -> ( + v.path <- List.rev v.path; + ); continue__ := false + | Some (1, Pbrt.Bytes) -> begin + v.path <- (Pbrt.Decoder.string d) :: v.path; + end + | Some (1, pk) -> + Pbrt.Decoder.unexpected_payload "Message(request_get_value), field(1)" pk + | Some (2, Pbrt.Varint) -> begin + v.output_format <- Some (decode_pb_request_output_format d); + end + | Some (2, pk) -> + Pbrt.Decoder.unexpected_payload "Message(request_get_value), field(2)" pk + | Some (_, payload_kind) -> Pbrt.Decoder.skip d payload_kind + done; + ({ + path = v.path; + output_format = v.output_format; + } : request_get_value) + +let rec decode_pb_request_get_values d = + let v = default_request_get_values_mutable () in + let continue__= ref true in + while !continue__ do + match Pbrt.Decoder.key d with + | None -> ( + v.path <- List.rev v.path; + ); continue__ := false + | Some (1, Pbrt.Bytes) -> begin + v.path <- (Pbrt.Decoder.string d) :: v.path; + end + | Some (1, pk) -> + Pbrt.Decoder.unexpected_payload "Message(request_get_values), field(1)" pk + | Some (2, Pbrt.Varint) -> begin + v.output_format <- Some (decode_pb_request_output_format d); + end + | Some (2, pk) -> + Pbrt.Decoder.unexpected_payload "Message(request_get_values), field(2)" pk + | Some (_, payload_kind) -> Pbrt.Decoder.skip d payload_kind + done; + ({ + path = v.path; + output_format = v.output_format; + } : request_get_values) + +let rec decode_pb_request_list_children d = + let v = default_request_list_children_mutable () in + let continue__= ref true in + while !continue__ do + match Pbrt.Decoder.key d with + | None -> ( + v.path <- List.rev v.path; + ); continue__ := false + | Some (1, Pbrt.Bytes) -> begin + v.path <- (Pbrt.Decoder.string d) :: v.path; + end + | Some (1, pk) -> + Pbrt.Decoder.unexpected_payload "Message(request_list_children), field(1)" pk + | Some (2, Pbrt.Varint) -> begin + v.output_format <- Some (decode_pb_request_output_format d); + end + | Some (2, pk) -> + Pbrt.Decoder.unexpected_payload "Message(request_list_children), field(2)" pk + | Some (_, payload_kind) -> Pbrt.Decoder.skip d payload_kind + done; + ({ + path = v.path; + output_format = v.output_format; + } : request_list_children) + +let rec decode_pb_request_run_op_mode d = + let v = default_request_run_op_mode_mutable () in + let continue__= ref true in + while !continue__ do + match Pbrt.Decoder.key d with + | None -> ( + v.path <- List.rev v.path; + ); continue__ := false + | Some (1, Pbrt.Bytes) -> begin + v.path <- (Pbrt.Decoder.string d) :: v.path; + end + | Some (1, pk) -> + Pbrt.Decoder.unexpected_payload "Message(request_run_op_mode), field(1)" pk + | Some (2, Pbrt.Varint) -> begin + v.output_format <- Some (decode_pb_request_output_format d); + end + | Some (2, pk) -> + Pbrt.Decoder.unexpected_payload "Message(request_run_op_mode), field(2)" pk + | Some (_, payload_kind) -> Pbrt.Decoder.skip d payload_kind + done; + ({ + path = v.path; + output_format = v.output_format; + } : request_run_op_mode) + +let rec decode_pb_request_confirm d = + match Pbrt.Decoder.key d with + | None -> (); + | Some (_, pk) -> + Pbrt.Decoder.unexpected_payload "Unexpected fields in empty message(request_confirm)" pk + +let rec decode_pb_request_enter_configuration_mode d = + let v = default_request_enter_configuration_mode_mutable () in + let continue__= ref true in + let override_exclusive_is_set = ref false in + let exclusive_is_set = ref false in + while !continue__ do + match Pbrt.Decoder.key d with + | None -> ( + ); continue__ := false + | Some (1, Pbrt.Varint) -> begin + v.exclusive <- Pbrt.Decoder.bool d; exclusive_is_set := true; + end + | Some (1, pk) -> + Pbrt.Decoder.unexpected_payload "Message(request_enter_configuration_mode), field(1)" pk + | Some (2, Pbrt.Varint) -> begin + v.override_exclusive <- Pbrt.Decoder.bool d; override_exclusive_is_set := true; + end + | Some (2, pk) -> + Pbrt.Decoder.unexpected_payload "Message(request_enter_configuration_mode), field(2)" pk + | Some (_, payload_kind) -> Pbrt.Decoder.skip d payload_kind + done; + begin if not !override_exclusive_is_set then Pbrt.Decoder.missing_field "override_exclusive" end; + begin if not !exclusive_is_set then Pbrt.Decoder.missing_field "exclusive" end; + ({ + exclusive = v.exclusive; + override_exclusive = v.override_exclusive; + } : request_enter_configuration_mode) + +let rec decode_pb_request_exit_configuration_mode d = + match Pbrt.Decoder.key d with + | None -> (); + | Some (_, pk) -> + Pbrt.Decoder.unexpected_payload "Unexpected fields in empty message(request_exit_configuration_mode)" pk + +let rec decode_pb_request d = + let rec loop () = + let ret:request = match Pbrt.Decoder.key d with + | None -> Pbrt.Decoder.malformed_variant "request" + | Some (1, _) -> begin + Pbrt.Decoder.empty_nested d ; + (Status : request) + end + | Some (2, _) -> (Setup_session (decode_pb_request_setup_session (Pbrt.Decoder.nested d)) : request) + | Some (3, _) -> (Set (decode_pb_request_set (Pbrt.Decoder.nested d)) : request) + | Some (4, _) -> (Delete (decode_pb_request_delete (Pbrt.Decoder.nested d)) : request) + | Some (5, _) -> (Rename (decode_pb_request_rename (Pbrt.Decoder.nested d)) : request) + | Some (6, _) -> (Copy (decode_pb_request_copy (Pbrt.Decoder.nested d)) : request) + | Some (7, _) -> (Comment (decode_pb_request_comment (Pbrt.Decoder.nested d)) : request) + | Some (8, _) -> (Commit (decode_pb_request_commit (Pbrt.Decoder.nested d)) : request) + | Some (9, _) -> (Rollback (decode_pb_request_rollback (Pbrt.Decoder.nested d)) : request) + | Some (10, _) -> (Merge (decode_pb_request_merge (Pbrt.Decoder.nested d)) : request) + | Some (11, _) -> (Save (decode_pb_request_save (Pbrt.Decoder.nested d)) : request) + | Some (12, _) -> (Show_config (decode_pb_request_show_config (Pbrt.Decoder.nested d)) : request) + | Some (13, _) -> (Exists (decode_pb_request_exists (Pbrt.Decoder.nested d)) : request) + | Some (14, _) -> (Get_value (decode_pb_request_get_value (Pbrt.Decoder.nested d)) : request) + | Some (15, _) -> (Get_values (decode_pb_request_get_values (Pbrt.Decoder.nested d)) : request) + | Some (16, _) -> (List_children (decode_pb_request_list_children (Pbrt.Decoder.nested d)) : request) + | Some (17, _) -> (Run_op_mode (decode_pb_request_run_op_mode (Pbrt.Decoder.nested d)) : request) + | Some (18, _) -> begin + Pbrt.Decoder.empty_nested d ; + (Confirm : request) + end + | Some (19, _) -> (Configure (decode_pb_request_enter_configuration_mode (Pbrt.Decoder.nested d)) : request) + | Some (20, _) -> begin + Pbrt.Decoder.empty_nested d ; + (Exit_configure : request) + end + | Some (21, _) -> (Validate (decode_pb_request_validate (Pbrt.Decoder.nested d)) : request) + | Some (22, _) -> (Teardown (decode_pb_request_teardown (Pbrt.Decoder.nested d)) : request) + | Some (n, payload_kind) -> ( + Pbrt.Decoder.skip d payload_kind; + loop () + ) + in + ret + in + loop () + +let rec decode_pb_request_envelope d = + let v = default_request_envelope_mutable () in + let continue__= ref true in + let request_is_set = ref false in + while !continue__ do + match Pbrt.Decoder.key d with + | None -> ( + ); continue__ := false + | Some (1, Pbrt.Bytes) -> begin + v.token <- Some (Pbrt.Decoder.string d); + end + | Some (1, pk) -> + Pbrt.Decoder.unexpected_payload "Message(request_envelope), field(1)" pk + | Some (2, Pbrt.Bytes) -> begin + v.request <- decode_pb_request (Pbrt.Decoder.nested d); request_is_set := true; + end + | Some (2, pk) -> + Pbrt.Decoder.unexpected_payload "Message(request_envelope), field(2)" pk + | Some (_, payload_kind) -> Pbrt.Decoder.skip d payload_kind + done; + begin if not !request_is_set then Pbrt.Decoder.missing_field "request" end; + ({ + token = v.token; + request = v.request; + } : request_envelope) + +let rec decode_pb_status d = + match Pbrt.Decoder.int_as_varint d with + | 0 -> (Success:status) + | 1 -> (Fail:status) + | 2 -> (Invalid_path:status) + | 3 -> (Invalid_value:status) + | 4 -> (Commit_in_progress:status) + | 5 -> (Configuration_locked:status) + | 6 -> (Internal_error:status) + | 7 -> (Permission_denied:status) + | 8 -> (Path_already_exists:status) + | _ -> Pbrt.Decoder.malformed_variant "status" + +let rec decode_pb_response d = + let v = default_response_mutable () in + let continue__= ref true in + let status_is_set = ref false in + while !continue__ do + match Pbrt.Decoder.key d with + | None -> ( + ); continue__ := false + | Some (1, Pbrt.Varint) -> begin + v.status <- decode_pb_status d; status_is_set := true; + end + | Some (1, pk) -> + Pbrt.Decoder.unexpected_payload "Message(response), field(1)" pk + | Some (2, Pbrt.Bytes) -> begin + v.output <- Some (Pbrt.Decoder.string d); + end + | Some (2, pk) -> + Pbrt.Decoder.unexpected_payload "Message(response), field(2)" pk + | Some (3, Pbrt.Bytes) -> begin + v.error <- Some (Pbrt.Decoder.string d); + end + | Some (3, pk) -> + Pbrt.Decoder.unexpected_payload "Message(response), field(3)" pk + | Some (4, Pbrt.Bytes) -> begin + v.warning <- Some (Pbrt.Decoder.string d); + end + | Some (4, pk) -> + Pbrt.Decoder.unexpected_payload "Message(response), field(4)" pk + | Some (_, payload_kind) -> Pbrt.Decoder.skip d payload_kind + done; + begin if not !status_is_set then Pbrt.Decoder.missing_field "status" end; + ({ + status = v.status; + output = v.output; + error = v.error; + warning = v.warning; + } : response) diff --git a/src/vyconf_pbt.mli b/src/vyconf_pbt.mli new file mode 100644 index 0000000..da94655 --- /dev/null +++ b/src/vyconf_pbt.mli @@ -0,0 +1,617 @@ + +(** Code for vyconf.proto *) + +(* generated from "data/vyconf.proto", do not edit *) + + + +(** {2 Types} *) + +type request_config_format = + | Curly + | Json + +type request_output_format = + | Out_plain + | Out_json + +type request_status = unit + +type request_setup_session = { + client_application : string option; + on_behalf_of : int32 option; +} + +type request_teardown = { + on_behalf_of : int32 option; +} + +type request_validate = { + path : string list; + output_format : request_output_format option; +} + +type request_set = { + path : string list; + ephemeral : bool option; +} + +type request_delete = { + path : string list; +} + +type request_rename = { + edit_level : string list; + from : string; + to_ : string; +} + +type request_copy = { + edit_level : string list; + from : string; + to_ : string; +} + +type request_comment = { + path : string list; + comment : string; +} + +type request_commit = { + confirm : bool option; + confirm_timeout : int32 option; + comment : string option; +} + +type request_rollback = { + revision : int32; +} + +type request_load = { + location : string; + format : request_config_format option; +} + +type request_merge = { + location : string; + format : request_config_format option; +} + +type request_save = { + location : string; + format : request_config_format option; +} + +type request_show_config = { + path : string list; + format : request_config_format option; +} + +type request_exists = { + path : string list; +} + +type request_get_value = { + path : string list; + output_format : request_output_format option; +} + +type request_get_values = { + path : string list; + output_format : request_output_format option; +} + +type request_list_children = { + path : string list; + output_format : request_output_format option; +} + +type request_run_op_mode = { + path : string list; + output_format : request_output_format option; +} + +type request_confirm = unit + +type request_enter_configuration_mode = { + exclusive : bool; + override_exclusive : bool; +} + +type request_exit_configuration_mode = unit + +type request = + | Status + | Setup_session of request_setup_session + | Set of request_set + | Delete of request_delete + | Rename of request_rename + | Copy of request_copy + | Comment of request_comment + | Commit of request_commit + | Rollback of request_rollback + | Merge of request_merge + | Save of request_save + | Show_config of request_show_config + | Exists of request_exists + | Get_value of request_get_value + | Get_values of request_get_values + | List_children of request_list_children + | Run_op_mode of request_run_op_mode + | Confirm + | Configure of request_enter_configuration_mode + | Exit_configure + | Validate of request_validate + | Teardown of request_teardown + +type request_envelope = { + token : string option; + request : request; +} + +type status = + | Success + | Fail + | Invalid_path + | Invalid_value + | Commit_in_progress + | Configuration_locked + | Internal_error + | Permission_denied + | Path_already_exists + +type response = { + status : status; + output : string option; + error : string option; + warning : string option; +} + + +(** {2 Basic values} *) + +val default_request_config_format : unit -> request_config_format +(** [default_request_config_format ()] is the default value for type [request_config_format] *) + +val default_request_output_format : unit -> request_output_format +(** [default_request_output_format ()] is the default value for type [request_output_format] *) + +val default_request_status : unit +(** [default_request_status ()] is the default value for type [request_status] *) + +val default_request_setup_session : + ?client_application:string option -> + ?on_behalf_of:int32 option -> + unit -> + request_setup_session +(** [default_request_setup_session ()] is the default value for type [request_setup_session] *) + +val default_request_teardown : + ?on_behalf_of:int32 option -> + unit -> + request_teardown +(** [default_request_teardown ()] is the default value for type [request_teardown] *) + +val default_request_validate : + ?path:string list -> + ?output_format:request_output_format option -> + unit -> + request_validate +(** [default_request_validate ()] is the default value for type [request_validate] *) + +val default_request_set : + ?path:string list -> + ?ephemeral:bool option -> + unit -> + request_set +(** [default_request_set ()] is the default value for type [request_set] *) + +val default_request_delete : + ?path:string list -> + unit -> + request_delete +(** [default_request_delete ()] is the default value for type [request_delete] *) + +val default_request_rename : + ?edit_level:string list -> + ?from:string -> + ?to_:string -> + unit -> + request_rename +(** [default_request_rename ()] is the default value for type [request_rename] *) + +val default_request_copy : + ?edit_level:string list -> + ?from:string -> + ?to_:string -> + unit -> + request_copy +(** [default_request_copy ()] is the default value for type [request_copy] *) + +val default_request_comment : + ?path:string list -> + ?comment:string -> + unit -> + request_comment +(** [default_request_comment ()] is the default value for type [request_comment] *) + +val default_request_commit : + ?confirm:bool option -> + ?confirm_timeout:int32 option -> + ?comment:string option -> + unit -> + request_commit +(** [default_request_commit ()] is the default value for type [request_commit] *) + +val default_request_rollback : + ?revision:int32 -> + unit -> + request_rollback +(** [default_request_rollback ()] is the default value for type [request_rollback] *) + +val default_request_load : + ?location:string -> + ?format:request_config_format option -> + unit -> + request_load +(** [default_request_load ()] is the default value for type [request_load] *) + +val default_request_merge : + ?location:string -> + ?format:request_config_format option -> + unit -> + request_merge +(** [default_request_merge ()] is the default value for type [request_merge] *) + +val default_request_save : + ?location:string -> + ?format:request_config_format option -> + unit -> + request_save +(** [default_request_save ()] is the default value for type [request_save] *) + +val default_request_show_config : + ?path:string list -> + ?format:request_config_format option -> + unit -> + request_show_config +(** [default_request_show_config ()] is the default value for type [request_show_config] *) + +val default_request_exists : + ?path:string list -> + unit -> + request_exists +(** [default_request_exists ()] is the default value for type [request_exists] *) + +val default_request_get_value : + ?path:string list -> + ?output_format:request_output_format option -> + unit -> + request_get_value +(** [default_request_get_value ()] is the default value for type [request_get_value] *) + +val default_request_get_values : + ?path:string list -> + ?output_format:request_output_format option -> + unit -> + request_get_values +(** [default_request_get_values ()] is the default value for type [request_get_values] *) + +val default_request_list_children : + ?path:string list -> + ?output_format:request_output_format option -> + unit -> + request_list_children +(** [default_request_list_children ()] is the default value for type [request_list_children] *) + +val default_request_run_op_mode : + ?path:string list -> + ?output_format:request_output_format option -> + unit -> + request_run_op_mode +(** [default_request_run_op_mode ()] is the default value for type [request_run_op_mode] *) + +val default_request_confirm : unit +(** [default_request_confirm ()] is the default value for type [request_confirm] *) + +val default_request_enter_configuration_mode : + ?exclusive:bool -> + ?override_exclusive:bool -> + unit -> + request_enter_configuration_mode +(** [default_request_enter_configuration_mode ()] is the default value for type [request_enter_configuration_mode] *) + +val default_request_exit_configuration_mode : unit +(** [default_request_exit_configuration_mode ()] is the default value for type [request_exit_configuration_mode] *) + +val default_request : unit -> request +(** [default_request ()] is the default value for type [request] *) + +val default_request_envelope : + ?token:string option -> + ?request:request -> + unit -> + request_envelope +(** [default_request_envelope ()] is the default value for type [request_envelope] *) + +val default_status : unit -> status +(** [default_status ()] is the default value for type [status] *) + +val default_response : + ?status:status -> + ?output:string option -> + ?error:string option -> + ?warning:string option -> + unit -> + response +(** [default_response ()] is the default value for type [response] *) + + +(** {2 Formatters} *) + +val pp_request_config_format : Format.formatter -> request_config_format -> unit +(** [pp_request_config_format v] formats v *) + +val pp_request_output_format : Format.formatter -> request_output_format -> unit +(** [pp_request_output_format v] formats v *) + +val pp_request_status : Format.formatter -> request_status -> unit +(** [pp_request_status v] formats v *) + +val pp_request_setup_session : Format.formatter -> request_setup_session -> unit +(** [pp_request_setup_session v] formats v *) + +val pp_request_teardown : Format.formatter -> request_teardown -> unit +(** [pp_request_teardown v] formats v *) + +val pp_request_validate : Format.formatter -> request_validate -> unit +(** [pp_request_validate v] formats v *) + +val pp_request_set : Format.formatter -> request_set -> unit +(** [pp_request_set v] formats v *) + +val pp_request_delete : Format.formatter -> request_delete -> unit +(** [pp_request_delete v] formats v *) + +val pp_request_rename : Format.formatter -> request_rename -> unit +(** [pp_request_rename v] formats v *) + +val pp_request_copy : Format.formatter -> request_copy -> unit +(** [pp_request_copy v] formats v *) + +val pp_request_comment : Format.formatter -> request_comment -> unit +(** [pp_request_comment v] formats v *) + +val pp_request_commit : Format.formatter -> request_commit -> unit +(** [pp_request_commit v] formats v *) + +val pp_request_rollback : Format.formatter -> request_rollback -> unit +(** [pp_request_rollback v] formats v *) + +val pp_request_load : Format.formatter -> request_load -> unit +(** [pp_request_load v] formats v *) + +val pp_request_merge : Format.formatter -> request_merge -> unit +(** [pp_request_merge v] formats v *) + +val pp_request_save : Format.formatter -> request_save -> unit +(** [pp_request_save v] formats v *) + +val pp_request_show_config : Format.formatter -> request_show_config -> unit +(** [pp_request_show_config v] formats v *) + +val pp_request_exists : Format.formatter -> request_exists -> unit +(** [pp_request_exists v] formats v *) + +val pp_request_get_value : Format.formatter -> request_get_value -> unit +(** [pp_request_get_value v] formats v *) + +val pp_request_get_values : Format.formatter -> request_get_values -> unit +(** [pp_request_get_values v] formats v *) + +val pp_request_list_children : Format.formatter -> request_list_children -> unit +(** [pp_request_list_children v] formats v *) + +val pp_request_run_op_mode : Format.formatter -> request_run_op_mode -> unit +(** [pp_request_run_op_mode v] formats v *) + +val pp_request_confirm : Format.formatter -> request_confirm -> unit +(** [pp_request_confirm v] formats v *) + +val pp_request_enter_configuration_mode : Format.formatter -> request_enter_configuration_mode -> unit +(** [pp_request_enter_configuration_mode v] formats v *) + +val pp_request_exit_configuration_mode : Format.formatter -> request_exit_configuration_mode -> unit +(** [pp_request_exit_configuration_mode v] formats v *) + +val pp_request : Format.formatter -> request -> unit +(** [pp_request v] formats v *) + +val pp_request_envelope : Format.formatter -> request_envelope -> unit +(** [pp_request_envelope v] formats v *) + +val pp_status : Format.formatter -> status -> unit +(** [pp_status v] formats v *) + +val pp_response : Format.formatter -> response -> unit +(** [pp_response v] formats v *) + + +(** {2 Protobuf Encoding} *) + +val encode_pb_request_config_format : request_config_format -> Pbrt.Encoder.t -> unit +(** [encode_pb_request_config_format v encoder] encodes [v] with the given [encoder] *) + +val encode_pb_request_output_format : request_output_format -> Pbrt.Encoder.t -> unit +(** [encode_pb_request_output_format v encoder] encodes [v] with the given [encoder] *) + +val encode_pb_request_status : request_status -> Pbrt.Encoder.t -> unit +(** [encode_pb_request_status v encoder] encodes [v] with the given [encoder] *) + +val encode_pb_request_setup_session : request_setup_session -> Pbrt.Encoder.t -> unit +(** [encode_pb_request_setup_session v encoder] encodes [v] with the given [encoder] *) + +val encode_pb_request_teardown : request_teardown -> Pbrt.Encoder.t -> unit +(** [encode_pb_request_teardown v encoder] encodes [v] with the given [encoder] *) + +val encode_pb_request_validate : request_validate -> Pbrt.Encoder.t -> unit +(** [encode_pb_request_validate v encoder] encodes [v] with the given [encoder] *) + +val encode_pb_request_set : request_set -> Pbrt.Encoder.t -> unit +(** [encode_pb_request_set v encoder] encodes [v] with the given [encoder] *) + +val encode_pb_request_delete : request_delete -> Pbrt.Encoder.t -> unit +(** [encode_pb_request_delete v encoder] encodes [v] with the given [encoder] *) + +val encode_pb_request_rename : request_rename -> Pbrt.Encoder.t -> unit +(** [encode_pb_request_rename v encoder] encodes [v] with the given [encoder] *) + +val encode_pb_request_copy : request_copy -> Pbrt.Encoder.t -> unit +(** [encode_pb_request_copy v encoder] encodes [v] with the given [encoder] *) + +val encode_pb_request_comment : request_comment -> Pbrt.Encoder.t -> unit +(** [encode_pb_request_comment v encoder] encodes [v] with the given [encoder] *) + +val encode_pb_request_commit : request_commit -> Pbrt.Encoder.t -> unit +(** [encode_pb_request_commit v encoder] encodes [v] with the given [encoder] *) + +val encode_pb_request_rollback : request_rollback -> Pbrt.Encoder.t -> unit +(** [encode_pb_request_rollback v encoder] encodes [v] with the given [encoder] *) + +val encode_pb_request_load : request_load -> Pbrt.Encoder.t -> unit +(** [encode_pb_request_load v encoder] encodes [v] with the given [encoder] *) + +val encode_pb_request_merge : request_merge -> Pbrt.Encoder.t -> unit +(** [encode_pb_request_merge v encoder] encodes [v] with the given [encoder] *) + +val encode_pb_request_save : request_save -> Pbrt.Encoder.t -> unit +(** [encode_pb_request_save v encoder] encodes [v] with the given [encoder] *) + +val encode_pb_request_show_config : request_show_config -> Pbrt.Encoder.t -> unit +(** [encode_pb_request_show_config v encoder] encodes [v] with the given [encoder] *) + +val encode_pb_request_exists : request_exists -> Pbrt.Encoder.t -> unit +(** [encode_pb_request_exists v encoder] encodes [v] with the given [encoder] *) + +val encode_pb_request_get_value : request_get_value -> Pbrt.Encoder.t -> unit +(** [encode_pb_request_get_value v encoder] encodes [v] with the given [encoder] *) + +val encode_pb_request_get_values : request_get_values -> Pbrt.Encoder.t -> unit +(** [encode_pb_request_get_values v encoder] encodes [v] with the given [encoder] *) + +val encode_pb_request_list_children : request_list_children -> Pbrt.Encoder.t -> unit +(** [encode_pb_request_list_children v encoder] encodes [v] with the given [encoder] *) + +val encode_pb_request_run_op_mode : request_run_op_mode -> Pbrt.Encoder.t -> unit +(** [encode_pb_request_run_op_mode v encoder] encodes [v] with the given [encoder] *) + +val encode_pb_request_confirm : request_confirm -> Pbrt.Encoder.t -> unit +(** [encode_pb_request_confirm v encoder] encodes [v] with the given [encoder] *) + +val encode_pb_request_enter_configuration_mode : request_enter_configuration_mode -> Pbrt.Encoder.t -> unit +(** [encode_pb_request_enter_configuration_mode v encoder] encodes [v] with the given [encoder] *) + +val encode_pb_request_exit_configuration_mode : request_exit_configuration_mode -> Pbrt.Encoder.t -> unit +(** [encode_pb_request_exit_configuration_mode v encoder] encodes [v] with the given [encoder] *) + +val encode_pb_request : request -> Pbrt.Encoder.t -> unit +(** [encode_pb_request v encoder] encodes [v] with the given [encoder] *) + +val encode_pb_request_envelope : request_envelope -> Pbrt.Encoder.t -> unit +(** [encode_pb_request_envelope v encoder] encodes [v] with the given [encoder] *) + +val encode_pb_status : status -> Pbrt.Encoder.t -> unit +(** [encode_pb_status v encoder] encodes [v] with the given [encoder] *) + +val encode_pb_response : response -> Pbrt.Encoder.t -> unit +(** [encode_pb_response v encoder] encodes [v] with the given [encoder] *) + + +(** {2 Protobuf Decoding} *) + +val decode_pb_request_config_format : Pbrt.Decoder.t -> request_config_format +(** [decode_pb_request_config_format decoder] decodes a [request_config_format] binary value from [decoder] *) + +val decode_pb_request_output_format : Pbrt.Decoder.t -> request_output_format +(** [decode_pb_request_output_format decoder] decodes a [request_output_format] binary value from [decoder] *) + +val decode_pb_request_status : Pbrt.Decoder.t -> request_status +(** [decode_pb_request_status decoder] decodes a [request_status] binary value from [decoder] *) + +val decode_pb_request_setup_session : Pbrt.Decoder.t -> request_setup_session +(** [decode_pb_request_setup_session decoder] decodes a [request_setup_session] binary value from [decoder] *) + +val decode_pb_request_teardown : Pbrt.Decoder.t -> request_teardown +(** [decode_pb_request_teardown decoder] decodes a [request_teardown] binary value from [decoder] *) + +val decode_pb_request_validate : Pbrt.Decoder.t -> request_validate +(** [decode_pb_request_validate decoder] decodes a [request_validate] binary value from [decoder] *) + +val decode_pb_request_set : Pbrt.Decoder.t -> request_set +(** [decode_pb_request_set decoder] decodes a [request_set] binary value from [decoder] *) + +val decode_pb_request_delete : Pbrt.Decoder.t -> request_delete +(** [decode_pb_request_delete decoder] decodes a [request_delete] binary value from [decoder] *) + +val decode_pb_request_rename : Pbrt.Decoder.t -> request_rename +(** [decode_pb_request_rename decoder] decodes a [request_rename] binary value from [decoder] *) + +val decode_pb_request_copy : Pbrt.Decoder.t -> request_copy +(** [decode_pb_request_copy decoder] decodes a [request_copy] binary value from [decoder] *) + +val decode_pb_request_comment : Pbrt.Decoder.t -> request_comment +(** [decode_pb_request_comment decoder] decodes a [request_comment] binary value from [decoder] *) + +val decode_pb_request_commit : Pbrt.Decoder.t -> request_commit +(** [decode_pb_request_commit decoder] decodes a [request_commit] binary value from [decoder] *) + +val decode_pb_request_rollback : Pbrt.Decoder.t -> request_rollback +(** [decode_pb_request_rollback decoder] decodes a [request_rollback] binary value from [decoder] *) + +val decode_pb_request_load : Pbrt.Decoder.t -> request_load +(** [decode_pb_request_load decoder] decodes a [request_load] binary value from [decoder] *) + +val decode_pb_request_merge : Pbrt.Decoder.t -> request_merge +(** [decode_pb_request_merge decoder] decodes a [request_merge] binary value from [decoder] *) + +val decode_pb_request_save : Pbrt.Decoder.t -> request_save +(** [decode_pb_request_save decoder] decodes a [request_save] binary value from [decoder] *) + +val decode_pb_request_show_config : Pbrt.Decoder.t -> request_show_config +(** [decode_pb_request_show_config decoder] decodes a [request_show_config] binary value from [decoder] *) + +val decode_pb_request_exists : Pbrt.Decoder.t -> request_exists +(** [decode_pb_request_exists decoder] decodes a [request_exists] binary value from [decoder] *) + +val decode_pb_request_get_value : Pbrt.Decoder.t -> request_get_value +(** [decode_pb_request_get_value decoder] decodes a [request_get_value] binary value from [decoder] *) + +val decode_pb_request_get_values : Pbrt.Decoder.t -> request_get_values +(** [decode_pb_request_get_values decoder] decodes a [request_get_values] binary value from [decoder] *) + +val decode_pb_request_list_children : Pbrt.Decoder.t -> request_list_children +(** [decode_pb_request_list_children decoder] decodes a [request_list_children] binary value from [decoder] *) + +val decode_pb_request_run_op_mode : Pbrt.Decoder.t -> request_run_op_mode +(** [decode_pb_request_run_op_mode decoder] decodes a [request_run_op_mode] binary value from [decoder] *) + +val decode_pb_request_confirm : Pbrt.Decoder.t -> request_confirm +(** [decode_pb_request_confirm decoder] decodes a [request_confirm] binary value from [decoder] *) + +val decode_pb_request_enter_configuration_mode : Pbrt.Decoder.t -> request_enter_configuration_mode +(** [decode_pb_request_enter_configuration_mode decoder] decodes a [request_enter_configuration_mode] binary value from [decoder] *) + +val decode_pb_request_exit_configuration_mode : Pbrt.Decoder.t -> request_exit_configuration_mode +(** [decode_pb_request_exit_configuration_mode decoder] decodes a [request_exit_configuration_mode] binary value from [decoder] *) + +val decode_pb_request : Pbrt.Decoder.t -> request +(** [decode_pb_request decoder] decodes a [request] binary value from [decoder] *) + +val decode_pb_request_envelope : Pbrt.Decoder.t -> request_envelope +(** [decode_pb_request_envelope decoder] decodes a [request_envelope] binary value from [decoder] *) + +val decode_pb_status : Pbrt.Decoder.t -> status +(** [decode_pb_status decoder] decodes a [status] binary value from [decoder] *) + +val decode_pb_response : Pbrt.Decoder.t -> response +(** [decode_pb_response decoder] decodes a [response] binary value from [decoder] *) diff --git a/src/vyconf_types.ml b/src/vyconf_types.ml deleted file mode 100644 index f7e5d50..0000000 --- a/src/vyconf_types.ml +++ /dev/null @@ -1,318 +0,0 @@ -[@@@ocaml.warning "-27-30-39"] - - -type request_config_format = - | Curly - | Json - -type request_output_format = - | Out_plain - | Out_json - -type request_setup_session = { - client_application : string option; - on_behalf_of : int32 option; -} - -type request_set = { - path : string list; - ephemeral : bool option; -} - -type request_delete = { - path : string list; -} - -type request_rename = { - edit_level : string list; - from : string; - to_ : string; -} - -type request_copy = { - edit_level : string list; - from : string; - to_ : string; -} - -type request_comment = { - path : string list; - comment : string; -} - -type request_commit = { - confirm : bool option; - confirm_timeout : int32 option; - comment : string option; -} - -type request_rollback = { - revision : int32; -} - -type request_load = { - location : string; - format : request_config_format option; -} - -type request_merge = { - location : string; - format : request_config_format option; -} - -type request_save = { - location : string; - format : request_config_format option; -} - -type request_show_config = { - path : string list; - format : request_config_format option; -} - -type request_exists = { - path : string list; -} - -type request_get_value = { - path : string list; - output_format : request_output_format option; -} - -type request_get_values = { - path : string list; - output_format : request_output_format option; -} - -type request_list_children = { - path : string list; - output_format : request_output_format option; -} - -type request_run_op_mode = { - path : string list; - output_format : request_output_format option; -} - -type request_enter_configuration_mode = { - exclusive : bool; - override_exclusive : bool; -} - -type request = - | Status - | Setup_session of request_setup_session - | Set of request_set - | Delete of request_delete - | Rename of request_rename - | Copy of request_copy - | Comment of request_comment - | Commit of request_commit - | Rollback of request_rollback - | Merge of request_merge - | Save of request_save - | Show_config of request_show_config - | Exists of request_exists - | Get_value of request_get_value - | Get_values of request_get_values - | List_children of request_list_children - | Run_op_mode of request_run_op_mode - | Confirm - | Configure of request_enter_configuration_mode - | Exit_configure - | Teardown of string - -type request_envelope = { - token : string option; - request : request; -} - -type status = - | Success - | Fail - | Invalid_path - | Invalid_value - | Commit_in_progress - | Configuration_locked - | Internal_error - | Permission_denied - | Path_already_exists - -type response = { - status : status; - output : string option; - error : string option; - warning : string option; -} - -let rec default_request_config_format () = (Curly:request_config_format) - -let rec default_request_output_format () = (Out_plain:request_output_format) - -let rec default_request_setup_session - ?client_application:((client_application:string option) = None) - ?on_behalf_of:((on_behalf_of:int32 option) = None) - () : request_setup_session = { - client_application; - on_behalf_of; -} - -let rec default_request_set - ?path:((path:string list) = []) - ?ephemeral:((ephemeral:bool option) = None) - () : request_set = { - path; - ephemeral; -} - -let rec default_request_delete - ?path:((path:string list) = []) - () : request_delete = { - path; -} - -let rec default_request_rename - ?edit_level:((edit_level:string list) = []) - ?from:((from:string) = "") - ?to_:((to_:string) = "") - () : request_rename = { - edit_level; - from; - to_; -} - -let rec default_request_copy - ?edit_level:((edit_level:string list) = []) - ?from:((from:string) = "") - ?to_:((to_:string) = "") - () : request_copy = { - edit_level; - from; - to_; -} - -let rec default_request_comment - ?path:((path:string list) = []) - ?comment:((comment:string) = "") - () : request_comment = { - path; - comment; -} - -let rec default_request_commit - ?confirm:((confirm:bool option) = None) - ?confirm_timeout:((confirm_timeout:int32 option) = None) - ?comment:((comment:string option) = None) - () : request_commit = { - confirm; - confirm_timeout; - comment; -} - -let rec default_request_rollback - ?revision:((revision:int32) = 0l) - () : request_rollback = { - revision; -} - -let rec default_request_load - ?location:((location:string) = "") - ?format:((format:request_config_format option) = None) - () : request_load = { - location; - format; -} - -let rec default_request_merge - ?location:((location:string) = "") - ?format:((format:request_config_format option) = None) - () : request_merge = { - location; - format; -} - -let rec default_request_save - ?location:((location:string) = "") - ?format:((format:request_config_format option) = None) - () : request_save = { - location; - format; -} - -let rec default_request_show_config - ?path:((path:string list) = []) - ?format:((format:request_config_format option) = None) - () : request_show_config = { - path; - format; -} - -let rec default_request_exists - ?path:((path:string list) = []) - () : request_exists = { - path; -} - -let rec default_request_get_value - ?path:((path:string list) = []) - ?output_format:((output_format:request_output_format option) = None) - () : request_get_value = { - path; - output_format; -} - -let rec default_request_get_values - ?path:((path:string list) = []) - ?output_format:((output_format:request_output_format option) = None) - () : request_get_values = { - path; - output_format; -} - -let rec default_request_list_children - ?path:((path:string list) = []) - ?output_format:((output_format:request_output_format option) = None) - () : request_list_children = { - path; - output_format; -} - -let rec default_request_run_op_mode - ?path:((path:string list) = []) - ?output_format:((output_format:request_output_format option) = None) - () : request_run_op_mode = { - path; - output_format; -} - -let rec default_request_enter_configuration_mode - ?exclusive:((exclusive:bool) = false) - ?override_exclusive:((override_exclusive:bool) = false) - () : request_enter_configuration_mode = { - exclusive; - override_exclusive; -} - -let rec default_request (): request = Status - -let rec default_request_envelope - ?token:((token:string option) = None) - ?request:((request:request) = default_request ()) - () : request_envelope = { - token; - request; -} - -let rec default_status () = (Success:status) - -let rec default_response - ?status:((status:status) = default_status ()) - ?output:((output:string option) = None) - ?error:((error:string option) = None) - ?warning:((warning:string option) = None) - () : response = { - status; - output; - error; - warning; -} diff --git a/src/vyconf_types.mli b/src/vyconf_types.mli deleted file mode 100644 index 194d66c..0000000 --- a/src/vyconf_types.mli +++ /dev/null @@ -1,306 +0,0 @@ -(** vyconf.proto Types *) - - - -(** {2 Types} *) - -type request_config_format = - | Curly - | Json - -type request_output_format = - | Out_plain - | Out_json - -type request_setup_session = { - client_application : string option; - on_behalf_of : int32 option; -} - -type request_set = { - path : string list; - ephemeral : bool option; -} - -type request_delete = { - path : string list; -} - -type request_rename = { - edit_level : string list; - from : string; - to_ : string; -} - -type request_copy = { - edit_level : string list; - from : string; - to_ : string; -} - -type request_comment = { - path : string list; - comment : string; -} - -type request_commit = { - confirm : bool option; - confirm_timeout : int32 option; - comment : string option; -} - -type request_rollback = { - revision : int32; -} - -type request_load = { - location : string; - format : request_config_format option; -} - -type request_merge = { - location : string; - format : request_config_format option; -} - -type request_save = { - location : string; - format : request_config_format option; -} - -type request_show_config = { - path : string list; - format : request_config_format option; -} - -type request_exists = { - path : string list; -} - -type request_get_value = { - path : string list; - output_format : request_output_format option; -} - -type request_get_values = { - path : string list; - output_format : request_output_format option; -} - -type request_list_children = { - path : string list; - output_format : request_output_format option; -} - -type request_run_op_mode = { - path : string list; - output_format : request_output_format option; -} - -type request_enter_configuration_mode = { - exclusive : bool; - override_exclusive : bool; -} - -type request = - | Status - | Setup_session of request_setup_session - | Set of request_set - | Delete of request_delete - | Rename of request_rename - | Copy of request_copy - | Comment of request_comment - | Commit of request_commit - | Rollback of request_rollback - | Merge of request_merge - | Save of request_save - | Show_config of request_show_config - | Exists of request_exists - | Get_value of request_get_value - | Get_values of request_get_values - | List_children of request_list_children - | Run_op_mode of request_run_op_mode - | Confirm - | Configure of request_enter_configuration_mode - | Exit_configure - | Teardown of string - -type request_envelope = { - token : string option; - request : request; -} - -type status = - | Success - | Fail - | Invalid_path - | Invalid_value - | Commit_in_progress - | Configuration_locked - | Internal_error - | Permission_denied - | Path_already_exists - -type response = { - status : status; - output : string option; - error : string option; - warning : string option; -} - - -(** {2 Default values} *) - -val default_request_config_format : unit -> request_config_format -(** [default_request_config_format ()] is the default value for type [request_config_format] *) - -val default_request_output_format : unit -> request_output_format -(** [default_request_output_format ()] is the default value for type [request_output_format] *) - -val default_request_setup_session : - ?client_application:string option -> - ?on_behalf_of:int32 option -> - unit -> - request_setup_session -(** [default_request_setup_session ()] is the default value for type [request_setup_session] *) - -val default_request_set : - ?path:string list -> - ?ephemeral:bool option -> - unit -> - request_set -(** [default_request_set ()] is the default value for type [request_set] *) - -val default_request_delete : - ?path:string list -> - unit -> - request_delete -(** [default_request_delete ()] is the default value for type [request_delete] *) - -val default_request_rename : - ?edit_level:string list -> - ?from:string -> - ?to_:string -> - unit -> - request_rename -(** [default_request_rename ()] is the default value for type [request_rename] *) - -val default_request_copy : - ?edit_level:string list -> - ?from:string -> - ?to_:string -> - unit -> - request_copy -(** [default_request_copy ()] is the default value for type [request_copy] *) - -val default_request_comment : - ?path:string list -> - ?comment:string -> - unit -> - request_comment -(** [default_request_comment ()] is the default value for type [request_comment] *) - -val default_request_commit : - ?confirm:bool option -> - ?confirm_timeout:int32 option -> - ?comment:string option -> - unit -> - request_commit -(** [default_request_commit ()] is the default value for type [request_commit] *) - -val default_request_rollback : - ?revision:int32 -> - unit -> - request_rollback -(** [default_request_rollback ()] is the default value for type [request_rollback] *) - -val default_request_load : - ?location:string -> - ?format:request_config_format option -> - unit -> - request_load -(** [default_request_load ()] is the default value for type [request_load] *) - -val default_request_merge : - ?location:string -> - ?format:request_config_format option -> - unit -> - request_merge -(** [default_request_merge ()] is the default value for type [request_merge] *) - -val default_request_save : - ?location:string -> - ?format:request_config_format option -> - unit -> - request_save -(** [default_request_save ()] is the default value for type [request_save] *) - -val default_request_show_config : - ?path:string list -> - ?format:request_config_format option -> - unit -> - request_show_config -(** [default_request_show_config ()] is the default value for type [request_show_config] *) - -val default_request_exists : - ?path:string list -> - unit -> - request_exists -(** [default_request_exists ()] is the default value for type [request_exists] *) - -val default_request_get_value : - ?path:string list -> - ?output_format:request_output_format option -> - unit -> - request_get_value -(** [default_request_get_value ()] is the default value for type [request_get_value] *) - -val default_request_get_values : - ?path:string list -> - ?output_format:request_output_format option -> - unit -> - request_get_values -(** [default_request_get_values ()] is the default value for type [request_get_values] *) - -val default_request_list_children : - ?path:string list -> - ?output_format:request_output_format option -> - unit -> - request_list_children -(** [default_request_list_children ()] is the default value for type [request_list_children] *) - -val default_request_run_op_mode : - ?path:string list -> - ?output_format:request_output_format option -> - unit -> - request_run_op_mode -(** [default_request_run_op_mode ()] is the default value for type [request_run_op_mode] *) - -val default_request_enter_configuration_mode : - ?exclusive:bool -> - ?override_exclusive:bool -> - unit -> - request_enter_configuration_mode -(** [default_request_enter_configuration_mode ()] is the default value for type [request_enter_configuration_mode] *) - -val default_request : unit -> request -(** [default_request ()] is the default value for type [request] *) - -val default_request_envelope : - ?token:string option -> - ?request:request -> - unit -> - request_envelope -(** [default_request_envelope ()] is the default value for type [request_envelope] *) - -val default_status : unit -> status -(** [default_status ()] is the default value for type [status] *) - -val default_response : - ?status:status -> - ?output:string option -> - ?error:string option -> - ?warning:string option -> - unit -> - response -(** [default_response ()] is the default value for type [response] *) diff --git a/src/vyconfd.ml b/src/vyconfd.ml index d79bda9..7c4caeb 100644 --- a/src/vyconfd.ml +++ b/src/vyconfd.ml @@ -1,10 +1,14 @@ open Lwt -open Defaults -open Vyconf_config -open Vyconf_pb -open Vyconf_types + +open Vyconf_connect.Vyconf_pbt +open Vyconfd_config.Defaults +open Vyconfd_config.Vyconf_config module FP = FilePath +module CT = Vyos1x.Config_tree +module Gen = Vyos1x.Generate +module Session = Vyconfd_config.Session +module Directories = Vyconfd_config.Directories (* On UNIX, self_init uses /dev/random for seed *) let () = Random.self_init () @@ -43,7 +47,7 @@ let make_session_token () = let setup_session world req = let token = make_session_token () in let user = "unknown user" in - let client_app = BatOption.default "unknown client" req.client_application in + let client_app = Option.value req.client_application ~default:"unknown client" in let () = Hashtbl.add sessions token (Session.make world client_app user) in {response_tmpl with output=(Some token)} @@ -80,10 +84,10 @@ let exit_conf_mode world token = in Hashtbl.replace sessions token session; response_tmpl -let teardown_session token = +let teardown token = try Hashtbl.remove sessions token; - response_tmpl + {response_tmpl with status=Success} with Not_found -> {response_tmpl with status=Fail; error=(Some "Session not found")} @@ -93,9 +97,9 @@ let exists world token (req: request_exists) = let get_value world token (req: request_get_value) = try - let () = (Lwt_log.debug @@ Printf.sprintf "[%s]\n" (Util.string_of_list req.path)) |> Lwt.ignore_result in + let () = (Lwt_log.debug @@ Printf.sprintf "[%s]\n" (Vyos1x.Util.string_of_list req.path)) |> Lwt.ignore_result in let value = Session.get_value world (find_session token) req.path in - let fmt = BatOption.default Out_plain req.output_format in + let fmt = Option.value req.output_format ~default:Out_plain in let value_str = (match fmt with | Out_plain -> value @@ -106,45 +110,52 @@ let get_value world token (req: request_get_value) = let get_values world token (req: request_get_values) = try let values = Session.get_values world (find_session token) req.path in - let fmt = BatOption.default Out_plain req.output_format in + let fmt = Option.value req.output_format ~default:Out_plain in let values_str = (match fmt with - | Out_plain -> Util.string_of_list @@ List.map (Printf.sprintf "\'%s\'") values - | Out_json -> Util.json_of_list values) + | Out_plain -> Vyos1x.Util.string_of_list @@ List.map (Printf.sprintf "\'%s\'") values + | Out_json -> Vyos1x.Util.json_of_list values) in {response_tmpl with output=(Some values_str)} with Session.Session_error msg -> {response_tmpl with status=Fail; error=(Some msg)} let list_children world token (req: request_list_children) = try let children = Session.list_children world (find_session token) req.path in - let fmt = BatOption.default Out_plain req.output_format in + let fmt = Option.value req.output_format ~default:Out_plain in let children_str = (match fmt with - | Out_plain -> Util.string_of_list @@ List.map (Printf.sprintf "\'%s\'") children - | Out_json -> Util.json_of_list children) + | Out_plain -> Vyos1x.Util.string_of_list @@ List.map (Printf.sprintf "\'%s\'") children + | Out_json -> Vyos1x.Util.json_of_list children) in {response_tmpl with output=(Some children_str)} with Session.Session_error msg -> {response_tmpl with status=Fail; error=(Some msg)} let show_config world token (req: request_show_config) = try - let fmt = BatOption.default Curly req.format in + let fmt = Option.value req.format ~default:Curly in let conf_str = Session.show_config world (find_session token) req.path fmt in {response_tmpl with output=(Some conf_str)} with Session.Session_error msg -> {response_tmpl with status=Fail; error=(Some msg)} +let validate world token (req: request_validate) = + try + let () = (Lwt_log.debug @@ Printf.sprintf "[%s]\n" (Vyos1x.Util.string_of_list req.path)) |> Lwt.ignore_result in + let () = Session.validate world (find_session token) req.path in + response_tmpl + with Session.Session_error msg -> {response_tmpl with status=Fail; error=(Some msg)} + let send_response oc resp = let enc = Pbrt.Encoder.create () in - let%lwt () = encode_response resp enc |> return in + let%lwt () = encode_pb_response resp enc |> return in let%lwt resp_msg = Pbrt.Encoder.to_bytes enc |> return in - let%lwt () = Message.write oc resp_msg in + let%lwt () = Vyconf_connect.Message.write oc resp_msg in Lwt.return () -let rec handle_connection world ic oc fd () = +let rec handle_connection world ic oc () = try%lwt - let%lwt req_msg = Message.read ic in + let%lwt req_msg = Vyconf_connect.Message.read ic in let%lwt req = try - let envelope = decode_request_envelope (Pbrt.Decoder.of_bytes req_msg) in + let envelope = decode_pb_request_envelope (Pbrt.Decoder.of_bytes req_msg) in Lwt.return (Ok (envelope.token, envelope.request)) with Pbrt.Decoder.Failure e -> Lwt.return (Error (Pbrt.Decoder.error_to_string e)) in @@ -157,7 +168,7 @@ let rec handle_connection world ic oc fd () = | _, Status -> response_tmpl | _, Setup_session r -> setup_session world r | None, _ -> {response_tmpl with status=Fail; output=(Some "Operation requires session token")} - | Some t, Teardown _ -> teardown_session t + | Some t, Teardown _ -> teardown t | Some t, Configure r -> enter_conf_mode r t | Some t, Exit_configure -> exit_conf_mode world t | Some t, Exists r -> exists world t r @@ -165,28 +176,29 @@ let rec handle_connection world ic oc fd () = | Some t, Get_values r -> get_values world t r | Some t, List_children r -> list_children world t r | Some t, Show_config r -> show_config world t r + | Some t, Validate r -> validate world t r | _ -> failwith "Unimplemented" end) |> Lwt.return in let%lwt () = send_response oc resp in - handle_connection world ic oc fd () + handle_connection world ic oc () with | Failure e -> let%lwt () = Lwt_log.error e in let%lwt () = send_response oc ({response_tmpl with status=Fail; error=(Some e)}) in - handle_connection world ic oc fd () - | End_of_file -> Lwt_log.info "Connection closed" >>= return + handle_connection world ic oc () + | End_of_file -> Lwt_log.info "Connection closed" >>= (fun () -> Lwt_io.close ic) >>= return let accept_connection world conn = let fd, _ = conn in - let ic = Lwt_io.of_fd Lwt_io.Input fd in - let oc = Lwt_io.of_fd Lwt_io.Output fd in - Lwt.on_failure (handle_connection world ic oc fd ()) (fun e -> Lwt_log.ign_error (Printexc.to_string e)); + let ic = Lwt_io.of_fd ~mode:Lwt_io.Input fd in + let oc = Lwt_io.of_fd ~mode:Lwt_io.Output fd in + Lwt.on_failure (handle_connection world ic oc ()) (fun e -> Lwt_log.ign_error (Printexc.to_string e)); Lwt_log.info "New connection" >>= return let main_loop basepath world () = let open Session in - let log_file = BatOption.bind !log_file (fun s -> Some (FP.concat basepath s)) in + let log_file = Option.bind !log_file (fun s -> Some (FP.concat basepath s)) in let%lwt () = Startup.setup_logger !daemonize log_file world.vyconf_config.log_template in let%lwt () = Lwt_log.notice @@ Printf.sprintf "Starting VyConf for %s" world.vyconf_config.app_name in let%lwt sock = Startup.create_socket (FP.concat basepath world.vyconf_config.socket) in @@ -194,29 +206,33 @@ let main_loop basepath world () = serve () let load_interface_definitions dir = - let open Session in - let reftree = Startup.load_interface_definitions dir in + let reftree = Gen.load_interface_definitions dir in + match reftree with + | Ok r -> r + | Error s -> Startup.panic s + +let read_reference_tree file = + let reftree = Startup.read_reference_tree file in match reftree with | Ok r -> r | Error s -> Startup.panic s let make_world config dirs = - let open Directories in let open Session in - let reftree = load_interface_definitions dirs.interface_definitions in - let running_config = Config_tree.make "root" in + (* the reference_tree json file is generated at vyos-1x build time *) + let reftree = read_reference_tree (FP.concat config.config_dir config.reference_tree) in + let running_config = CT.make "" in {running_config=running_config; reference_tree=reftree; vyconf_config=config; dirs=dirs} let () = - let () = Arg.parse args (fun f -> ()) usage in + let () = Arg.parse args (fun _ -> ()) usage in let vc = Startup.load_daemon_config !config_file in let () = Lwt_log.load_rules ("* -> " ^ vc.log_level) in let dirs = Directories.make !basepath vc in - Startup.check_dirs dirs; + Startup.check_validators_dir dirs; let world = make_world vc dirs in let config = Startup.load_config_failsafe (FP.concat vc.config_dir vc.primary_config) (FP.concat vc.config_dir vc.fallback_config) in let world = Session.{world with running_config=config} in - let () = print_endline (Config_tree.render world.running_config) in Lwt_main.run @@ main_loop !basepath world () diff --git a/src/vylist.ml b/src/vylist.ml deleted file mode 100644 index cd4a32e..0000000 --- a/src/vylist.ml +++ /dev/null @@ -1,46 +0,0 @@ -let rec find p xs = - match xs with - | [] -> None - | y :: ys -> if (p y) then (Some y) - else find p ys - -let rec remove p xs = - match xs with - | [] -> [] - | y :: ys -> if (p y) then ys - else y :: (remove p ys) - -let rec replace p x xs = - match xs with - | [] -> raise Not_found - | y :: ys -> if (p y) then x :: ys - else y :: (replace p x ys) - -let rec insert_before p x xs = - match xs with - | [] -> raise Not_found - | y :: ys -> if (p y) then x :: y :: ys - else y :: (insert_before p x ys) - -let rec insert_after p x xs = - match xs with - | [] -> raise Not_found - | y :: ys -> if (p y) then y :: x :: ys - else y :: (insert_after p x ys) - -let complement xs ys = - let rec aux xs ys = - match xs, ys with - | [], _ -> ys - | _, [] -> assert false (* Can't happen *) - | p :: ps, q :: qs -> if p = q then aux ps qs - else [] - in - if List.length xs < List.length ys then aux xs ys - else aux ys xs - -let in_list xs x = - let x' = find ((=) x) xs in - match x' with - | None -> false - | Some _ -> true diff --git a/src/vylist.mli b/src/vylist.mli deleted file mode 100644 index 9135bf6..0000000 --- a/src/vylist.mli +++ /dev/null @@ -1,7 +0,0 @@ -val find : ('a -> bool) -> 'a list -> 'a option -val remove : ('a -> bool) -> 'a list -> 'a list -val replace : ('a -> bool) -> 'a -> 'a list -> 'a list -val insert_before : ('a -> bool) -> 'a -> 'a list -> 'a list -val insert_after : ('a -> bool) -> 'a -> 'a list -> 'a list -val complement : 'a list -> 'a list -> 'a list -val in_list : 'a list -> 'a -> bool diff --git a/src/vytree.ml b/src/vytree.ml deleted file mode 100644 index a3e2750..0000000 --- a/src/vytree.ml +++ /dev/null @@ -1,192 +0,0 @@ -type 'a t = { - name: string; - data: 'a; - children: 'a t list -} [@@deriving yojson] - -type position = Before of string | After of string | End | Default - -exception Empty_path -exception Duplicate_child -exception Nonexistent_path -exception Insert_error of string - -let make data name = { name = name; data = data; children = [] } - -let make_full data name children = { name = name; data = data; children = children } - -let name_of_node node = node.name -let data_of_node node = node.data -let children_of_node node = node.children - -let insert_immediate ?(position=Default) node name data children = - let new_node = make_full data name children in - let children' = - match position with - | Default -> new_node :: node.children - | End -> node.children @ [new_node] - | Before s -> Vylist.insert_before (fun x -> x.name = s) new_node node.children - | After s -> Vylist.insert_after (fun x -> x.name = s) new_node node.children - in { node with children = children' } - -let delete_immediate node name = - let children' = Vylist.remove (fun x -> x.name = name) node.children in - { node with children = children' } - -let adopt node child = - { node with children = child :: node.children } - -let replace node child = - let children = node.children in - let name = child.name in - let children' = Vylist.replace (fun x -> x.name = name) child children in - { node with children = children' } - -let replace_full node child name = - let children = node.children in - let children' = Vylist.replace (fun x -> x.name = name) child children in - { node with children = children' } - -let find node name = - Vylist.find (fun x -> x.name = name) node.children - -let find_or_fail node name = - let child = find node name in - match child with - | None -> raise Nonexistent_path - | Some child' -> child' - -let list_children node = - List.map (fun x -> x.name) node.children - -let rec do_with_child fn node path = - match path with - | [] -> raise Empty_path - | [name] -> fn node name - | name :: names -> - let next_child = find_or_fail node name in - let new_node = do_with_child fn next_child names in - replace node new_node - -let rec insert ?(position=Default) ?(children=[]) node path data = - match path with - | [] -> raise Empty_path - | [name] -> - (let last_child = find node name in - match last_child with - | None -> insert_immediate ~position:position node name data children - | (Some _) -> raise Duplicate_child) - | name :: names -> - let next_child = find node name in - match next_child with - | Some next_child' -> - let new_node = insert ~position:position ~children:children next_child' names data in - replace node new_node - | None -> - raise (Insert_error "Path does not exist") - -(** Given a node N check if it has children with duplicate names, - and merge subsequent children's children into the first child by - that name. - - While all insert functions maintain the "every child has unique name" - invariant, for nodes constructed manually with make/make_full and adopt - it may not hold, and constructing nodes this way is a sensible approach - for config parsing. Depending on the config format, duplicate node names - may be normal and even expected, such as "ethernet eth0" and "ethernet eth1" - in the "curly" format. - *) -let merge_children merge_data node = - (* Given a node N and a list of nodes NS, find all nodes in NS that - have the same name as N and merge their children into N *) - let rec merge_into n ns = - match ns with - | [] -> n - | n' :: ns' -> - if n.name = n'.name then - let children = List.append n.children n'.children in - let data = merge_data n.data n'.data in - let n = {n with children=children; data=data} in - merge_into n ns' - else merge_into n ns' - in - (* Given a list of nodes, for every node, find subsequent children with - the same name and merge them into the first node, then delete remaining - nodes from the list *) - let rec aux ns = - match ns with - | [] -> [] - | n :: ns -> - let n = merge_into n ns in - let ns = List.filter (fun x -> x.name <> n.name) ns in - n :: (aux ns) - in {node with children=(aux node.children)} - -(* When inserting at a path that, entirely or partially, - does not exist yet, create missing nodes on the way with default data *) -let rec insert_multi_level default_data node path_done path_remaining data = - match path_remaining with - | [] | [_] -> insert node (path_done @ path_remaining) data - | name :: names -> - let path_done = path_done @ [name] in - let node = insert node path_done default_data in - insert_multi_level default_data node path_done names data - -let delete node path = - do_with_child delete_immediate node path - -let rename node path newname = - let rename_immediate newname' node' name' = - let child = find_or_fail node' name' in - let child = { child with name=newname' } in - replace_full node' child name' - in do_with_child (rename_immediate newname) node path - -let update node path data = - let update_data data' node' name = - let child = find_or_fail node' name in - let child = { child with data=data' } in - replace node' child - in do_with_child (update_data data) node path - -let rec get node path = - match path with - | [] -> raise Empty_path - | [name] -> find_or_fail node name - | name :: names -> get (find_or_fail node name) names - -let get_data node path = data_of_node @@ get node path - -let exists node path = - try ignore (get node path); true - with Nonexistent_path -> false - -let get_existent_path node path = - let rec aux node path acc = - match path with - | [] -> acc - | name :: names -> - let child = find node name in - match child with - | None -> acc - | Some c -> aux c names (name :: acc) - in List.rev (aux node path []) - -let children_of_path node path = - let node' = get node path in - list_children node' - -let sorted_children_of_node cmp node = - let names = list_children node in - let names = List.sort cmp names in - List.map (find_or_fail node) names - -let copy node old_path new_path = - if exists node new_path then raise Duplicate_child else - let child = get node old_path in - insert ~position:End ~children:child.children node new_path child.data - -let move node path position = - let child = get node path in - let node = delete node path in - insert ~position:position ~children:child.children node path child.data diff --git a/src/vytree.mli b/src/vytree.mli deleted file mode 100644 index 451e130..0000000 --- a/src/vytree.mli +++ /dev/null @@ -1,50 +0,0 @@ -type 'a t [@@deriving yojson] - -exception Empty_path -exception Duplicate_child -exception Nonexistent_path -exception Insert_error of string - -type position = Before of string | After of string | End | Default - -val make : 'a -> string -> 'a t -val make_full : 'a -> string -> ('a t) list -> 'a t - -val name_of_node : 'a t -> string -val data_of_node : 'a t -> 'a -val children_of_node : 'a t -> 'a t list - -val find : 'a t -> string -> 'a t option -val find_or_fail : 'a t -> string -> 'a t - -val adopt : 'a t -> 'a t -> 'a t - -val insert : ?position:position -> ?children:('a t list) -> 'a t -> string list -> 'a -> 'a t - -val insert_multi_level : 'a -> 'a t -> string list -> string list -> 'a -> 'a t - -val merge_children : ('a -> 'a -> 'a) -> 'a t -> 'a t - -val delete : 'a t -> string list -> 'a t - -val update : 'a t -> string list -> 'a -> 'a t - -val rename : 'a t -> string list -> string -> 'a t - -val list_children : 'a t -> string list - -val get : 'a t -> string list -> 'a t - -val get_existent_path : 'a t -> string list -> string list - -val get_data : 'a t -> string list -> 'a - -val exists : 'a t -> string list -> bool - -val children_of_path : 'a t -> string list -> string list - -val sorted_children_of_node : (string -> string -> int) -> 'a t -> ('a t) list - -val copy : 'a t -> string list -> string list -> 'a t - -val move : 'a t -> string list -> position -> 'a t |