python/qemu: Cleanup changes to ConsoleSocket

The changes to console_socket.py and machine.py are to
cleanup for pylint and flake8.

Signed-off-by: Robert Foley <robert.foley@linaro.org>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Message-Id: <20200717203041.9867-2-robert.foley@linaro.org>
Message-Id: <20200724064509.331-15-alex.bennee@linaro.org>
This commit is contained in:
Robert Foley 2020-07-24 07:45:07 +01:00 committed by Alex Bennée
parent 445883885a
commit 4b84d87449
3 changed files with 34 additions and 32 deletions

View File

@ -1,12 +1,9 @@
#!/usr/bin/env python3 """
# QEMU Console Socket Module:
# This python module implements a ConsoleSocket object which is
# designed always drain the socket itself, and place This python module implements a ConsoleSocket object,
# the bytes into a in memory buffer for later processing. which can drain a socket and optionally dump the bytes to file.
# """
# Optionally a file path can be passed in and we will also
# dump the characters to this file for debug.
#
# Copyright 2020 Linaro # Copyright 2020 Linaro
# #
# Authors: # Authors:
@ -15,20 +12,27 @@
# This code is licensed under the GPL version 2 or later. See # This code is licensed under the GPL version 2 or later. See
# the COPYING file in the top-level directory. # the COPYING file in the top-level directory.
# #
import asyncore import asyncore
import socket import socket
import threading import threading
import io
import os
import sys
from collections import deque from collections import deque
import time import time
import traceback
class ConsoleSocket(asyncore.dispatcher): class ConsoleSocket(asyncore.dispatcher):
"""
ConsoleSocket represents a socket attached to a char device.
Drains the socket and places the bytes into an in memory buffer
for later processing.
Optionally a file path can be passed in and we will also
dump the characters to this file for debugging purposes.
"""
def __init__(self, address, file=None): def __init__(self, address, file=None):
self._recv_timeout_sec = 300 self._recv_timeout_sec = 300
self._sleep_time = 0.5
self._buffer = deque() self._buffer = deque()
self._asyncore_thread = None self._asyncore_thread = None
self._sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) self._sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
@ -70,31 +74,28 @@ class ConsoleSocket(asyncore.dispatcher):
def handle_read(self): def handle_read(self):
"""process arriving characters into in memory _buffer""" """process arriving characters into in memory _buffer"""
try: data = asyncore.dispatcher.recv(self, 1)
data = asyncore.dispatcher.recv(self, 1) # latin1 is needed since there are some chars
# latin1 is needed since there are some chars # we are receiving that cannot be encoded to utf-8
# we are receiving that cannot be encoded to utf-8 # such as 0xe2, 0x80, 0xA6.
# such as 0xe2, 0x80, 0xA6. string = data.decode("latin1")
string = data.decode("latin1")
except:
print("Exception seen.")
traceback.print_exc()
return
if self._logfile: if self._logfile:
self._logfile.write("{}".format(string)) self._logfile.write("{}".format(string))
self._logfile.flush() self._logfile.flush()
for c in string: for c in string:
self._buffer.extend(c) self._buffer.extend(c)
def recv(self, n=1, sleep_delay_s=0.1): def recv(self, buffer_size=1):
"""Return chars from in memory buffer""" """Return chars from in memory buffer.
Maintains the same API as socket.socket.recv.
"""
start_time = time.time() start_time = time.time()
while len(self._buffer) < n: while len(self._buffer) < buffer_size:
time.sleep(sleep_delay_s) time.sleep(self._sleep_time)
elapsed_sec = time.time() - start_time elapsed_sec = time.time() - start_time
if elapsed_sec > self._recv_timeout_sec: if elapsed_sec > self._recv_timeout_sec:
raise socket.timeout raise socket.timeout
chars = ''.join([self._buffer.popleft() for i in range(n)]) chars = ''.join([self._buffer.popleft() for i in range(buffer_size)])
# We choose to use latin1 to remain consistent with # We choose to use latin1 to remain consistent with
# handle_read() and give back the same data as the user would # handle_read() and give back the same data as the user would
# receive if they were reading directly from the # receive if they were reading directly from the

View File

@ -27,7 +27,7 @@ import socket
import tempfile import tempfile
from typing import Optional, Type from typing import Optional, Type
from types import TracebackType from types import TracebackType
from qemu.console_socket import ConsoleSocket from . import console_socket
from . import qmp from . import qmp
@ -674,8 +674,9 @@ class QEMUMachine:
""" """
if self._console_socket is None: if self._console_socket is None:
if self._drain_console: if self._drain_console:
self._console_socket = ConsoleSocket(self._console_address, self._console_socket = console_socket.ConsoleSocket(
file=self._console_log_path) self._console_address,
file=self._console_log_path)
else: else:
self._console_socket = socket.socket(socket.AF_UNIX, self._console_socket = socket.socket(socket.AF_UNIX,
socket.SOCK_STREAM) socket.SOCK_STREAM)

View File

@ -33,7 +33,7 @@ good-names=i,
Run, Run,
_, _,
fd, fd,
c,
[VARIABLES] [VARIABLES]
[STRING] [STRING]