From 432b8204f1c9cda736f81862527c1c8faa1c0405 Mon Sep 17 00:00:00 2001 From: MDMCK10 <21245760+MDMCK10@users.noreply.github.com> Date: Thu, 6 Apr 2023 21:59:37 +0200 Subject: [PATCH] Let's try this again. --- src/QEMUVM.ts | 2 +- src/QMPClient.ts | 23 ++++++++++++----------- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/src/QEMUVM.ts b/src/QEMUVM.ts index 0cd530a..6bd9eb6 100644 --- a/src/QEMUVM.ts +++ b/src/QEMUVM.ts @@ -46,7 +46,7 @@ export default class QEMUVM extends VM { this.qmpSock = `${Config.vm.qmpSockDir}collab-vm-qmp-${Config.collabvm.node}.sock`; } this.vncPort = Config.vm.vncPort; - this.qemuCmd = `${Config.vm.qemuArgs} -no-shutdown -vnc 127.0.0.1:${this.vncPort - 5900} -qmp ${this.qmpType}${this.qmpSock},server`; + this.qemuCmd = `${Config.vm.qemuArgs} -no-shutdown -vnc 127.0.0.1:${this.vncPort - 5900} -qmp ${this.qmpType}${this.qmpSock},server,nowait`; if (Config.vm.snapshots) this.qemuCmd += " -snapshot" this.qmpErrorLevel = 0; this.vncErrorLevel = 0; diff --git a/src/QMPClient.ts b/src/QMPClient.ts index 7232f77..4c3507d 100644 --- a/src/QMPClient.ts +++ b/src/QMPClient.ts @@ -2,6 +2,7 @@ import EventEmitter from "events"; import { Socket } from "net"; import { Mutex } from "async-mutex"; import log from "./log.js"; +import { EOL } from "os"; export default class QMPClient extends EventEmitter { socketfile : string; @@ -34,7 +35,9 @@ export default class QMPClient extends EventEmitter { } this.connected = true; this.socket.on('error', () => false); // Disable throwing if QMP errors - this.socket.on('data', (data) => this.onData(data)); + this.socket.on('data', (data) => { + data.toString().split(EOL).forEach(instr => this.onData(instr)); + }); this.socket.on('close', () => this.onClose()); this.once('connected', () => {res();}); }) @@ -45,12 +48,11 @@ export default class QMPClient extends EventEmitter { this.socket.destroy(); } - private async onData(data : Buffer) { - let msgraw = data.toString(); + private async onData(data : string) { let msg; try { - msg = JSON.parse(msgraw); + msg = JSON.parse(data); } catch { return; } @@ -64,7 +66,7 @@ export default class QMPClient extends EventEmitter { this.emit('connected'); this.sentConnected = true; } - if (msg.return !== undefined) + if (msg.return !== undefined && Object.keys(msg.return).length) this.emit("qmpreturn", msg.return); else if(msg.event !== undefined) { switch(msg.event) { @@ -76,14 +78,13 @@ export default class QMPClient extends EventEmitter { } case "RESET": { - log("INFO", "QEMU reset event occured"); - this.resume(); + if(msg.data.reason == "host-qmp-system-reset") { + log("INFO", "QEMU reset event occured"); + this.resume(); + } break; }; - default: { - this.emit("qmpreturn", ''); - break; - } + default: break; } }else // for now just return an empty string.