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() 10*2238dcc3SJonas Devlieghere argp.add_argument("infile", type=argparse.FileType("rb"), help="Input vmcore file") 11*2238dcc3SJonas Devlieghere argp.add_argument( 12*2238dcc3SJonas Devlieghere "outfile", type=argparse.FileType("wb"), help="Output vmcore file" 13*2238dcc3SJonas Devlieghere ) 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) 269b1d27b2SMichał Górny if m is None: 279b1d27b2SMichał 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