1*4882a593Smuzhiyun#!/usr/bin/env python3 2*4882a593Smuzhiyun 3*4882a593Smuzhiyunimport argparse 4*4882a593Smuzhiyunimport sys 5*4882a593Smuzhiyunimport json 6*4882a593Smuzhiyunimport subprocess 7*4882a593Smuzhiyunimport os 8*4882a593Smuzhiyunfrom cpedb import CPEDB, CPE 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun 11*4882a593Smuzhiyundef gen_update_xml_reports(cpeids, cpedb, output): 12*4882a593Smuzhiyun cpe_need_update = [] 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun for cpe in cpeids: 15*4882a593Smuzhiyun result = cpedb.find(cpe) 16*4882a593Smuzhiyun if not result: 17*4882a593Smuzhiyun result = cpedb.find_partial(CPE.no_version(cpe)) 18*4882a593Smuzhiyun if result: 19*4882a593Smuzhiyun cpe_need_update.append(cpe) 20*4882a593Smuzhiyun else: 21*4882a593Smuzhiyun print("WARNING: no match found for '%s'" % cpe) 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun for cpe in cpe_need_update: 24*4882a593Smuzhiyun xml = cpedb.gen_update_xml(cpe) 25*4882a593Smuzhiyun fname = CPE.product(cpe) + '-' + CPE.version(cpe) + '.xml' 26*4882a593Smuzhiyun print("Generating %s" % fname) 27*4882a593Smuzhiyun with open(os.path.join(output, fname), 'w+') as fp: 28*4882a593Smuzhiyun fp.write(xml) 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun print("Generated %d update files out of %d CPEs" % (len(cpe_need_update), len(cpeids))) 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun 33*4882a593Smuzhiyundef get_cpe_ids(): 34*4882a593Smuzhiyun print("Getting list of CPE for enabled packages") 35*4882a593Smuzhiyun cmd = ["make", "--no-print-directory", "show-info"] 36*4882a593Smuzhiyun js = json.loads(subprocess.check_output(cmd).decode("utf-8")) 37*4882a593Smuzhiyun return set([v["cpe-id"] for k, v in js.items() if "cpe-id" in v]) 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun 40*4882a593Smuzhiyundef resolvepath(path): 41*4882a593Smuzhiyun return os.path.abspath(os.path.expanduser(path)) 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun 44*4882a593Smuzhiyundef parse_args(): 45*4882a593Smuzhiyun parser = argparse.ArgumentParser() 46*4882a593Smuzhiyun parser.add_argument('--output', dest='output', 47*4882a593Smuzhiyun help='Path to the output CPE update files', type=resolvepath, required=True) 48*4882a593Smuzhiyun parser.add_argument('--nvd-path', dest='nvd_path', 49*4882a593Smuzhiyun help='Path to the local NVD database', type=resolvepath, required=True) 50*4882a593Smuzhiyun return parser.parse_args() 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun 53*4882a593Smuzhiyundef __main__(): 54*4882a593Smuzhiyun args = parse_args() 55*4882a593Smuzhiyun if not os.path.isdir(args.output): 56*4882a593Smuzhiyun print("ERROR: output directory %s does not exist" % args.output) 57*4882a593Smuzhiyun sys.exit(1) 58*4882a593Smuzhiyun cpedb = CPEDB(args.nvd_path) 59*4882a593Smuzhiyun cpedb.get_xml_dict() 60*4882a593Smuzhiyun cpeids = get_cpe_ids() 61*4882a593Smuzhiyun gen_update_xml_reports(cpeids, cpedb, args.output) 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun 64*4882a593Smuzhiyunif __name__ == "__main__": 65*4882a593Smuzhiyun __main__() 66