#!/usr/bin/env python import errno import fnmatch import getopt import re import sys from scapy.all import * def preprocess(f): for line in f: m = re.match(r'^#PARSE#\s*(.*?)\s*$', line) if m: yield m.group(1) def nameval_pairs(f): for line in f: m = re.match(r'^(\w+)=(.*)', line) assert(m is not None) yield m.group(1), m.group(2) class ResponseSet (object): def __init__(self): self.osclass = None self.responses = {} def __getitem__(self, key): return self.responses[key] def parse(self, f): for name, val in nameval_pairs(preprocess(f)): if name == "osclass": assert(self.osclass is None) self.osclass = tuple([x.strip() for x in val.split("|")]) elif name == "test6_id": self.current_id = val assert(self.current_id not in self.responses) self.responses[self.current_id] = [] elif name == "test4_id": # Ignore. self.current_id = None elif name == "result6" or name == "timed6_result": assert(self.current_id is not None) m = re.match(r'^{\s*(\d+)\s*,(?:\s*\d+\s*,)?\s*([0-9a-fA-F ]*)}\s*$', val) assert(m is not None) test_no, contents_hex = m.groups() test_no = int(test_no) contents_hex = re.sub(r'\s+', "", contents_hex) contents = contents_hex.decode("hex") packet = IPv6(contents) self.responses[self.current_id].append(packet) def parse_file(self, filename): f = open(filename, "r") try: return self.parse(f) finally: f.close() def find_files(path, pattern): try: for fn in os.listdir(path): if fnmatch.fnmatch(fn, pattern): yield os.path.join(path, fn) except OSError, e: if e.errno != errno.ENOTDIR: raise yield path def main(): opts, args = getopt.gnu_getopt(sys.argv[1:], "") fp_filenames = args for filename in fp_filenames: rs = ResponseSet() rs.parse_file(filename) if __name__ == "__main__": main()