19c7fbc3fSMichał Górny#!/usr/bin/env python 29c7fbc3fSMichał Górny 39c7fbc3fSMichał Górnyimport argparse 49c7fbc3fSMichał Górnyimport re 59c7fbc3fSMichał Górnyimport sys 69c7fbc3fSMichał Górny 79c7fbc3fSMichał Górny 89c7fbc3fSMichał Górnydef main(): 99c7fbc3fSMichał Górny argp = argparse.ArgumentParser() 109c7fbc3fSMichał Górny argp.add_argument('infile', type=argparse.FileType('rb'), 119c7fbc3fSMichał Górny help='Input vmcore file') 129c7fbc3fSMichał Górny argp.add_argument('outfile', type=argparse.FileType('wb'), 139c7fbc3fSMichał Górny help='Output vmcore file') 149c7fbc3fSMichał Górny args = argp.parse_args() 159c7fbc3fSMichał Górny 169c7fbc3fSMichał Górny inf = args.infile 179c7fbc3fSMichał Górny outf = args.outfile 189c7fbc3fSMichał Górny line_re = re.compile(r"^% RD: (\d+) (\d+)") 199c7fbc3fSMichał Górny 209c7fbc3fSMichał Górny # copy the first chunk that usually includes ELF headers 219c7fbc3fSMichał Górny # (not output by patched libfbsdvmcore since libelf reads this) 229c7fbc3fSMichał Górny outf.write(inf.read(1024)) 239c7fbc3fSMichał Górny 249c7fbc3fSMichał Górny for l in sys.stdin: 259c7fbc3fSMichał Górny m = line_re.match(l) 26*9b1d27b2SMichał Górny if m is None: 27*9b1d27b2SMichał Górny continue 289c7fbc3fSMichał Górny offset, size = [int(x) for x in m.groups()] 299c7fbc3fSMichał Górny 309c7fbc3fSMichał Górny inf.seek(offset) 319c7fbc3fSMichał Górny outf.seek(offset) 329c7fbc3fSMichał Górny outf.write(inf.read(size)) 339c7fbc3fSMichał Górny 349c7fbc3fSMichał Górny 359c7fbc3fSMichał Górnyif __name__ == "__main__": 369c7fbc3fSMichał Górny main() 37