diff options
| author | John Estabrook <jestabro@vyos.io> | 2025-09-10 14:36:49 -0500 |
|---|---|---|
| committer | John Estabrook <jestabro@vyos.io> | 2025-09-10 14:46:33 -0500 |
| commit | 4a10cd92e8e5d3f7bf53c1a80c408c68073535c8 (patch) | |
| tree | 5292e3a1fd4b3d2d9012f7c3b55df4e437467cfa /src | |
| parent | a0a14ea1ee38ce78f7433b3a93f7eea61c8163fc (diff) | |
| download | vyconf-4a10cd92e8e5d3f7bf53c1a80c408c68073535c8.tar.gz vyconf-4a10cd92e8e5d3f7bf53c1a80c408c68073535c8.zip | |
T7737: provide session pid, user, sudo_user to vyos-commitd
Send vyconfd session pid and client env vars to vyos-commitd for use in
config mode scripts.
Diffstat (limited to 'src')
| -rw-r--r-- | src/commit.ml | 54 | ||||
| -rw-r--r-- | src/commit.mli | 7 | ||||
| -rw-r--r-- | src/session.ml | 4 | ||||
| -rw-r--r-- | src/session.mli | 2 | ||||
| -rw-r--r-- | src/vycall_client.ml | 3 | ||||
| -rw-r--r-- | src/vycall_pbt.ml | 72 | ||||
| -rw-r--r-- | src/vycall_pbt.mli | 6 | ||||
| -rw-r--r-- | src/vyconfd.ml | 11 |
8 files changed, 114 insertions, 45 deletions
diff --git a/src/commit.ml b/src/commit.ml index 8913ceb..7b04c36 100644 --- a/src/commit.ml +++ b/src/commit.ml @@ -12,10 +12,20 @@ let tree_source_to_yojson = function | ADD -> `String "ADD" type status = { - success : bool; - out : string; + success : bool; + out : string; } [@@deriving to_yojson] +let default_status = { + success = true; + out = ""; +} + +let fail_status msg = + { success = false; + out = msg; + } + type node_data = { script_name: string; priority: int; @@ -39,6 +49,9 @@ let default_node_data = { type commit_data = { session_id: string; + session_pid: int32; + sudo_user: string; + user: string; dry_run: bool; atomic: bool; background: bool; @@ -49,21 +62,6 @@ type commit_data = { result : status; } [@@deriving to_yojson] -let default_commit_data = { - session_id = ""; - dry_run = false; - atomic = false; - background = false; - init = None; - node_list = []; - config_diff = CT.default; - config_result = CT.default; - result = { success = true; out = ""; }; -} - -let fail_status msg = - { success=false; out=msg } - let lex_order c1 c2 = let c = Vyos1x.Util.lex_order c1.path c2.path in match c with @@ -224,25 +222,31 @@ let config_result_update c_data n_data = let commit_update c_data = match c_data.init with | None -> - { default_commit_data with - init=Some (fail_status "commitd failure: no init status provided") + { c_data with + init = Some (fail_status "commitd failure: no init status provided") } | Some _ -> let func acc_data nd = match nd.reply with | None -> - { default_commit_data with - init=Some (fail_status"commitd failure: no reply status provided") + { c_data with + init = Some (fail_status "commitd failure: no reply status provided") } | Some _ -> config_result_update acc_data nd in List.fold_left func c_data c_data.node_list -let make_commit_data ?(dry_run=false) rt at wt id = +let make_commit_data ?(dry_run=false) rt at wt id pid sudo_user user = let diff = CD.diff_tree [] at wt in let del_list, add_list = calculate_priority_lists rt diff in - { default_commit_data with - session_id = id; + { session_id = id; + session_pid = pid; + sudo_user = sudo_user; + user = user; dry_run = dry_run; + atomic = false; + background = false; + init = None; config_diff = diff; config_result = CT.get_subtree diff ["inter"]; - node_list = del_list @ add_list; } + node_list = del_list @ add_list; + result = default_status; } diff --git a/src/commit.mli b/src/commit.mli index 01022ec..ee38768 100644 --- a/src/commit.mli +++ b/src/commit.mli @@ -17,6 +17,9 @@ type node_data = { type commit_data = { session_id: string; + session_pid: int32; + sudo_user: string; + user: string; dry_run: bool; atomic: bool; background: bool; @@ -33,9 +36,7 @@ val tree_source_to_yojson : tree_source -> [> `String of string ] val default_node_data : node_data -val default_commit_data : commit_data - -val make_commit_data : ?dry_run:bool -> Vyos1x.Reference_tree.t -> Vyos1x.Config_tree.t -> Vyos1x.Config_tree.t -> string -> commit_data +val make_commit_data : ?dry_run:bool -> Vyos1x.Reference_tree.t -> Vyos1x.Config_tree.t -> Vyos1x.Config_tree.t -> string -> int32 -> string -> string -> commit_data val calculate_priority_lists : Vyos1x.Reference_tree.t -> Vyos1x.Config_tree.t -> node_data list * node_data list diff --git a/src/session.ml b/src/session.ml index 23c3d19..5fd20b5 100644 --- a/src/session.ml +++ b/src/session.ml @@ -191,7 +191,7 @@ let save w s file = | Error e -> raise (Session_error (Printf.sprintf "Error saving config: %s" e)) | Ok () -> s -let prepare_commit ?(dry_run=false) w config id = +let prepare_commit ?(dry_run=false) w config id pid sudo_user user = let at = w.running_config in let rt = w.reference_tree in let vc = w.vyconf_config in @@ -207,7 +207,7 @@ let prepare_commit ?(dry_run=false) w config id = with Vyos1x.Internal.Write_error msg -> raise (Session_error msg) in - CC.make_commit_data ~dry_run:dry_run rt at config id + CC.make_commit_data ~dry_run:dry_run rt at config id pid sudo_user user let get_config w s id = let at = w.running_config in diff --git a/src/session.mli b/src/session.mli index 5dbbaf0..fc2acf4 100644 --- a/src/session.mli +++ b/src/session.mli @@ -56,7 +56,7 @@ val list_children : world -> session_data -> string list -> string list val string_of_op : cfg_op -> string -val prepare_commit : ?dry_run:bool -> world -> Vyos1x.Config_tree.t -> string -> Commitd_client.Commit.commit_data +val prepare_commit : ?dry_run:bool -> world -> Vyos1x.Config_tree.t -> string -> int32 -> string -> string -> Commitd_client.Commit.commit_data val get_config : world -> session_data -> string -> string diff --git a/src/vycall_client.ml b/src/vycall_client.ml index 11bbe3f..515f5df 100644 --- a/src/vycall_client.ml +++ b/src/vycall_client.ml @@ -31,6 +31,9 @@ let call_to_node_data ((c: call), (nd: node_data)) = let commit_data_to_commit_proto cd = { session_id = cd.session_id; + session_pid = cd.session_pid; + sudo_user = cd.sudo_user; + user = cd.user; dry_run = cd.dry_run; atomic = cd.atomic; background = cd.background; diff --git a/src/vycall_pbt.ml b/src/vycall_pbt.ml index 715c453..89d2c67 100644 --- a/src/vycall_pbt.ml +++ b/src/vycall_pbt.ml @@ -14,6 +14,9 @@ type call = { type commit = { session_id : string; + session_pid : int32; + sudo_user : string; + user : string; dry_run : bool; atomic : bool; background : bool; @@ -43,6 +46,9 @@ let rec default_call let rec default_commit ?session_id:((session_id:string) = "") + ?session_pid:((session_pid:int32) = 0l) + ?sudo_user:((sudo_user:string) = "") + ?user:((user:string) = "") ?dry_run:((dry_run:bool) = false) ?atomic:((atomic:bool) = false) ?background:((background:bool) = false) @@ -50,6 +56,9 @@ let rec default_commit ?calls:((calls:call list) = []) () : commit = { session_id; + session_pid; + sudo_user; + user; dry_run; atomic; background; @@ -83,6 +92,9 @@ let default_call_mutable () : call_mutable = { type commit_mutable = { mutable session_id : string; + mutable session_pid : int32; + mutable sudo_user : string; + mutable user : string; mutable dry_run : bool; mutable atomic : bool; mutable background : bool; @@ -92,6 +104,9 @@ type commit_mutable = { let default_commit_mutable () : commit_mutable = { session_id = ""; + session_pid = 0l; + sudo_user = ""; + user = ""; dry_run = false; atomic = false; background = false; @@ -122,6 +137,9 @@ let rec pp_call fmt (v:call) = let rec pp_commit fmt (v:commit) = let pp_i fmt () = Pbrt.Pp.pp_record_field ~first:true "session_id" Pbrt.Pp.pp_string fmt v.session_id; + Pbrt.Pp.pp_record_field ~first:false "session_pid" Pbrt.Pp.pp_int32 fmt v.session_pid; + Pbrt.Pp.pp_record_field ~first:false "sudo_user" Pbrt.Pp.pp_string fmt v.sudo_user; + Pbrt.Pp.pp_record_field ~first:false "user" Pbrt.Pp.pp_string fmt v.user; Pbrt.Pp.pp_record_field ~first:false "dry_run" Pbrt.Pp.pp_bool fmt v.dry_run; Pbrt.Pp.pp_record_field ~first:false "atomic" Pbrt.Pp.pp_bool fmt v.atomic; Pbrt.Pp.pp_record_field ~first:false "background" Pbrt.Pp.pp_bool fmt v.background; @@ -167,21 +185,27 @@ let rec encode_pb_call (v:call) encoder = let rec encode_pb_commit (v:commit) encoder = Pbrt.Encoder.string v.session_id encoder; Pbrt.Encoder.key 1 Pbrt.Bytes encoder; + Pbrt.Encoder.int32_as_varint v.session_pid encoder; + Pbrt.Encoder.key 2 Pbrt.Varint encoder; + Pbrt.Encoder.string v.sudo_user encoder; + Pbrt.Encoder.key 3 Pbrt.Bytes encoder; + Pbrt.Encoder.string v.user encoder; + Pbrt.Encoder.key 4 Pbrt.Bytes encoder; Pbrt.Encoder.bool v.dry_run encoder; - Pbrt.Encoder.key 4 Pbrt.Varint encoder; - Pbrt.Encoder.bool v.atomic encoder; Pbrt.Encoder.key 5 Pbrt.Varint encoder; - Pbrt.Encoder.bool v.background encoder; + Pbrt.Encoder.bool v.atomic encoder; Pbrt.Encoder.key 6 Pbrt.Varint encoder; + Pbrt.Encoder.bool v.background encoder; + Pbrt.Encoder.key 7 Pbrt.Varint encoder; begin match v.init with | Some x -> Pbrt.Encoder.nested encode_pb_status x encoder; - Pbrt.Encoder.key 7 Pbrt.Bytes encoder; + Pbrt.Encoder.key 8 Pbrt.Bytes encoder; | None -> (); end; Pbrt.List_util.rev_iter_with (fun x encoder -> Pbrt.Encoder.nested encode_pb_call x encoder; - Pbrt.Encoder.key 8 Pbrt.Bytes encoder; + Pbrt.Encoder.key 9 Pbrt.Bytes encoder; ) v.calls encoder; () @@ -261,6 +285,9 @@ let rec decode_pb_commit d = let background_is_set = ref false in let atomic_is_set = ref false in let dry_run_is_set = ref false in + let user_is_set = ref false in + let sudo_user_is_set = ref false in + let session_pid_is_set = ref false in let session_id_is_set = ref false in while !continue__ do match Pbrt.Decoder.key d with @@ -272,39 +299,60 @@ let rec decode_pb_commit d = end | Some (1, pk) -> Pbrt.Decoder.unexpected_payload "Message(commit), field(1)" pk - | Some (4, Pbrt.Varint) -> begin - v.dry_run <- Pbrt.Decoder.bool d; dry_run_is_set := true; + | Some (2, Pbrt.Varint) -> begin + v.session_pid <- Pbrt.Decoder.int32_as_varint d; session_pid_is_set := true; + end + | Some (2, pk) -> + Pbrt.Decoder.unexpected_payload "Message(commit), field(2)" pk + | Some (3, Pbrt.Bytes) -> begin + v.sudo_user <- Pbrt.Decoder.string d; sudo_user_is_set := true; + end + | Some (3, pk) -> + Pbrt.Decoder.unexpected_payload "Message(commit), field(3)" pk + | Some (4, Pbrt.Bytes) -> begin + v.user <- Pbrt.Decoder.string d; user_is_set := true; end | Some (4, pk) -> Pbrt.Decoder.unexpected_payload "Message(commit), field(4)" pk | Some (5, Pbrt.Varint) -> begin - v.atomic <- Pbrt.Decoder.bool d; atomic_is_set := true; + v.dry_run <- Pbrt.Decoder.bool d; dry_run_is_set := true; end | Some (5, pk) -> Pbrt.Decoder.unexpected_payload "Message(commit), field(5)" pk | Some (6, Pbrt.Varint) -> begin - v.background <- Pbrt.Decoder.bool d; background_is_set := true; + v.atomic <- Pbrt.Decoder.bool d; atomic_is_set := true; end | Some (6, pk) -> Pbrt.Decoder.unexpected_payload "Message(commit), field(6)" pk - | Some (7, Pbrt.Bytes) -> begin - v.init <- Some (decode_pb_status (Pbrt.Decoder.nested d)); + | Some (7, Pbrt.Varint) -> begin + v.background <- Pbrt.Decoder.bool d; background_is_set := true; end | Some (7, pk) -> Pbrt.Decoder.unexpected_payload "Message(commit), field(7)" pk | Some (8, Pbrt.Bytes) -> begin - v.calls <- (decode_pb_call (Pbrt.Decoder.nested d)) :: v.calls; + v.init <- Some (decode_pb_status (Pbrt.Decoder.nested d)); end | Some (8, pk) -> Pbrt.Decoder.unexpected_payload "Message(commit), field(8)" pk + | Some (9, Pbrt.Bytes) -> begin + v.calls <- (decode_pb_call (Pbrt.Decoder.nested d)) :: v.calls; + end + | Some (9, pk) -> + Pbrt.Decoder.unexpected_payload "Message(commit), field(9)" pk | Some (_, payload_kind) -> Pbrt.Decoder.skip d payload_kind done; begin if not !background_is_set then Pbrt.Decoder.missing_field "background" end; begin if not !atomic_is_set then Pbrt.Decoder.missing_field "atomic" end; begin if not !dry_run_is_set then Pbrt.Decoder.missing_field "dry_run" end; + begin if not !user_is_set then Pbrt.Decoder.missing_field "user" end; + begin if not !sudo_user_is_set then Pbrt.Decoder.missing_field "sudo_user" end; + begin if not !session_pid_is_set then Pbrt.Decoder.missing_field "session_pid" end; begin if not !session_id_is_set then Pbrt.Decoder.missing_field "session_id" end; ({ session_id = v.session_id; + session_pid = v.session_pid; + sudo_user = v.sudo_user; + user = v.user; dry_run = v.dry_run; atomic = v.atomic; background = v.background; diff --git a/src/vycall_pbt.mli b/src/vycall_pbt.mli index f389302..fd39a0c 100644 --- a/src/vycall_pbt.mli +++ b/src/vycall_pbt.mli @@ -21,6 +21,9 @@ type call = { type commit = { session_id : string; + session_pid : int32; + sudo_user : string; + user : string; dry_run : bool; atomic : bool; background : bool; @@ -49,6 +52,9 @@ val default_call : val default_commit : ?session_id:string -> + ?session_pid:int32 -> + ?sudo_user:string -> + ?user:string -> ?dry_run:bool -> ?atomic:bool -> ?background:bool -> diff --git a/src/vyconfd.ml b/src/vyconfd.ml index 0a0d246..707ce4b 100644 --- a/src/vyconfd.ml +++ b/src/vyconfd.ml @@ -245,8 +245,15 @@ let commit world token (req: request_commit) = let s = find_session token in let proposed_config = Session.get_proposed_config world s in let req_dry_run = Option.value req.dry_run ~default:false in - - let commit_data = Session.prepare_commit ~dry_run:req_dry_run world proposed_config token + let commit_data = + Session.prepare_commit + ~dry_run:req_dry_run + world + proposed_config + token + s.client_pid + s.client_sudo_user + s.client_user in let%lwt received_commit_data = VC.do_commit commit_data in let%lwt result_commit_data = |
