| #!/usr/bin/env python3 |
| |
| import argparse |
| import sys |
| import json |
| import subprocess |
| import os |
| from cpedb import CPEDB, CPE |
| |
| |
| def gen_update_xml_reports(cpeids, cpedb, output): |
| cpe_need_update = [] |
| |
| for cpe in cpeids: |
| result = cpedb.find(cpe) |
| if not result: |
| result = cpedb.find_partial(CPE.no_version(cpe)) |
| if result: |
| cpe_need_update.append(cpe) |
| else: |
| print("WARNING: no match found for '%s'" % cpe) |
| |
| for cpe in cpe_need_update: |
| xml = cpedb.gen_update_xml(cpe) |
| fname = CPE.product(cpe) + '-' + CPE.version(cpe) + '.xml' |
| print("Generating %s" % fname) |
| with open(os.path.join(output, fname), 'w+') as fp: |
| fp.write(xml) |
| |
| print("Generated %d update files out of %d CPEs" % (len(cpe_need_update), len(cpeids))) |
| |
| |
| def get_cpe_ids(): |
| print("Getting list of CPE for enabled packages") |
| cmd = ["make", "--no-print-directory", "show-info"] |
| js = json.loads(subprocess.check_output(cmd).decode("utf-8")) |
| return set([v["cpe-id"] for k, v in js.items() if "cpe-id" in v]) |
| |
| |
| def resolvepath(path): |
| return os.path.abspath(os.path.expanduser(path)) |
| |
| |
| def parse_args(): |
| parser = argparse.ArgumentParser() |
| parser.add_argument('--output', dest='output', |
| help='Path to the output CPE update files', type=resolvepath, required=True) |
| parser.add_argument('--nvd-path', dest='nvd_path', |
| help='Path to the local NVD database', type=resolvepath, required=True) |
| return parser.parse_args() |
| |
| |
| def __main__(): |
| args = parse_args() |
| if not os.path.isdir(args.output): |
| print("ERROR: output directory %s does not exist" % args.output) |
| sys.exit(1) |
| cpedb = CPEDB(args.nvd_path) |
| cpedb.get_xml_dict() |
| cpeids = get_cpe_ids() |
| gen_update_xml_reports(cpeids, cpedb, args.output) |
| |
| |
| if __name__ == "__main__": |
| __main__() |