#!/usr/bin/env python import getopt import sys import parse def usage(f = sys.stdout): print >> f, """\ Usage: %s [FP_FILENAME]... Unwrap IPv6 fingerprints. Reads from stdin if no FP_FILENAME. -h, --help show this help. -r, --rle run-length encode test values. -s, --strip strip out metadata fields for database entry.\ """ % sys.argv[0] class options (object): rle = False strip = False STRIPPED = set([ ("SCAN", "D"), ("SCAN", "E"), ("SCAN", "PV"), ("SCAN", "G"), ("SCAN", "TM"), ("SCAN", "P"), ("SCAN", "M"), ]) def get_inputs(args): if not args: yield sys.stdin else: for arg in args: f = open(arg) yield f f.close() def runs(s): prev = None i = 0 while i + 1 < len(s): chunk = s[i:i+2] n = 1 i += 2 while i + 1 < len(s) and s[i:i+2] == chunk: n += 1 i += 2 yield chunk, n if i < len(s): yield s[i:], 1 def run_length_encode(s): parts = [] for chunk, n in runs(s): if n < 3: parts.append(chunk * n) else: parts.append("%s{%d}" % (chunk, n)) return "".join(parts) def format_fp(fp): for probe_name, tests in fp: tests_strs = [] for n, v in tests: if options.strip and (probe_name, n) in STRIPPED: continue if options.rle: v = run_length_encode(v) tests_strs.append("%s=%s" % (n, v)) print probe_name + "(" + "%".join(tests_strs) + ")" opts, args = getopt.gnu_getopt(sys.argv[1:], "hrs", ["help", "rle", "strip"]) for o, a in opts: if o == "-h" or o == "--help": usage() sys.exit() elif o == "-r" or o == "--rle": options.rle = True elif o == "-s" or o == "--strip": options.strip = True for f in get_inputs(args): fp = parse.parse_nmapfp_raw(parse.grep_nmapfp(f)) format_fp(fp)