|
@@ -429,6 +429,9 @@ def __init__(self, desc, file):
|
|
super(VMSDFieldStruct, self).__init__(desc, file)
|
|
super(VMSDFieldStruct, self).__init__(desc, file)
|
|
self.data = collections.OrderedDict()
|
|
self.data = collections.OrderedDict()
|
|
|
|
|
|
|
|
+ if 'fields' not in self.desc['struct']:
|
|
|
|
+ raise Exception("No fields in struct. VMSD:\n%s" % self.desc)
|
|
|
|
+
|
|
# When we see compressed array elements, unfold them here
|
|
# When we see compressed array elements, unfold them here
|
|
new_fields = []
|
|
new_fields = []
|
|
for field in self.desc['struct']['fields']:
|
|
for field in self.desc['struct']['fields']:
|
|
@@ -477,6 +480,10 @@ def read(self):
|
|
raise Exception("Subsection %s not found at offset %x" % ( subsection['vmsd_name'], self.file.tell()))
|
|
raise Exception("Subsection %s not found at offset %x" % ( subsection['vmsd_name'], self.file.tell()))
|
|
name = self.file.readstr()
|
|
name = self.file.readstr()
|
|
version_id = self.file.read32()
|
|
version_id = self.file.read32()
|
|
|
|
+
|
|
|
|
+ if not subsection:
|
|
|
|
+ raise Exception("Empty description for subsection: %s" % name)
|
|
|
|
+
|
|
self.data[name] = VMSDSection(self.file, version_id, subsection, (name, 0))
|
|
self.data[name] = VMSDSection(self.file, version_id, subsection, (name, 0))
|
|
self.data[name].read()
|
|
self.data[name].read()
|
|
|
|
|
|
@@ -574,10 +581,13 @@ def __init__(self, filename):
|
|
}
|
|
}
|
|
self.filename = filename
|
|
self.filename = filename
|
|
self.vmsd_desc = None
|
|
self.vmsd_desc = None
|
|
|
|
+ self.vmsd_json = ""
|
|
|
|
|
|
- def read(self, desc_only = False, dump_memory = False, write_memory = False):
|
|
|
|
|
|
+ def read(self, desc_only = False, dump_memory = False,
|
|
|
|
+ write_memory = False):
|
|
# Read in the whole file
|
|
# Read in the whole file
|
|
file = MigrationFile(self.filename)
|
|
file = MigrationFile(self.filename)
|
|
|
|
+ self.vmsd_json = file.read_migration_debug_json()
|
|
|
|
|
|
# File magic
|
|
# File magic
|
|
data = file.read32()
|
|
data = file.read32()
|
|
@@ -635,9 +645,11 @@ def read(self, desc_only = False, dump_memory = False, write_memory = False):
|
|
file.close()
|
|
file.close()
|
|
|
|
|
|
def load_vmsd_json(self, file):
|
|
def load_vmsd_json(self, file):
|
|
- vmsd_json = file.read_migration_debug_json()
|
|
|
|
- self.vmsd_desc = json.loads(vmsd_json, object_pairs_hook=collections.OrderedDict)
|
|
|
|
|
|
+ self.vmsd_desc = json.loads(self.vmsd_json,
|
|
|
|
+ object_pairs_hook=collections.OrderedDict)
|
|
for device in self.vmsd_desc['devices']:
|
|
for device in self.vmsd_desc['devices']:
|
|
|
|
+ if 'fields' not in device:
|
|
|
|
+ raise Exception("vmstate for device %s has no fields" % device['name'])
|
|
key = (device['name'], device['instance_id'])
|
|
key = (device['name'], device['instance_id'])
|
|
value = ( VMSDSection, device )
|
|
value = ( VMSDSection, device )
|
|
self.section_classes[key] = value
|
|
self.section_classes[key] = value
|
|
@@ -666,31 +678,34 @@ def default(self, o):
|
|
|
|
|
|
jsonenc = JSONEncoder(indent=4, separators=(',', ': '))
|
|
jsonenc = JSONEncoder(indent=4, separators=(',', ': '))
|
|
|
|
|
|
-if args.extract:
|
|
|
|
- dump = MigrationDump(args.file)
|
|
|
|
|
|
+if not any([args.extract, args.dump == "state", args.dump == "desc"]):
|
|
|
|
+ raise Exception("Please specify either -x, -d state or -d desc")
|
|
|
|
|
|
- dump.read(desc_only = True)
|
|
|
|
- print("desc.json")
|
|
|
|
- f = open("desc.json", "w")
|
|
|
|
- f.truncate()
|
|
|
|
- f.write(jsonenc.encode(dump.vmsd_desc))
|
|
|
|
- f.close()
|
|
|
|
-
|
|
|
|
- dump.read(write_memory = True)
|
|
|
|
- dict = dump.getDict()
|
|
|
|
- print("state.json")
|
|
|
|
- f = open("state.json", "w")
|
|
|
|
- f.truncate()
|
|
|
|
- f.write(jsonenc.encode(dict))
|
|
|
|
- f.close()
|
|
|
|
-elif args.dump == "state":
|
|
|
|
- dump = MigrationDump(args.file)
|
|
|
|
- dump.read(dump_memory = args.memory)
|
|
|
|
- dict = dump.getDict()
|
|
|
|
- print(jsonenc.encode(dict))
|
|
|
|
-elif args.dump == "desc":
|
|
|
|
|
|
+try:
|
|
dump = MigrationDump(args.file)
|
|
dump = MigrationDump(args.file)
|
|
- dump.read(desc_only = True)
|
|
|
|
- print(jsonenc.encode(dump.vmsd_desc))
|
|
|
|
-else:
|
|
|
|
- raise Exception("Please specify either -x, -d state or -d desc")
|
|
|
|
|
|
+
|
|
|
|
+ if args.extract:
|
|
|
|
+ dump.read(desc_only = True)
|
|
|
|
+
|
|
|
|
+ print("desc.json")
|
|
|
|
+ f = open("desc.json", "w")
|
|
|
|
+ f.truncate()
|
|
|
|
+ f.write(jsonenc.encode(dump.vmsd_desc))
|
|
|
|
+ f.close()
|
|
|
|
+
|
|
|
|
+ dump.read(write_memory = True)
|
|
|
|
+ dict = dump.getDict()
|
|
|
|
+ print("state.json")
|
|
|
|
+ f = open("state.json", "w")
|
|
|
|
+ f.truncate()
|
|
|
|
+ f.write(jsonenc.encode(dict))
|
|
|
|
+ f.close()
|
|
|
|
+ elif args.dump == "state":
|
|
|
|
+ dump.read(dump_memory = args.memory)
|
|
|
|
+ dict = dump.getDict()
|
|
|
|
+ print(jsonenc.encode(dict))
|
|
|
|
+ elif args.dump == "desc":
|
|
|
|
+ dump.read(desc_only = True)
|
|
|
|
+ print(jsonenc.encode(dump.vmsd_desc))
|
|
|
|
+except Exception:
|
|
|
|
+ raise Exception("Full JSON dump:\n%s", dump.vmsd_json)
|