12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 |
- #!/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()
|