xref: /OK3568_Linux_fs/buildroot/support/scripts/gen-missing-cpe (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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