#!/usr/bin/env python3 import os import sys import telnetlib import common class Main(common.LkmcCliFunction): def __init__(self): super().__init__( description='''\ Run a command on the QEMU monitor of a running QEMU instance If the stdin is a terminal, open an interact shell. Otherwise, run commands from stdin and quit. ''', ) self.add_argument( 'command', help='If given, run this command and quit', nargs='*', ) def timed_main(self): def write_and_read(tn, cmd, prompt): tn.write(cmd.encode('utf-8')) return '\n'.join(tn.read_until(prompt).decode('utf-8').splitlines()[1:])[:-len(prompt)] with telnetlib.Telnet('localhost', self.env['qemu_monitor_port']) as tn: prompt = b'\n(qemu) ' # Couldn't disable server echo, so just removing the write for now. # https://stackoverflow.com/questions/12421799/how-to-disable-telnet-echo-in-python-telnetlib # sock = tn.get_socket() # sock.send(telnetlib.IAC + telnetlib.WILL + telnetlib.ECHO) if os.isatty(sys.stdin.fileno()): if self.env['command'] == []: print(tn.read_until(prompt).decode('utf-8'), end='') tn.interact() else: tn.read_until(prompt) print(write_and_read(tn, ' '.join(self.env['command']) + '\n', prompt)) else: tn.read_until(prompt) print(write_and_read(tn, sys.stdin.read() + '\n', prompt)) if __name__ == '__main__': Main().cli()