On 1/31/20 4:38 AM, Peter Luo wrote:
error: internal error: cannot parse json {"execute": "block-commit", "arguments": { "device": "drive-virtio-disk2", "job-id": "job100", "base":'json:{"encrypt.key-secret":"vol-38973xjl.secret","driver":"qcow2","file":{"driver":"file","filename":"/pitrix/data/container/vol-38973xjl.img"}}', "top": "/pitrix/data/container/vol-38973xjl_ss-2tw7v0mm.img"}}: lexical error: invalid char in json text.
, "job-id": "job100", "base":'json:{"encrypt.key-secret":"vo
(right here) ------^
qemu's QMP language has an extension where it accepts 'string' in
addition to the JSON "string". But it uses a hand-rolled parser, so it
can do whatever it wants.
But virsh uses a 3rd-party JSON parser. When using 'virsh
qemu-monitor-command', your command line argument HAS to be valid JSON,
or virsh can't parse it; and if virsh can't parse it, libvirt can't pass
it on to qemu (even if qemu would have parsed it as written). To write
JSON inside JSON, you have to do things like:
"base":"json:{\"encrypt.key-secret\":\"vo...
Attempt 2: Single quote with backflash, failed
root@host:~# virsh qemu-monitor-command i-9wdfw2x8 "{\"execute\": \"block-commit\", \"arguments\": { \"device\": \"drive-virtio-disk2\", \"job-id\": \"job100\", \"base\":\'json:{\"encrypt.key-secret\":\"vol-38973xjl.secret\",\"driver
In shell quoting, "\'" and "'" are identical. The \ never reached
libvirt. Your choices for proper shell quoting include:
'{"execute":... "base":"json:{\"encrypt.key-secret\":\"vol...
"{\"execute\":... \"base\":\"json:{\\\"encrypt.key-secret\\\":\\\"vol...
or even things like:
q='"'
qq='\"'
"{${q}execute${q}:...
${q}base${q}:${q}json:{${dq}encrypt.key-secret${dq}:${dq}vol...
But as mentioned elsewhere in this thread, embedding nested json via
qemu-monitor-command is already a sign that you are using unsupported
means, and where newer libvirt supports what you want to do natively,
you're better off upgrading to that supported method instead of trying
to hack around the command line through an unsupported backdoor.
--
Eric Blake, Principal Software Engineer
Red Hat, Inc. +1-919-301-3226
Virtualization: qemu.org | libvirt.org