The configuration file can contain typos or various errors that could prevent
live update from succeeding (e.g. a flag only valid on a different version).
Unknown entries in the config file would be ignored on startup normally,
add a strict --config-test that live-update can use to check that the config file
is valid *for the new binary*.
Signed-off-by: Edwin Török <edvin.torok@citrix.com>
---
tools/ocaml/xenstored/parse_arg.ml | 4 ++++
tools/ocaml/xenstored/process.ml | 2 +-
tools/ocaml/xenstored/xenstored.ml | 9 +++++++--
3 files changed, 12 insertions(+), 3 deletions(-)
diff --git a/tools/ocaml/xenstored/parse_arg.ml b/tools/ocaml/xenstored/parse_arg.ml
index 965cb9ebeb..588970825f 100644
--- a/tools/ocaml/xenstored/parse_arg.ml
+++ b/tools/ocaml/xenstored/parse_arg.ml
@@ -26,6 +26,7 @@ type config =
restart: bool;
live_reload: bool;
disable_socket: bool;
+ config_test: bool;
}
let do_argv () =
@@ -38,6 +39,7 @@ let do_argv () =
and restart = ref false
and live_reload = ref false
and disable_socket = ref false
+ and config_test = ref false
in
let speclist =
@@ -55,6 +57,7 @@ let do_argv () =
("-T", Arg.Set_string tracefile, ""); (* for compatibility *)
("--restart", Arg.Set restart, "Read database on starting");
("--live", Arg.Set live_reload, "Read live dump on startup");
+ ("--config-test", Arg.Set config_test, "Test validity of config file");
("--disable-socket", Arg.Unit (fun () -> disable_socket := true), "Disable socket");
] in
let usage_msg = "usage : xenstored [--config-file <filename>] [--no-domain-init] [--help] [--no-fork] [--reraise-top-level] [--restart] [--disable-socket]" in
@@ -70,4 +73,5 @@ let do_argv () =
restart = !restart;
live_reload = !live_reload;
disable_socket = !disable_socket;
+ config_test = !config_test;
}
diff --git a/tools/ocaml/xenstored/process.ml b/tools/ocaml/xenstored/process.ml
index 27790d4a5c..d573c88685 100644
--- a/tools/ocaml/xenstored/process.ml
+++ b/tools/ocaml/xenstored/process.ml
@@ -121,7 +121,7 @@ let launch_exn t =
let validate_exn t =
(* --help must be last to check validity of earlier arguments *)
- let t' = {t with cmdline= t.cmdline @ ["--help"]} in
+ let t' = {t with cmdline= t.cmdline @ ["--config-test"]} in
let cmd = string_of_t t' in
debug "Executing %s" cmd ;
match Unix.fork () with
diff --git a/tools/ocaml/xenstored/xenstored.ml b/tools/ocaml/xenstored/xenstored.ml
index 2aa0dbc0e1..34e706910e 100644
--- a/tools/ocaml/xenstored/xenstored.ml
+++ b/tools/ocaml/xenstored/xenstored.ml
@@ -88,7 +88,7 @@ let default_pidfile = Paths.xen_run_dir ^ "/xenstored.pid"
let ring_scan_interval = ref 20
-let parse_config filename =
+let parse_config ?(strict=false) filename =
let pidfile = ref default_pidfile in
let options = [
("merge-activate", Config.Set_bool Transaction.do_coalesce);
@@ -126,11 +126,12 @@ let parse_config filename =
("xenstored-port", Config.Set_string Domains.xenstored_port); ] in
begin try Config.read filename options (fun _ _ -> raise Not_found)
with
- | Config.Error err -> List.iter (fun (k, e) ->
+ | Config.Error err as e -> List.iter (fun (k, e) ->
match e with
| "unknown key" -> eprintf "config: unknown key %s\n" k
| _ -> eprintf "config: %s: %s\n" k e
) err;
+ if strict then raise e
| Sys_error m -> eprintf "error: config: %s\n" m;
end;
!pidfile
@@ -408,6 +409,10 @@ end
let main () =
let cf = do_argv () in
+ if cf.config_test then begin
+ let _pidfile:string = parse_config ~strict:true (config_filename cf) in
+ exit 0
+ end;
let pidfile =
if Sys.file_exists (config_filename cf) then
parse_config (config_filename cf)
--
2.25.1