(* Where we upload the template and image on remote. *)
let format, extension = "qcow2", "qcow2" in
- let remote_filename = sprintf "/tmp/mclu%s.sh" (string_random8 ()) in
+ let remote_template = sprintf "/tmp/mclu%s.sh" (string_random8 ()) in
+ let remote_template_wrapper = sprintf "/tmp/mclu%s.sh" (string_random8 ()) in
let remote_image = sprintf "/var/tmp/%s.%s" name extension in
(* Get ready to generate the guest XML. *)
</devices>
</domain>" in
- (* Copy the template to remote and build the guest. *)
+ (* Copy the template to remote. *)
let cmd =
sprintf "scp %s root@%s:%s"
- (quote template_filename) (quote hostname) remote_filename in
+ (quote template_filename) (quote hostname) remote_template in
if verbose then printf "%s\n%!" cmd;
if Sys.command cmd <> 0 then (
eprintf "mclu: scp template to remote failed\n";
exit 1
);
- let cmd =
+
+ (* Create a wrapper script that sets the variables and runs the
+ * template. This just avoids complex quoting.
+ *)
+ let () =
+ let chan = open_out remote_template_wrapper in
+ let fpf fs = fprintf chan fs in
+ fpf "#!/bin/sh\n";
(* XXX Don't hard-code network_bridge here. *)
- sprintf "ssh root@%s \
-LIBGUESTFS_BACKEND_SETTINGS=network_bridge=br0 \
-base_image=%s \
-format=%s \
-name=%s \
-output=%s \
-%s \
-%s \
-%s build"
- (quote hostname)
- (quote template_info.Template.base_image) (* base_image *)
- format (* format *)
- name (* name *)
- (quote remote_image) (* output *)
- (match !size with
- | 0L -> ""
- | size -> sprintf "size=%Ldb" size) (* size *)
- (match !timezone with
- | "" -> ""
- | tz -> quote "timezone=" ^ tz) (* timezone *)
- remote_filename in
+ fpf "export LIBGUESTFS_BACKEND_SETTINGS=network_bridge=br0\n";
+ fpf "export base_image=%s\n" (quote template_info.Template.base_image);
+ fpf "export format=%s\n" (quote format);
+ fpf "export name=%s\n" (quote name);
+ fpf "export output=%s\n" (quote remote_image);
+ (match !size with
+ | 0L -> ()
+ | size -> fpf "export size=%s\n" (quote (sprintf "--size %Ldb" size))
+ );
+ (match !timezone with
+ | "" -> ()
+ | tz -> fpf "export timezone=%s\n" (quote (sprintf "--timezone %s" tz))
+ );
+ fpf "%s build\n" remote_template;
+ close_out chan;
+ Unix.chmod remote_template_wrapper 0o755 in
+
+ let cmd =
+ sprintf "scp %s root@%s:%s"
+ (quote remote_template_wrapper) (quote hostname)
+ (quote remote_template_wrapper) in
+ if verbose then printf "%s\n%!" cmd;
+ if Sys.command cmd <> 0 then (
+ eprintf "mclu: scp template wrapper to remote failed\n";
+ exit 1
+ );
+
+ let cmd =
+ sprintf "ssh root@%s %s" (quote hostname) (quote remote_template_wrapper) in
if verbose then printf "%s\n%!" cmd;
if Sys.command cmd <> 0 then (
eprintf "mclu: remote build failed\n";