summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/session.ml60
-rw-r--r--src/session.mli6
-rw-r--r--src/vyconfd.ml15
3 files changed, 55 insertions, 26 deletions
diff --git a/src/session.ml b/src/session.ml
index 5f70feb..f5fff2f 100644
--- a/src/session.ml
+++ b/src/session.ml
@@ -251,23 +251,51 @@ 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 pid sudo_user user =
- let at = w.running_config in
- let rt = w.reference_tree in
+let write_running_cache w =
let vc = w.vyconf_config in
- let () =
- try
- IC.write_internal at (FP.concat vc.session_dir vc.running_cache)
- with
- Vyos1x.Internal.Write_error msg -> raise (Session_error msg)
- in
- let () =
- try
- IC.write_internal config (FP.concat vc.session_dir vc.session_cache)
- with
- Vyos1x.Internal.Write_error msg -> raise (Session_error msg)
- in
- CC.make_commit_data ~dry_run:dry_run rt at config id pid sudo_user user
+ try
+ let () =
+ IC.write_internal_atomic
+ w.running_config
+ (FP.concat vc.session_dir vc.running_cache);
+ in Ok ()
+ with
+ Vyos1x.Internal.Write_error msg ->
+ let msg =
+ Printf.sprintf "Write error caching running config: %s" msg
+ in Error msg
+
+let write_session_cache w config =
+ let vc = w.vyconf_config in
+ try
+ let () =
+ IC.write_internal
+ config
+ (FP.concat vc.session_dir vc.session_cache);
+ in Ok ()
+ with
+ Vyos1x.Internal.Write_error msg ->
+ let msg =
+ Printf.sprintf "Write error caching session config: %s" msg
+ in Error msg
+
+let prepare_commit ?(dry_run=false) w s config id =
+ let opt_running = write_running_cache w in
+ let opt_session = write_session_cache w config in
+ match opt_running, opt_session with
+ | Ok (), Ok () ->
+ Ok (CC.make_commit_data
+ ~dry_run:dry_run
+ w.reference_tree
+ w.running_config
+ config
+ id
+ s.client_pid
+ s.client_sudo_user
+ s.client_user)
+ | Error msg, Ok () -> Error msg
+ | Ok (), Error msg -> Error msg
+ | Error msg1, Error msg2 -> Error (Printf.sprintf "%s\n %s" msg1 msg2)
let post_process_commit w s ((c_data: CC.commit_data), proposed_config) =
let ident n v y =
diff --git a/src/session.mli b/src/session.mli
index a08f873..1750f6c 100644
--- a/src/session.mli
+++ b/src/session.mli
@@ -69,7 +69,11 @@ 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 -> int32 -> string -> string -> Commitd_client.Commit.commit_data
+val write_running_cache : world -> (unit, string) result
+
+val write_session_cache : world -> Vyos1x.Config_tree.t -> (unit, string) result
+
+val prepare_commit : ?dry_run:bool -> world -> session_data -> Vyos1x.Config_tree.t -> string -> (Commitd_client.Commit.commit_data, string) result
val post_process_commit : world -> session_data -> Commitd_client.Commit.commit_data * Vyos1x.Config_tree.t -> Vyos1x.Config_tree.t * Vyos1x.Config_tree.t
diff --git a/src/vyconfd.ml b/src/vyconfd.ml
index 05cd693..1d270ab 100644
--- a/src/vyconfd.ml
+++ b/src/vyconfd.ml
@@ -274,16 +274,13 @@ let commit world token (req: request_commit) =
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
- s.client_pid
- s.client_sudo_user
- s.client_user
+ Session.prepare_commit ~dry_run:req_dry_run world s proposed_config token
in
- let%lwt received_commit_data = VC.do_commit commit_data in
+ match commit_data with
+ | Error msg ->
+ Lwt.return {response_tmpl with status=Internal_error; error=(Some msg)}
+ | Ok c_data ->
+ let%lwt received_commit_data = VC.do_commit c_data in
let%lwt result_commit_data =
Lwt.return (CC.commit_update received_commit_data)
in