6729edfa73fab06c1363e523d50cb1e32d266928
[openembedded.git] / contrib / oeaudit / oe_audit.py
1 #!/usr/bin/env python
2
3 import freebsd, oe, bb
4
5 def strip_oe_version(oe_version):
6     """
7     We need to strip the package epoch... and the PR to compare
8     it to the FreeBSD versions. Also FreeBSD seems to use _N as
9     PR so we might need to do more..
10     """
11     split = oe_version.split(':', 1)
12     ver = split[1]
13
14     split = ver.rsplit('-r', 1)
15     ver = split[0]
16     return ver
17
18 def strip_bsd_version(bsd_version):
19     """
20     FreeBSD is adding ,1 for revisions.. remove that
21     """
22     # FIXME return a tuple with a revision...
23     split = bsd_version.rsplit(',', 1)
24     split = split[0]
25     split = split.rsplit('_', 1)
26     return split[0]
27
28 def compare_versions(oe, freebsd, not_known):
29     def handle_package(oe_name, bsd_name):
30         if not oe_name in oe:
31             if oe_name == bsd_name:
32                 print >> not_known, "%s is not in OE" % oe_name
33             return
34
35         oe_version = strip_oe_version(oe[oe_name])
36         for ver in freebsd[bsd_name]:
37             affected = True
38             str = []
39             for (cmp, vers) in ver.versions:
40                 bsd_ver = strip_bsd_version(vers)
41                 cmp_res = bb.utils.vercmp(('0', oe_version, 'r0'), ('0', bsd_ver, 'r0'))
42                 if cmp == '<':
43                     if cmp_res >= 0:
44                         affected = False
45                     pass
46                 elif cmp == '<=':
47                     if cmp_res > 0:
48                         affected = False
49                     pass
50                 elif cmp == '>':
51                     if cmp_res <= 0:
52                         affected = False
53                     pass
54                 elif cmp == '>=':
55                     if cmp_res < 0:
56                         affected = False
57                     pass
58                 elif cmp == '=':
59                     if cmp_res > 0:
60                         affected = False
61                 else:
62                     print cmp
63                     assert True
64
65                 str.append("%s %s %s %s" % (oe_name, oe_version, cmp, bsd_ver))
66             if affected:
67                 print " && ".join(str), ver.link
68
69     for package in freebsd.keys():
70         # handle the various versions of OE packages
71         handle_package(package, package)
72         handle_package("%s-native" % package, package)
73         handle_package("%s-full-native" % package, package)
74         handle_package("%s-sdk" % package, package)
75
76
77 # read the input data
78 oe_packages = oe.read_available("available")
79 freebsd_vuln = freebsd.read_auditfile("auditfile")
80 buggy = open("not_in_oe.bugs", "w+")
81
82 compare_versions(oe=oe_packages, freebsd=freebsd_vuln, not_known=buggy)