qcow2.py: Introduce '-j' key to dump in JSON format

Add the command key to the qcow2.py arguments list to dump QCOW2
metadata in JSON format. Here is the suggested way to do that. The
implementation of the dump in JSON format is in the patch that follows.

Signed-off-by: Andrey Shinkevich <andrey.shinkevich@virtuozzo.com>
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Message-Id: <1596742557-320265-9-git-send-email-andrey.shinkevich@virtuozzo.com>
Signed-off-by: Eric Blake <eblake@redhat.com>
This commit is contained in:
Andrey Shinkevich 2020-08-06 22:35:54 +03:00 committed by Eric Blake
parent 9427784124
commit 2c6d9ca48c
2 changed files with 16 additions and 6 deletions

View File

@ -26,16 +26,19 @@ from qcow2_format import (
) )
is_json = False
def cmd_dump_header(fd): def cmd_dump_header(fd):
h = QcowHeader(fd) h = QcowHeader(fd)
h.dump() h.dump(is_json)
print() print()
h.dump_extensions() h.dump_extensions(is_json)
def cmd_dump_header_exts(fd): def cmd_dump_header_exts(fd):
h = QcowHeader(fd) h = QcowHeader(fd)
h.dump_extensions() h.dump_extensions(is_json)
def cmd_set_header(fd, name, value): def cmd_set_header(fd, name, value):
@ -151,11 +154,14 @@ def main(filename, cmd, args):
def usage(): def usage():
print("Usage: %s <file> <cmd> [<arg>, ...]" % sys.argv[0]) print("Usage: %s <file> <cmd> [<arg>, ...] [<key>, ...]" % sys.argv[0])
print("") print("")
print("Supported commands:") print("Supported commands:")
for name, handler, num_args, desc in cmds: for name, handler, num_args, desc in cmds:
print(" %-20s - %s" % (name, desc)) print(" %-20s - %s" % (name, desc))
print("")
print("Supported keys:")
print(" %-20s - %s" % ('-j', 'Dump in JSON format'))
if __name__ == '__main__': if __name__ == '__main__':
@ -163,4 +169,8 @@ if __name__ == '__main__':
usage() usage()
sys.exit(1) sys.exit(1)
is_json = '-j' in sys.argv
if is_json:
sys.argv.remove('-j')
main(sys.argv[1], sys.argv[2], sys.argv[3:]) main(sys.argv[1], sys.argv[2], sys.argv[3:])

View File

@ -109,7 +109,7 @@ class Qcow2Struct(metaclass=Qcow2StructMeta):
self.__dict__ = dict((field[2], values[i]) self.__dict__ = dict((field[2], values[i])
for i, field in enumerate(self.fields)) for i, field in enumerate(self.fields))
def dump(self): def dump(self, is_json=False):
for f in self.fields: for f in self.fields:
value = self.__dict__[f[2]] value = self.__dict__[f[2]]
if isinstance(f[1], str): if isinstance(f[1], str):
@ -408,7 +408,7 @@ class QcowHeader(Qcow2Struct):
buf = buf[0:header_bytes-1] buf = buf[0:header_bytes-1]
fd.write(buf) fd.write(buf)
def dump_extensions(self): def dump_extensions(self, is_json=False):
for ex in self.extensions: for ex in self.extensions:
print('Header extension:') print('Header extension:')
ex.dump() ex.dump()