Implement serial console (mclu console ..)
authorRichard W.M. Jones <rjones@redhat.com>
Sat, 21 Mar 2015 22:02:15 +0000 (22:02 +0000)
committerRichard W.M. Jones <rjones@redhat.com>
Sat, 21 Mar 2015 22:02:15 +0000 (22:02 +0000)
Makefile.am
mclu.ml
mclu.pod
mclu_boot.ml
mclu_console.ml [new file with mode: 0644]
mclu_console.mli [new file with mode: 0644]
templates/rawhide.template

index 419189a..a3964ef 100644 (file)
@@ -28,6 +28,7 @@ EXTRA_DIST = \
 SOURCES_MLI = \
        mclu_boot.mli \
        mclu_conf.mli \
+       mclu_console.mli \
        mclu_list.mli \
        mclu_onoff.mli \
        mclu_status.mli \
@@ -46,6 +47,7 @@ SOURCES_ML = \
        mclu_status.ml \
        mclu_onoff.ml \
        mclu_boot.ml \
+       mclu_console.ml \
        mclu.ml
 
 OCAMLPACKAGES = -package unix,pcre,libvirt
diff --git a/mclu.ml b/mclu.ml
index 65e7e7b..2b34dac 100644 (file)
--- a/mclu.ml
+++ b/mclu.ml
@@ -52,6 +52,9 @@ let anon_fun, get_anon_args =
       | "boot" ->
         speclist := Mclu_boot.get_arg_speclist ();
         subcommand_run := Mclu_boot.run
+      | "console" ->
+        speclist := Mclu_console.get_arg_speclist ();
+        subcommand_run := Mclu_console.run
       | "list" ->
         speclist := Mclu_list.get_arg_speclist ();
         subcommand_run := Mclu_list.run
index 5c2a03f..9cfcf8f 100644 (file)
--- a/mclu.pod
+++ b/mclu.pod
@@ -78,6 +78,10 @@ is the number of physical CPUs, but not more than 4.
 
 =back
 
+=item B<mclu console [host:]guest>
+
+Connect to the serial console console of the named guest.
+
 =item B<mclu list [--active] [--all] [--templates]>
 
 List all active (running) guests and/or templates.  You can use
index 6927363..b4fb92f 100644 (file)
@@ -212,8 +212,11 @@ Try: `mclu on %s'\n" hostname hostname;
 " mac_addr network_model in
 
   let xml = xml ^ "\
+    <serial type='pty'>
+      <target port='0'/>
+    </serial>
     <console type='pty'>
-      <target type='virtio' port='0'/>
+      <target type='serial' port='0'/>
     </console>
     <input type='tablet' bus='usb'/>
     <input type='mouse' bus='ps2'/>
diff --git a/mclu_console.ml b/mclu_console.ml
new file mode 100644 (file)
index 0000000..5a1d3cb
--- /dev/null
@@ -0,0 +1,69 @@
+(* mclu: Mini Cloud
+ * Copyright (C) 2014-2015 Red Hat Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *)
+
+(* Implement 'mclu console'. *)
+
+open Printf
+
+open Utils
+
+let get_arg_speclist () = []
+
+let console ~verbose ?host name =
+  let nodes = Mclu_conf.nodes () in
+  let node =
+    match host with
+    | Some host ->
+      (try List.find (fun n -> host = n.Mclu_conf.hostname) nodes
+       with Not_found ->
+         eprintf "mclu: host '%s' not found\n" host;
+         exit 1)
+    | None ->
+      (* No 'host:' prefix given, so we need to find the host. *)
+      let guests = Mclu_list.active_guests ~verbose ~nodes () in
+      let node, _ =
+        try
+          List.find (
+            fun (node, doms) ->
+              List.exists (
+                fun dom ->
+                  name = dom.Mclu_list.dom_name
+              ) doms
+          ) guests
+        with
+          Not_found ->
+            eprintf "mclu: guest '%s' not found\n" name;
+            exit 1 in
+      node in
+
+  let uri = node.Mclu_conf.libvirt_uri in
+
+  let cmd = sprintf "virsh -c %s console %s" (quote uri) (quote name) in
+  if verbose then printf "%s\n%!" cmd;
+  if Sys.command cmd <> 0 then (
+    eprintf "mclu: %s: command failed\n" cmd;
+    exit 1
+  )
+
+let run ~verbose = function
+  | [ name ] ->
+    let host, name = name_parse name in
+    console ~verbose ?host name
+  | _ ->
+    eprintf "Usage: mclu boot <template> <[host:]name>\n";
+    exit 1
diff --git a/mclu_console.mli b/mclu_console.mli
new file mode 100644 (file)
index 0000000..46ae35e
--- /dev/null
@@ -0,0 +1,21 @@
+(* mclu: Mini Cloud
+ * Copyright (C) 2014-2015 Red Hat Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *)
+
+val get_arg_speclist : unit -> (Arg.key * Arg.spec * Arg.doc) list
+
+val run : verbose:bool -> string list -> unit
index d83d6e7..cbf8532 100755 (executable)
@@ -11,7 +11,9 @@ case "$1" in
     build)
         virt-builder "$2" --output "$3" --format "$4" \
                      --install fedora-repos-rawhide \
-                     --update
+                     --update \
+                     --root-password password:123456 \
+                     --selinux-relabel
         ;;
 
     base-image)