From 030a9cb8022b83bf43ec14dfbafd943299bc01c4 Mon Sep 17 00:00:00 2001 From: Stephen Shirley <diamond@google.com> Date: Thu, 23 Jun 2011 11:42:23 +0200 Subject: [PATCH] Adding a wrapper around "xm console" The wrapper will connect to the console, and check in the background if the instance is paused, unpausing it as necessary. Signed-off-by: Stephen Shirley <diamond@google.com> Reviewed-by: Michael Hanselmann <hansmi@google.com> --- Makefile.am | 1 + lib/constants.py | 1 + lib/hypervisor/hv_xen.py | 3 ++- tools/xm-console-wrapper | 37 +++++++++++++++++++++++++++++++++++++ 4 files changed, 41 insertions(+), 1 deletion(-) create mode 100755 tools/xm-console-wrapper diff --git a/Makefile.am b/Makefile.am index 20f82939d..8e3d28970 100644 --- a/Makefile.am +++ b/Makefile.am @@ -495,6 +495,7 @@ nodist_pkglib_python_scripts = \ pkglib_SCRIPTS = \ daemons/daemon-util \ tools/kvm-ifup \ + tools/xm-console-wrapper \ $(pkglib_python_scripts) nodist_pkglib_SCRIPTS = \ diff --git a/lib/constants.py b/lib/constants.py index d2450c630..75589bf83 100644 --- a/lib/constants.py +++ b/lib/constants.py @@ -144,6 +144,7 @@ QUEUE_DIR = DATA_DIR + "/queue" DAEMON_UTIL = _autoconf.PKGLIBDIR + "/daemon-util" SETUP_SSH = _autoconf.TOOLSDIR + "/setup-ssh" KVM_IFUP = _autoconf.PKGLIBDIR + "/kvm-ifup" +XM_CONSOLE_WRAPPER = _autoconf.PKGLIBDIR + "/xm-console-wrapper" ETC_HOSTS = "/etc/hosts" DEFAULT_FILE_STORAGE_DIR = _autoconf.FILE_STORAGE_DIR DEFAULT_SHARED_FILE_STORAGE_DIR = _autoconf.SHARED_FILE_STORAGE_DIR diff --git a/lib/hypervisor/hv_xen.py b/lib/hypervisor/hv_xen.py index dcb718773..33127efc4 100644 --- a/lib/hypervisor/hv_xen.py +++ b/lib/hypervisor/hv_xen.py @@ -303,7 +303,8 @@ class XenHypervisor(hv_base.BaseHypervisor): kind=constants.CONS_SSH, host=instance.primary_node, user=constants.GANETI_RUNAS, - command=["xm", "console", instance.name]) + command=[constants.XM_CONSOLE_WRAPPER, + instance.name]) def Verify(self): """Verify the hypervisor. diff --git a/tools/xm-console-wrapper b/tools/xm-console-wrapper new file mode 100755 index 000000000..540a62d42 --- /dev/null +++ b/tools/xm-console-wrapper @@ -0,0 +1,37 @@ +#!/bin/bash + +# Copyright (C) 2011 Google 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. + +INSTANCE="$1" + +unpause() { + ispaused=$(xm list -l "$INSTANCE" 2>/dev/null | + sed -n 's/^[[:blank:]]*(state ..\(.\)...)/\1/p') + [[ "$ispaused" == "p" ]] || return + # As there is no way to be sure when xm console has actually connected to the + # instance, sleep for a few seconds before unpausing the instance. This is a + # tradeoff between missing some console output if the node is overloaded and + # making the user wait everytime when the node isn't so busy. + sleep 3 + # Send \r\n after notice as terminal is in raw mode + printf "Instance $INSTANCE is paused, unpausing\r\n" + xm unpause "$INSTANCE" +} + +unpause & +exec xm console "$INSTANCE" -- GitLab