Revision 11217a75
b/QMP/qmp-shell | ||
---|---|---|
145 | 145 |
else: |
146 | 146 |
return self._execute_cmd(cmdline) |
147 | 147 |
|
148 |
class HMPShell(QMPShell): |
|
149 |
def __init__(self, address): |
|
150 |
QMPShell.__init__(self, address) |
|
151 |
self.__cpu_index = 0 |
|
152 |
|
|
153 |
def __cmd_completion(self): |
|
154 |
for cmd in self.__cmd_passthrough('help')['return'].split('\r\n'): |
|
155 |
if cmd and cmd[0] != '[' and cmd[0] != '\t': |
|
156 |
name = cmd.split()[0] # drop help text |
|
157 |
if name == 'info': |
|
158 |
continue |
|
159 |
if name.find('|') != -1: |
|
160 |
# Command in the form 'foobar|f' or 'f|foobar', take the |
|
161 |
# full name |
|
162 |
opt = name.split('|') |
|
163 |
if len(opt[0]) == 1: |
|
164 |
name = opt[1] |
|
165 |
else: |
|
166 |
name = opt[0] |
|
167 |
self._completer.append(name) |
|
168 |
self._completer.append('help ' + name) # help completion |
|
169 |
|
|
170 |
def __info_completion(self): |
|
171 |
for cmd in self.__cmd_passthrough('info')['return'].split('\r\n'): |
|
172 |
if cmd: |
|
173 |
self._completer.append('info ' + cmd.split()[1]) |
|
174 |
|
|
175 |
def __other_completion(self): |
|
176 |
# special cases |
|
177 |
self._completer.append('help info') |
|
178 |
|
|
179 |
def _fill_completion(self): |
|
180 |
self.__cmd_completion() |
|
181 |
self.__info_completion() |
|
182 |
self.__other_completion() |
|
183 |
|
|
184 |
def __cmd_passthrough(self, cmdline, cpu_index = 0): |
|
185 |
return self.cmd_obj({ 'execute': 'human-monitor-command', 'arguments': |
|
186 |
{ 'command-line': cmdline, |
|
187 |
'cpu-index': cpu_index } }) |
|
188 |
|
|
189 |
def _execute_cmd(self, cmdline): |
|
190 |
if cmdline.split()[0] == "cpu": |
|
191 |
# trap the cpu command, it requires special setting |
|
192 |
try: |
|
193 |
idx = int(cmdline.split()[1]) |
|
194 |
if not 'return' in self.__cmd_passthrough('info version', idx): |
|
195 |
print 'bad CPU index' |
|
196 |
return True |
|
197 |
self.__cpu_index = idx |
|
198 |
except ValueError: |
|
199 |
print 'cpu command takes an integer argument' |
|
200 |
return True |
|
201 |
resp = self.__cmd_passthrough(cmdline, self.__cpu_index) |
|
202 |
if resp is None: |
|
203 |
print 'Disconnected' |
|
204 |
return False |
|
205 |
assert 'return' in resp or 'error' in resp |
|
206 |
if 'return' in resp: |
|
207 |
# Success |
|
208 |
if len(resp['return']) > 0: |
|
209 |
print resp['return'], |
|
210 |
else: |
|
211 |
# Error |
|
212 |
print '%s: %s' % (resp['error']['class'], resp['error']['desc']) |
|
213 |
return True |
|
214 |
|
|
215 |
def show_banner(self): |
|
216 |
QMPShell.show_banner(self, msg='Welcome to the HMP shell!') |
|
217 |
|
|
148 | 218 |
def die(msg): |
149 | 219 |
sys.stderr.write('ERROR: %s\n' % msg) |
150 | 220 |
sys.exit(1) |
... | ... | |
156 | 226 |
sys.exit(1) |
157 | 227 |
|
158 | 228 |
def main(): |
229 |
addr = '' |
|
159 | 230 |
try: |
160 | 231 |
if len(sys.argv) == 2: |
161 | 232 |
qemu = QMPShell(sys.argv[1]) |
233 |
addr = sys.argv[1] |
|
234 |
elif len(sys.argv) == 3: |
|
235 |
if sys.argv[1] != '-H': |
|
236 |
fail_cmdline(sys.argv[1]) |
|
237 |
qemu = HMPShell(sys.argv[2]) |
|
238 |
addr = sys.argv[2] |
|
162 | 239 |
else: |
163 | 240 |
fail_cmdline() |
164 | 241 |
except QMPShellBadPort: |
... | ... | |
171 | 248 |
except qmp.QMPCapabilitiesError: |
172 | 249 |
die('Could not negotiate capabilities') |
173 | 250 |
except qemu.error: |
174 |
die('Could not connect to %s' % sys.argv[1])
|
|
251 |
die('Could not connect to %s' % addr)
|
|
175 | 252 |
|
176 | 253 |
qemu.show_banner() |
177 | 254 |
while qemu.read_exec_command('(QEMU) '): |
Also available in: Unified diff