oeqa/QemuRunner: don't use bb for logging
Instead of using bb.note() etc for logging use logging.Logger directly, allowing the use of QemuRunner outside of bitbake. Also clean up the logging/errors by moving create_socket() out of __init__()/restart() and into start(). (From OE-Core rev: 519e381278d40bdac79add340e4c0460a9f97e17) Signed-off-by: Ross Burton <ross.burton@intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
parent
d87878ee12
commit
1b17b58c51
|
@ -12,7 +12,10 @@ import signal
|
||||||
import re
|
import re
|
||||||
import socket
|
import socket
|
||||||
import select
|
import select
|
||||||
import bb
|
|
||||||
|
import logging
|
||||||
|
logger = logging.getLogger("QemuRunner")
|
||||||
|
logger.setLevel(logging.DEBUG - 2)
|
||||||
|
|
||||||
class QemuRunner:
|
class QemuRunner:
|
||||||
|
|
||||||
|
@ -37,9 +40,6 @@ class QemuRunner:
|
||||||
|
|
||||||
self.runqemutime = 60
|
self.runqemutime = 60
|
||||||
|
|
||||||
self.create_socket()
|
|
||||||
|
|
||||||
|
|
||||||
def create_socket(self):
|
def create_socket(self):
|
||||||
|
|
||||||
self.bootlog = ''
|
self.bootlog = ''
|
||||||
|
@ -51,10 +51,12 @@ class QemuRunner:
|
||||||
self.server_socket.bind(("127.0.0.1",0))
|
self.server_socket.bind(("127.0.0.1",0))
|
||||||
self.server_socket.listen(2)
|
self.server_socket.listen(2)
|
||||||
self.serverport = self.server_socket.getsockname()[1]
|
self.serverport = self.server_socket.getsockname()[1]
|
||||||
bb.note("Created listening socket for qemu serial console on: 127.0.0.1:%s" % self.serverport)
|
logging.info("Created listening socket for qemu serial console on: 127.0.0.1:%s" % self.serverport)
|
||||||
|
return True
|
||||||
except socket.error, msg:
|
except socket.error, msg:
|
||||||
self.server_socket.close()
|
self.server_socket.close()
|
||||||
bb.fatal("Failed to create listening socket: %s" %msg[1])
|
logging.error("Failed to create listening socket: %s" % msg[1])
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
def log(self, msg):
|
def log(self, msg):
|
||||||
|
@ -63,26 +65,28 @@ class QemuRunner:
|
||||||
f.write("%s" % msg)
|
f.write("%s" % msg)
|
||||||
|
|
||||||
def start(self, qemuparams = None):
|
def start(self, qemuparams = None):
|
||||||
|
|
||||||
if self.display:
|
if self.display:
|
||||||
os.environ["DISPLAY"] = self.display
|
os.environ["DISPLAY"] = self.display
|
||||||
else:
|
else:
|
||||||
bb.error("To start qemu I need a X desktop, please set DISPLAY correctly (e.g. DISPLAY=:1)")
|
logging.error("To start qemu I need a X desktop, please set DISPLAY correctly (e.g. DISPLAY=:1)")
|
||||||
return False
|
return False
|
||||||
if not os.path.exists(self.rootfs):
|
if not os.path.exists(self.rootfs):
|
||||||
bb.error("Invalid rootfs %s" % self.rootfs)
|
logging.error("Invalid rootfs %s" % self.rootfs)
|
||||||
return False
|
return False
|
||||||
if not os.path.exists(self.tmpdir):
|
if not os.path.exists(self.tmpdir):
|
||||||
bb.error("Invalid TMPDIR path %s" % self.tmpdir)
|
logging.error("Invalid TMPDIR path %s" % self.tmpdir)
|
||||||
return False
|
return False
|
||||||
else:
|
else:
|
||||||
os.environ["OE_TMPDIR"] = self.tmpdir
|
os.environ["OE_TMPDIR"] = self.tmpdir
|
||||||
if not os.path.exists(self.deploy_dir_image):
|
if not os.path.exists(self.deploy_dir_image):
|
||||||
bb.error("Invalid DEPLOY_DIR_IMAGE path %s" % self.deploy_dir_image)
|
logging.error("Invalid DEPLOY_DIR_IMAGE path %s" % self.deploy_dir_image)
|
||||||
return False
|
return False
|
||||||
else:
|
else:
|
||||||
os.environ["DEPLOY_DIR_IMAGE"] = self.deploy_dir_image
|
os.environ["DEPLOY_DIR_IMAGE"] = self.deploy_dir_image
|
||||||
|
|
||||||
|
if not self.create_socket():
|
||||||
|
return False
|
||||||
|
|
||||||
# Set this flag so that Qemu doesn't do any grabs as SDL grabs interact
|
# Set this flag so that Qemu doesn't do any grabs as SDL grabs interact
|
||||||
# badly with screensavers.
|
# badly with screensavers.
|
||||||
os.environ["QEMU_DONT_GRAB"] = "1"
|
os.environ["QEMU_DONT_GRAB"] = "1"
|
||||||
|
@ -93,28 +97,28 @@ class QemuRunner:
|
||||||
launch_cmd = 'runqemu %s %s %s' % (self.machine, self.rootfs, self.qemuparams)
|
launch_cmd = 'runqemu %s %s %s' % (self.machine, self.rootfs, self.qemuparams)
|
||||||
self.runqemu = subprocess.Popen(launch_cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT,preexec_fn=os.setpgrp)
|
self.runqemu = subprocess.Popen(launch_cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT,preexec_fn=os.setpgrp)
|
||||||
|
|
||||||
bb.note("runqemu started, pid is %s" % self.runqemu.pid)
|
logging.info("runqemu started, pid is %s" % self.runqemu.pid)
|
||||||
bb.note("waiting at most %s seconds for qemu pid" % self.runqemutime)
|
logging.info("waiting at most %s seconds for qemu pid" % self.runqemutime)
|
||||||
endtime = time.time() + self.runqemutime
|
endtime = time.time() + self.runqemutime
|
||||||
while not self.is_alive() and time.time() < endtime:
|
while not self.is_alive() and time.time() < endtime:
|
||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
|
|
||||||
if self.is_alive():
|
if self.is_alive():
|
||||||
bb.note("qemu started - qemu procces pid is %s" % self.qemupid)
|
logging.info("qemu started - qemu procces pid is %s" % self.qemupid)
|
||||||
cmdline = ''
|
cmdline = ''
|
||||||
with open('/proc/%s/cmdline' % self.qemupid) as p:
|
with open('/proc/%s/cmdline' % self.qemupid) as p:
|
||||||
cmdline = p.read()
|
cmdline = p.read()
|
||||||
ips = re.findall("((?:[0-9]{1,3}\.){3}[0-9]{1,3})", cmdline.split("ip=")[1])
|
ips = re.findall("((?:[0-9]{1,3}\.){3}[0-9]{1,3})", cmdline.split("ip=")[1])
|
||||||
if not ips or len(ips) != 3:
|
if not ips or len(ips) != 3:
|
||||||
bb.note("Couldn't get ip from qemu process arguments! Here is the qemu command line used: %s" % cmdline)
|
logging.info("Couldn't get ip from qemu process arguments! Here is the qemu command line used: %s" % cmdline)
|
||||||
self.stop()
|
self.stop()
|
||||||
return False
|
return False
|
||||||
else:
|
else:
|
||||||
self.ip = ips[0]
|
self.ip = ips[0]
|
||||||
self.server_ip = ips[1]
|
self.server_ip = ips[1]
|
||||||
bb.note("Target IP: %s" % self.ip)
|
logging.info("Target IP: %s" % self.ip)
|
||||||
bb.note("Server IP: %s" % self.server_ip)
|
logging.info("Server IP: %s" % self.server_ip)
|
||||||
bb.note("Waiting at most %d seconds for login banner" % self.boottime )
|
logging.info("Waiting at most %d seconds for login banner" % self.boottime)
|
||||||
endtime = time.time() + self.boottime
|
endtime = time.time() + self.boottime
|
||||||
socklist = [self.server_socket]
|
socklist = [self.server_socket]
|
||||||
reachedlogin = False
|
reachedlogin = False
|
||||||
|
@ -127,7 +131,7 @@ class QemuRunner:
|
||||||
self.qemusock.setblocking(0)
|
self.qemusock.setblocking(0)
|
||||||
socklist.append(self.qemusock)
|
socklist.append(self.qemusock)
|
||||||
socklist.remove(self.server_socket)
|
socklist.remove(self.server_socket)
|
||||||
bb.note("Connection from %s:%s" % addr)
|
logging.info("Connection from %s:%s" % addr)
|
||||||
else:
|
else:
|
||||||
data = sock.recv(1024)
|
data = sock.recv(1024)
|
||||||
if data:
|
if data:
|
||||||
|
@ -136,24 +140,24 @@ class QemuRunner:
|
||||||
if re.search("qemu.* login:", self.bootlog):
|
if re.search("qemu.* login:", self.bootlog):
|
||||||
stopread = True
|
stopread = True
|
||||||
reachedlogin = True
|
reachedlogin = True
|
||||||
bb.note("Reached login banner")
|
logging.info("Reached login banner")
|
||||||
else:
|
else:
|
||||||
socklist.remove(sock)
|
socklist.remove(sock)
|
||||||
sock.close()
|
sock.close()
|
||||||
stopread = True
|
stopread = True
|
||||||
|
|
||||||
if not reachedlogin:
|
if not reachedlogin:
|
||||||
bb.note("Target didn't reached login boot in %d seconds" % self.boottime)
|
logging.info("Target didn't reached login boot in %d seconds" % self.boottime)
|
||||||
lines = "\n".join(self.bootlog.splitlines()[-5:])
|
lines = "\n".join(self.bootlog.splitlines()[-5:])
|
||||||
bb.note("Last 5 lines of text:\n%s" % lines)
|
logging.info("Last 5 lines of text:\n%s" % lines)
|
||||||
bb.note("Check full boot log: %s" % self.logfile)
|
logging.info("Check full boot log: %s" % self.logfile)
|
||||||
self.stop()
|
self.stop()
|
||||||
return False
|
return False
|
||||||
else:
|
else:
|
||||||
bb.note("Qemu pid didn't appeared in %s seconds" % self.runqemutime)
|
logging.info("Qemu pid didn't appeared in %s seconds" % self.runqemutime)
|
||||||
output = self.runqemu.stdout
|
output = self.runqemu.stdout
|
||||||
self.stop()
|
self.stop()
|
||||||
bb.note("Output from runqemu:\n%s" % output.read())
|
logging.info("Output from runqemu:\n%s" % output.read())
|
||||||
return False
|
return False
|
||||||
|
|
||||||
return self.is_alive()
|
return self.is_alive()
|
||||||
|
@ -161,13 +165,13 @@ class QemuRunner:
|
||||||
def stop(self):
|
def stop(self):
|
||||||
|
|
||||||
if self.runqemu:
|
if self.runqemu:
|
||||||
bb.note("Sending SIGTERM to runqemu")
|
logging.info("Sending SIGTERM to runqemu")
|
||||||
os.killpg(self.runqemu.pid, signal.SIGTERM)
|
os.killpg(self.runqemu.pid, signal.SIGTERM)
|
||||||
endtime = time.time() + self.runqemutime
|
endtime = time.time() + self.runqemutime
|
||||||
while self.runqemu.poll() is None and time.time() < endtime:
|
while self.runqemu.poll() is None and time.time() < endtime:
|
||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
if self.runqemu.poll() is None:
|
if self.runqemu.poll() is None:
|
||||||
bb.note("Sending SIGKILL to runqemu")
|
logging.info("Sending SIGKILL to runqemu")
|
||||||
os.killpg(self.runqemu.pid, signal.SIGKILL)
|
os.killpg(self.runqemu.pid, signal.SIGKILL)
|
||||||
self.runqemu = None
|
self.runqemu = None
|
||||||
if self.server_socket:
|
if self.server_socket:
|
||||||
|
@ -177,10 +181,9 @@ class QemuRunner:
|
||||||
self.ip = None
|
self.ip = None
|
||||||
|
|
||||||
def restart(self, qemuparams = None):
|
def restart(self, qemuparams = None):
|
||||||
bb.note("Restarting qemu process")
|
logging.info("Restarting qemu process")
|
||||||
if self.runqemu.poll() is None:
|
if self.runqemu.poll() is None:
|
||||||
self.stop()
|
self.stop()
|
||||||
self.create_socket()
|
|
||||||
if self.start(qemuparams):
|
if self.start(qemuparams):
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
Loading…
Reference in New Issue