summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Estabrook <jestabro@vyos.io>2025-09-10 14:36:49 -0500
committerJohn Estabrook <jestabro@vyos.io>2025-09-10 14:46:33 -0500
commit4a10cd92e8e5d3f7bf53c1a80c408c68073535c8 (patch)
tree5292e3a1fd4b3d2d9012f7c3b55df4e437467cfa /src
parenta0a14ea1ee38ce78f7433b3a93f7eea61c8163fc (diff)
downloadvyconf-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.ml54
-rw-r--r--src/commit.mli7
-rw-r--r--src/session.ml4
-rw-r--r--src/session.mli2
-rw-r--r--src/vycall_client.ml3
-rw-r--r--src/vycall_pbt.ml72
-rw-r--r--src/vycall_pbt.mli6
-rw-r--r--src/vyconfd.ml11
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 =