diff options
Diffstat (limited to 'tools/extract_kernel.py')
-rwxr-xr-x | tools/extract_kernel.py | 84 |
1 files changed, 60 insertions, 24 deletions
diff --git a/tools/extract_kernel.py b/tools/extract_kernel.py index 8ca11d1cc6..92a647be3c 100755 --- a/tools/extract_kernel.py +++ b/tools/extract_kernel.py @@ -40,10 +40,10 @@ COMPRESSION_ALGO = ( # LINUX_COMPILE_HOST ") (" LINUX_COMPILER ") " UTS_VERSION "\n"; LINUX_BANNER_PREFIX = b'Linux version ' LINUX_BANNER_REGEX = LINUX_BANNER_PREFIX + \ - r'([0-9]+[.][0-9]+[.][0-9]+).* \(.*@.*\) \(.*\) .*\n' + r'(?P<release>(?P<version>[0-9]+[.][0-9]+[.][0-9]+).*) \(.*@.*\) \(.*\) .*\n' -def get_version(input_bytes, start_idx): +def get_from_release(input_bytes, start_idx, key): null_idx = input_bytes.find('\x00', start_idx) if null_idx < 0: return None @@ -53,24 +53,43 @@ def get_version(input_bytes, start_idx): return None mo = re.match(LINUX_BANNER_REGEX, linux_banner) if mo: - return mo.group(1) + return mo.group(key) return None -def dump_version(input_bytes): +def dump_from_release(input_bytes, key): + """ + Helper of dump_version and dump_release + """ idx = 0 while True: idx = input_bytes.find(LINUX_BANNER_PREFIX, idx) if idx < 0: return None - version = get_version(input_bytes, idx) - if version: - return version + value = get_from_release(input_bytes, idx, key) + if value: + return value idx += len(LINUX_BANNER_PREFIX) +def dump_version(input_bytes): + """ + Dump kernel version, w.x.y, from input_bytes. Search for the string + "Linux version " and do pattern matching after it. See LINUX_BANNER_REGEX. + """ + return dump_from_release(input_bytes, "version") + + +def dump_release(input_bytes): + """ + Dump kernel release, w.x.y-..., from input_bytes. Search for the string + "Linux version " and do pattern matching after it. See LINUX_BANNER_REGEX. + """ + return dump_from_release(input_bytes, "release") + + def dump_configs(input_bytes): """ Dump kernel configuration from input_bytes. This can be done when @@ -140,6 +159,23 @@ def decompress_dump(func, input_bytes): if o: return o + +def dump_to_file(f, dump_fn, input_bytes, desc): + """ + Call decompress_dump(dump_fn, input_bytes) and write to f. If it fails, return + False; otherwise return True. + """ + if f is not None: + o = decompress_dump(dump_fn, input_bytes) + if o: + f.write(o) + else: + sys.stderr.write( + "Cannot extract kernel {}".format(desc)) + return False + return True + + def main(): parser = argparse.ArgumentParser( formatter_class=argparse.RawTextHelpFormatter, @@ -165,6 +201,13 @@ def main(): nargs='?', type=argparse.FileType('wb'), const=sys.stdout) + parser.add_argument('--output-release', + help='If specified, write kernel release. Use stdout if ' + 'no file is specified.', + metavar='FILE', + nargs='?', + type=argparse.FileType('wb'), + const=sys.stdout) parser.add_argument('--tools', help='Decompression tools to use. If not specified, PATH ' 'is searched.', @@ -181,25 +224,18 @@ def main(): input_bytes = args.input.read() ret = 0 - if args.output_configs is not None: - o = decompress_dump(dump_configs, input_bytes) - if o: - args.output_configs.write(o) - else: - sys.stderr.write( - "Cannot extract kernel configs in {}".format(args.input.name)) - ret = 1 - if args.output_version is not None: - o = decompress_dump(dump_version, input_bytes) - if o: - args.output_version.write(o) - else: - sys.stderr.write( - "Cannot extract kernel versions in {}".format(args.input.name)) - ret = 1 + if not dump_to_file(args.output_configs, dump_configs, input_bytes, + "configs in {}".format(args.input.name)): + ret = 1 + if not dump_to_file(args.output_version, dump_version, input_bytes, + "version in {}".format(args.input.name)): + ret = 1 + if not dump_to_file(args.output_release, dump_release, input_bytes, + "kernel release in {}".format(args.input.name)): + ret = 1 return ret if __name__ == '__main__': - exit(main()) + sys.exit(main()) |