Does Libvirt's json parser support single quoted string in qmp json string?

Eric Blake eblake at redhat.com
Fri Jan 31 12:44:42 UTC 2020


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 at 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




More information about the libvirt-users mailing list