From 925be79f3065e383cbc532ebd637652999a9671e Mon Sep 17 00:00:00 2001 From: "Richard W.M. Jones" Date: Sat, 21 Mar 2015 22:02:15 +0000 Subject: [PATCH] Implement serial console (mclu console ..) --- Makefile.am | 2 ++ mclu.ml | 3 ++ mclu.pod | 4 +++ mclu_boot.ml | 5 +++- mclu_console.ml | 69 ++++++++++++++++++++++++++++++++++++++++++++++ mclu_console.mli | 21 ++++++++++++++ templates/rawhide.template | 4 ++- 7 files changed, 106 insertions(+), 2 deletions(-) create mode 100644 mclu_console.ml create mode 100644 mclu_console.mli diff --git a/Makefile.am b/Makefile.am index 419189a..a3964ef 100644 --- a/Makefile.am +++ b/Makefile.am @@ -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 --- 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 diff --git a/mclu.pod b/mclu.pod index 5c2a03f..9cfcf8f 100644 --- a/mclu.pod +++ b/mclu.pod @@ -78,6 +78,10 @@ is the number of physical CPUs, but not more than 4. =back +=item B + +Connect to the serial console console of the named guest. + =item B List all active (running) guests and/or templates. You can use diff --git a/mclu_boot.ml b/mclu_boot.ml index 6927363..b4fb92f 100644 --- a/mclu_boot.ml +++ b/mclu_boot.ml @@ -212,8 +212,11 @@ Try: `mclu on %s'\n" hostname hostname; " mac_addr network_model in let xml = xml ^ "\ + + + - + diff --git a/mclu_console.ml b/mclu_console.ml new file mode 100644 index 0000000..5a1d3cb --- /dev/null +++ b/mclu_console.ml @@ -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