From: "Philippe Mathieu-Daudé" <philmd@redhat.com>
To: Gerd Hoffmann <kraxel@redhat.com>, qemu-devel@nongnu.org
Cc: "Fam Zheng" <fam@euphon.net>, "Ed Maste" <emaste@freebsd.org>,
"Kamil Rytarowski" <kamil@netbsd.org>,
"Alex Bennée" <alex.bennee@linaro.org>,
"Li-Wen Hsu" <lwhsu@freebsd.org>,
"Brad Smith" <brad@comstyle.com>
Subject: Re: [Qemu-devel] [PATCH v3 09/14] tests/vm: serial console support helpers
Date: Wed, 29 May 2019 13:31:03 +0200 [thread overview]
Message-ID: <a8840cb8-7a74-5d32-c54f-eca206bd6ef6@redhat.com> (raw)
In-Reply-To: <20190520124716.30472-10-kraxel@redhat.com>
Hi Gerd,
On 5/20/19 2:47 PM, Gerd Hoffmann wrote:
> Add a bunch of helpers to talk to the guest using the
> serial console.
>
> Also drop the hard-coded -serial parameter for the vm
> so QEMUMachine.set_console() actually works.
>
> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
> Tested-by: Thomas Huth <thuth@redhat.com>
> ---
> tests/vm/basevm.py | 85 ++++++++++++++++++++++++++++++++++++++++++++--
> 1 file changed, 82 insertions(+), 3 deletions(-)
>
> diff --git a/tests/vm/basevm.py b/tests/vm/basevm.py
> index 465c7b80d011..17281eaf99e4 100755
> --- a/tests/vm/basevm.py
> +++ b/tests/vm/basevm.py
> @@ -2,10 +2,11 @@
> #
> # VM testing base class
> #
> -# Copyright 2017 Red Hat Inc.
> +# Copyright 2017-2019 Red Hat Inc.
> #
> # Authors:
> # Fam Zheng <famz@redhat.com>
> +# Gerd Hoffmann <kraxel@redhat.com>
> #
> # This code is licensed under the GPL version 2 or later. See
> # the COPYING file in the top-level directory.
> @@ -13,7 +14,9 @@
>
> from __future__ import print_function
> import os
> +import re
> import sys
> +import socket
> import logging
> import time
> import datetime
> @@ -79,8 +82,7 @@ class BaseVM(object):
> "-cpu", "max",
> "-netdev", "user,id=vnet,hostfwd=:127.0.0.1:0-:22",
> "-device", "virtio-net-pci,netdev=vnet",
> - "-vnc", "127.0.0.1:0,to=20",
> - "-serial", "file:%s" % os.path.join(self._tmpdir, "serial.out")]
> + "-vnc", "127.0.0.1:0,to=20"]
> if vcpus and vcpus > 1:
> self._args += ["-smp", "%d" % vcpus]
> if kvm_available(self.arch):
> @@ -161,6 +163,8 @@ class BaseVM(object):
> logging.debug("QEMU args: %s", " ".join(args))
> qemu_bin = os.environ.get("QEMU", "qemu-system-" + self.arch)
> guest = QEMUMachine(binary=qemu_bin, args=args)
> + guest.set_machine('pc')
This line broke another series I'm working on, I suggest amending:
-- >8 --
--- a/tests/vm/basevm.py
+++ b/tests/vm/basevm.py
@@ -154,7 +154,7 @@ class BaseVM(object):
"-device",
"virtio-blk,drive=%s,serial=%s,bootindex=1"
% (name, name)]
- def boot(self, img, extra_args=[]):
+ def boot(self, img, machine='pc', extra_args=[]):
args = self._args + [
"-device", "VGA",
"-drive", "file=%s,if=none,id=drive0,cache=writeback" % img,
@@ -163,7 +163,7 @@ class BaseVM(object):
logging.debug("QEMU args: %s", " ".join(args))
qemu_bin = os.environ.get("QEMU", "qemu-system-" + self.arch)
guest = QEMUMachine(binary=qemu_bin, args=args)
- guest.set_machine('pc')
+ guest.set_machine(machine)
guest.set_console()
try:
guest.launch()
---
Anyway I can do it in a separate patch too, so:
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>
> + guest.set_console()
> try:
> guest.launch()
> except:
> @@ -183,6 +187,81 @@ class BaseVM(object):
> raise Exception("Cannot find ssh port from 'info usernet':\n%s" % \
> usernet_info)
>
> + def console_init(self, timeout = 120):
> + vm = self._guest
> + vm.console_socket.settimeout(timeout)
> +
> + def console_log(self, text):
> + for line in re.split("[\r\n]", text):
> + # filter out terminal escape sequences
> + line = re.sub("\x1b\[[0-9;?]*[a-zA-Z]", "", line)
> + line = re.sub("\x1b\([0-9;?]*[a-zA-Z]", "", line)
> + # replace unprintable chars
> + line = re.sub("\x1b", "<esc>", line)
> + line = re.sub("[\x00-\x1f]", ".", line)
> + if line == "":
> + continue
> + # log console line
> + sys.stderr.write("con recv: %s\n" % line)
> +
> + def console_wait(self, expect):
> + vm = self._guest
> + output = ""
> + while True:
> + try:
> + chars = vm.console_socket.recv(1024)
> + except socket.timeout:
> + sys.stderr.write("console: *** read timeout ***\n")
> + sys.stderr.write("console: waiting for: '%s'\n" % expect)
> + sys.stderr.write("console: line buffer:\n")
> + sys.stderr.write("\n")
> + self.console_log(output.rstrip())
> + sys.stderr.write("\n")
> + raise
> + output += chars.decode("latin1")
> + if expect in output:
> + break
> + if "\r" in output or "\n" in output:
> + lines = re.split("[\r\n]", output)
> + output = lines.pop()
> + if self.debug:
> + self.console_log("\n".join(lines))
> + if self.debug:
> + self.console_log(output)
> +
> + def console_send(self, command):
> + vm = self._guest
> + if self.debug:
> + logline = re.sub("\n", "<enter>", command)
> + logline = re.sub("[\x00-\x1f]", ".", logline)
> + sys.stderr.write("con send: %s\n" % logline)
> + for char in list(command):
> + vm.console_socket.send(char.encode("utf-8"))
> + time.sleep(0.01)
> +
> + def console_wait_send(self, wait, command):
> + self.console_wait(wait)
> + self.console_send(command)
> +
> + def console_ssh_init(self, prompt, user, pw):
> + sshkey_cmd = "echo '%s' > .ssh/authorized_keys\n" % SSH_PUB_KEY.rstrip()
> + self.console_wait_send("login:", "%s\n" % user)
> + self.console_wait_send("Password:", "%s\n" % pw)
> + self.console_wait_send(prompt, "mkdir .ssh\n")
> + self.console_wait_send(prompt, sshkey_cmd)
> + self.console_wait_send(prompt, "chmod 755 .ssh\n")
> + self.console_wait_send(prompt, "chmod 644 .ssh/authorized_keys\n")
> +
> + def console_sshd_config(self, prompt):
> + self.console_wait(prompt)
> + self.console_send("echo 'PermitRootLogin yes' >> /etc/ssh/sshd_config\n")
> + for var in self.envvars:
> + self.console_wait(prompt)
> + self.console_send("echo 'AcceptEnv %s' >> /etc/ssh/sshd_config\n" % var)
> +
> + def print_step(self, text):
> + sys.stderr.write("### %s ...\n" % text)
> +
> def wait_ssh(self, seconds=300):
> starttime = datetime.datetime.now()
> endtime = starttime + datetime.timedelta(seconds=seconds)
>
next prev parent reply other threads:[~2019-05-29 11:34 UTC|newest]
Thread overview: 43+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-05-20 12:47 [Qemu-devel] [PATCH v3 00/14] tests/vm: serial console autoinstall, misc fixes Gerd Hoffmann
2019-05-20 12:47 ` [Qemu-devel] [PATCH v3 01/14] scripts: use git archive in archive-source Gerd Hoffmann
2019-05-29 11:53 ` Philippe Mathieu-Daudé
2019-05-20 12:47 ` [Qemu-devel] [PATCH v3 02/14] tests/vm: python3 fixes Gerd Hoffmann
2019-05-29 11:33 ` Philippe Mathieu-Daudé
2019-05-20 12:47 ` [Qemu-devel] [PATCH v3 03/14] tests/vm: send proxy environment variables over ssh Gerd Hoffmann
2019-05-20 12:47 ` [Qemu-devel] [PATCH v3 04/14] tests/vm: use ssh with pty unconditionally Gerd Hoffmann
2019-05-20 18:03 ` Philippe Mathieu-Daudé
2019-05-20 12:47 ` [Qemu-devel] [PATCH v3 05/14] tests/vm: run test builds on snapshot Gerd Hoffmann
2019-05-20 18:03 ` Philippe Mathieu-Daudé
2019-05-24 8:15 ` Ed Maste
2019-05-20 12:47 ` [Qemu-devel] [PATCH v3 06/14] tests/vm: proper guest shutdown Gerd Hoffmann
2019-05-20 18:04 ` Philippe Mathieu-Daudé
2019-05-20 12:47 ` [Qemu-devel] [PATCH v3 07/14] tests/vm: add vm-boot-{ssh, serial}-<guest> targets Gerd Hoffmann
2019-05-20 18:56 ` Philippe Mathieu-Daudé
2019-05-20 12:47 ` [Qemu-devel] [PATCH v3 08/14] tests/vm: add DEBUG=1 to help text Gerd Hoffmann
2019-05-20 12:47 ` [Qemu-devel] [PATCH v3 09/14] tests/vm: serial console support helpers Gerd Hoffmann
2019-05-29 11:31 ` Philippe Mathieu-Daudé [this message]
2019-05-20 12:47 ` [Qemu-devel] [PATCH v3 10/14] tests/vm: openbsd autoinstall, using serial console Gerd Hoffmann
2019-05-29 11:50 ` Philippe Mathieu-Daudé
2019-05-20 12:47 ` [Qemu-devel] [PATCH v3 11/14] tests/vm: freebsd " Gerd Hoffmann
2019-05-20 12:47 ` [Qemu-devel] [PATCH v3 12/14] tests/vm: netbsd " Gerd Hoffmann
2019-05-29 11:32 ` Philippe Mathieu-Daudé
2019-05-29 11:52 ` Philippe Mathieu-Daudé
2019-05-29 12:02 ` Philippe Mathieu-Daudé
2019-05-20 12:47 ` [Qemu-devel] [PATCH v3 13/14] tests/vm: fedora " Gerd Hoffmann
2019-05-29 11:31 ` Philippe Mathieu-Daudé
2019-05-20 12:47 ` [Qemu-devel] [PATCH v3 14/14] tests/vm: ubuntu.i386: apt proxy setup Gerd Hoffmann
2019-05-29 5:09 ` [Qemu-devel] [PATCH v3 00/14] tests/vm: serial console autoinstall, misc fixes Gerd Hoffmann
2019-05-29 9:57 ` Alex Bennée
2019-05-30 9:33 ` Alex Bennée
2019-05-30 10:02 ` Philippe Mathieu-Daudé
2019-05-30 10:18 ` Alex Bennée
2019-05-30 10:30 ` Philippe Mathieu-Daudé
2019-06-04 5:30 ` Philippe Mathieu-Daudé
2019-06-12 17:35 ` Alex Bennée
2019-06-13 0:11 ` Kamil Rytarowski
2019-06-13 9:36 ` Alex Bennée
2019-06-13 9:52 ` Gerd Hoffmann
2019-06-13 11:34 ` Alex Bennée
2019-06-13 12:36 ` Gerd Hoffmann
2019-06-13 13:03 ` Alex Bennée
[not found] ` <155835775478.22.12860360999794172452@5d2e01a8a801>
2019-05-30 9:43 ` Alex Bennée
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=a8840cb8-7a74-5d32-c54f-eca206bd6ef6@redhat.com \
--to=philmd@redhat.com \
--cc=alex.bennee@linaro.org \
--cc=brad@comstyle.com \
--cc=emaste@freebsd.org \
--cc=fam@euphon.net \
--cc=kamil@netbsd.org \
--cc=kraxel@redhat.com \
--cc=lwhsu@freebsd.org \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).