mclu boot: Add --size and --timezone options.
[mclu.git] / mclu_boot.ml
index b4fb92f..a253981 100644 (file)
@@ -33,13 +33,28 @@ let set_memory s =
     eprintf "mclu: don't understand --memory parameter '%s'
 Try something like --memory 1G\n" s;
     exit 1
+let size = ref 0L                       (* 0 = default *)
+let set_size s =
+  try size := bytes_of_human_size s
+  with Not_found ->
+    eprintf "mclu: don't understand --size parameter '%s'
+Try something like --size 20G\n" s;
+    exit 1
+let timezone = ref ""                   (* "" = no timezone set *)
 let vcpus = ref 0                       (* 0 = choose for me *)
 
+let open_console = ref false
+let open_viewer = ref false
+
 let get_arg_speclist () = Arg.align [
+  "--console",  Arg.Set open_console, " Open the serial console";
   "--cpus",     Arg.Set_int vcpus, "n Number of virtual CPUs";
   "--memory",   Arg.String set_memory, "nnG Amount of RAM to give guest";
   "--ram",      Arg.String set_memory, "nnG Amount of RAM to give guest";
+  "--size",     Arg.String set_size, "nnG Size of disk to give guest";
+  "--timezone", Arg.Set_string timezone, "TZ Set timezone of guest";
   "--vcpus",    Arg.Set_int vcpus, "n Number of virtual CPUs";
+  "--viewer",   Arg.Set open_viewer, " Open the graphical console";
 ]
 
 let boot ~verbose template name =
@@ -239,10 +254,27 @@ Try: `mclu on %s'\n" hostname hostname;
   );
   let cmd =
     (* XXX Don't hard-code network_bridge here. *)
-    sprintf "ssh root@%s LIBGUESTFS_BACKEND_SETTINGS=network_bridge=br0 %s build %s %s %s"
-      (quote hostname) remote_filename
-      (quote template_info.Template.base_image) (quote remote_image)
-      format in
+    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
   if verbose then printf "%s\n%!" cmd;
   if Sys.command cmd <> 0 then (
     eprintf "mclu: remote build failed\n";
@@ -250,15 +282,25 @@ Try: `mclu on %s'\n" hostname hostname;
   );
 
   (* Start the guest. *)
-  try
-    let conn =
-      let name = node.MS.node_status.MS.node.Mclu_conf.libvirt_uri in
-      C.connect ~name () in
-    let dom = D.create_xml conn xml [] in
-    printf "mclu: %s:%s started\n" hostname (D.get_name dom)
-  with Libvirt.Virterror msg ->
-    eprintf "mclu: %s: %s\n" hostname (Libvirt.Virterror.to_string msg);
-    exit 1
+  let dom =
+    try
+      let conn =
+        let name = node.MS.node_status.MS.node.Mclu_conf.libvirt_uri in
+        C.connect ~name () in
+      let dom = D.create_xml conn xml [] in
+      printf "mclu: %s:%s started\n" hostname (D.get_name dom);
+      dom
+    with Libvirt.Virterror msg ->
+      eprintf "mclu: %s: %s\n" hostname (Libvirt.Virterror.to_string msg);
+      exit 1 in
+
+  (* Graphical console? *)
+  if !open_viewer then
+    Mclu_viewer.viewer ~verbose ~host:hostname (D.get_name dom);
+
+  (* Serial console?  (Interactive, so run it last) *)
+  if !open_console then
+    Mclu_console.console ~verbose ~host:hostname (D.get_name dom)
 
 let run ~verbose = function
   | [ template; name ] ->