Merge ~ebarretto/ubuntu-cve-tracker:oval-roadmap-3 into ubuntu-cve-tracker:master
- Git
- lp:~ebarretto/ubuntu-cve-tracker
- oval-roadmap-3
- Merge into master
Proposed by
Eduardo Barretto
Status: | Merged |
---|---|
Merge reported by: | Eduardo Barretto |
Merged at revision: | 7091ff8b2fc3d3affdd276618c465637e336b363 |
Proposed branch: | ~ebarretto/ubuntu-cve-tracker:oval-roadmap-3 |
Merge into: | ubuntu-cve-tracker:master |
Diff against target: |
298 lines (+61/-33) 2 files modified
scripts/cve_lib.py (+45/-8) scripts/generate-oval (+16/-25) |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Leonidas S. Barbosa | Approve | ||
Review via email: mp+432139@code.launchpad.net |
Commit message
Description of the change
The changes here aim to facilitate the oval generation.
For that we add and oval parameter to the subprojects configuration.
Also, rework of product_series function and add needs_oval function.
To post a comment you must log in.
- 65fd154... by Eduardo Barretto
-
cve_lib: Fix lunar indentation
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | diff --git a/scripts/cve_lib.py b/scripts/cve_lib.py | |||
2 | index 09cb6d9..d8d6bf6 100755 | |||
3 | --- a/scripts/cve_lib.py | |||
4 | +++ b/scripts/cve_lib.py | |||
5 | @@ -111,6 +111,7 @@ subprojects = { | |||
6 | 111 | }, | 111 | }, |
7 | 112 | "esm/trusty": { | 112 | "esm/trusty": { |
8 | 113 | "eol": False, | 113 | "eol": False, |
9 | 114 | "oval": True, | ||
10 | 114 | "packages": ["trusty-esm-supported.txt"], | 115 | "packages": ["trusty-esm-supported.txt"], |
11 | 115 | "name": "Ubuntu 14.04 ESM", | 116 | "name": "Ubuntu 14.04 ESM", |
12 | 116 | "codename": "Trusty Tahr", | 117 | "codename": "Trusty Tahr", |
13 | @@ -122,6 +123,7 @@ subprojects = { | |||
14 | 122 | }, | 123 | }, |
15 | 123 | "esm-infra/xenial": { | 124 | "esm-infra/xenial": { |
16 | 124 | "eol": False, | 125 | "eol": False, |
17 | 126 | "oval": True, | ||
18 | 125 | "components": ["main", "restricted"], | 127 | "components": ["main", "restricted"], |
19 | 126 | "packages": ["esm-infra-xenial-supported.txt"], | 128 | "packages": ["esm-infra-xenial-supported.txt"], |
20 | 127 | "name": "Ubuntu 16.04 ESM", | 129 | "name": "Ubuntu 16.04 ESM", |
21 | @@ -133,6 +135,7 @@ subprojects = { | |||
22 | 133 | }, | 135 | }, |
23 | 134 | "fips/xenial": { | 136 | "fips/xenial": { |
24 | 135 | "eol": False, | 137 | "eol": False, |
25 | 138 | "oval": True, | ||
26 | 136 | "packages": ["fips-xenial-supported.txt"], | 139 | "packages": ["fips-xenial-supported.txt"], |
27 | 137 | "name": "Ubuntu 16.04 FIPS Certified", | 140 | "name": "Ubuntu 16.04 FIPS Certified", |
28 | 138 | "codename": "Xenial Xerus", | 141 | "codename": "Xenial Xerus", |
29 | @@ -142,6 +145,7 @@ subprojects = { | |||
30 | 142 | }, | 145 | }, |
31 | 143 | "fips/bionic": { | 146 | "fips/bionic": { |
32 | 144 | "eol": False, | 147 | "eol": False, |
33 | 148 | "oval": True, | ||
34 | 145 | "packages": ["fips-bionic-supported.txt"], | 149 | "packages": ["fips-bionic-supported.txt"], |
35 | 146 | "name": "Ubuntu 18.04 FIPS Certified", | 150 | "name": "Ubuntu 18.04 FIPS Certified", |
36 | 147 | "codename": "Bionic Beaver", | 151 | "codename": "Bionic Beaver", |
37 | @@ -151,6 +155,7 @@ subprojects = { | |||
38 | 151 | }, | 155 | }, |
39 | 152 | "fips/focal": { | 156 | "fips/focal": { |
40 | 153 | "eol": False, | 157 | "eol": False, |
41 | 158 | "oval": True, | ||
42 | 154 | "packages": ["fips-focal-supported.txt"], | 159 | "packages": ["fips-focal-supported.txt"], |
43 | 155 | "name": "Ubuntu 20.04 FIPS Certified", | 160 | "name": "Ubuntu 20.04 FIPS Certified", |
44 | 156 | "codename": "Focal Fossa", | 161 | "codename": "Focal Fossa", |
45 | @@ -160,6 +165,7 @@ subprojects = { | |||
46 | 160 | }, | 165 | }, |
47 | 161 | "fips-updates/xenial": { | 166 | "fips-updates/xenial": { |
48 | 162 | "eol": False, | 167 | "eol": False, |
49 | 168 | "oval": True, | ||
50 | 163 | "packages": ["fips-updates-xenial-supported.txt"], | 169 | "packages": ["fips-updates-xenial-supported.txt"], |
51 | 164 | "name": "Ubuntu 16.04 FIPS Compliant", | 170 | "name": "Ubuntu 16.04 FIPS Compliant", |
52 | 165 | "codename": "Xenial Xerus", | 171 | "codename": "Xenial Xerus", |
53 | @@ -169,6 +175,7 @@ subprojects = { | |||
54 | 169 | }, | 175 | }, |
55 | 170 | "fips-updates/bionic": { | 176 | "fips-updates/bionic": { |
56 | 171 | "eol": False, | 177 | "eol": False, |
57 | 178 | "oval": True, | ||
58 | 172 | "packages": ["fips-updates-bionic-supported.txt"], | 179 | "packages": ["fips-updates-bionic-supported.txt"], |
59 | 173 | "name": "Ubuntu 18.04 FIPS Compliant", | 180 | "name": "Ubuntu 18.04 FIPS Compliant", |
60 | 174 | "codename": "Bionic Beaver", | 181 | "codename": "Bionic Beaver", |
61 | @@ -178,6 +185,7 @@ subprojects = { | |||
62 | 178 | }, | 185 | }, |
63 | 179 | "fips-updates/focal": { | 186 | "fips-updates/focal": { |
64 | 180 | "eol": False, | 187 | "eol": False, |
65 | 188 | "oval": True, | ||
66 | 181 | "packages": ["fips-updates-focal-supported.txt"], | 189 | "packages": ["fips-updates-focal-supported.txt"], |
67 | 182 | "name": "Ubuntu 20.04 FIPS Compliant", | 190 | "name": "Ubuntu 20.04 FIPS Compliant", |
68 | 183 | "codename": "Focal Fossa", | 191 | "codename": "Focal Fossa", |
69 | @@ -187,6 +195,7 @@ subprojects = { | |||
70 | 187 | }, | 195 | }, |
71 | 188 | "ros-esm/kinetic": { | 196 | "ros-esm/kinetic": { |
72 | 189 | "eol": False, | 197 | "eol": False, |
73 | 198 | "oval": False, | ||
74 | 190 | "packages": ["ros-esm-xenial-kinetic-supported.txt"], | 199 | "packages": ["ros-esm-xenial-kinetic-supported.txt"], |
75 | 191 | "name": "Ubuntu 16.04 ROS ESM", | 200 | "name": "Ubuntu 16.04 ROS ESM", |
76 | 192 | "codename": "Xenial Xerus", | 201 | "codename": "Xenial Xerus", |
77 | @@ -198,6 +207,7 @@ subprojects = { | |||
78 | 198 | }, | 207 | }, |
79 | 199 | "ros-esm/melodic": { | 208 | "ros-esm/melodic": { |
80 | 200 | "eol": False, | 209 | "eol": False, |
81 | 210 | "oval": False, | ||
82 | 201 | "packages": ["ros-esm-bionic-melodic-supported.txt"], | 211 | "packages": ["ros-esm-bionic-melodic-supported.txt"], |
83 | 202 | "name": "Ubuntu 18.04 ROS ESM", | 212 | "name": "Ubuntu 18.04 ROS ESM", |
84 | 203 | "codename": "Bionic Beaver", | 213 | "codename": "Bionic Beaver", |
85 | @@ -452,6 +462,7 @@ subprojects = { | |||
86 | 452 | }, | 462 | }, |
87 | 453 | "ubuntu/bionic": { | 463 | "ubuntu/bionic": { |
88 | 454 | "eol": False, | 464 | "eol": False, |
89 | 465 | "oval": True, | ||
90 | 455 | "components": ["main", "restricted", "universe", "multiverse", "partner"], | 466 | "components": ["main", "restricted", "universe", "multiverse", "partner"], |
91 | 456 | "name": "Ubuntu 18.04 LTS", | 467 | "name": "Ubuntu 18.04 LTS", |
92 | 457 | "codename": "Bionic Beaver", | 468 | "codename": "Bionic Beaver", |
93 | @@ -488,6 +499,7 @@ subprojects = { | |||
94 | 488 | }, | 499 | }, |
95 | 489 | "ubuntu/focal": { | 500 | "ubuntu/focal": { |
96 | 490 | "eol": False, | 501 | "eol": False, |
97 | 502 | "oval": True, | ||
98 | 491 | "components": ["main", "restricted", "universe", "multiverse", "partner"], | 503 | "components": ["main", "restricted", "universe", "multiverse", "partner"], |
99 | 492 | "name": "Ubuntu 20.04 LTS", | 504 | "name": "Ubuntu 20.04 LTS", |
100 | 493 | "codename": "Focal Fossa", | 505 | "codename": "Focal Fossa", |
101 | @@ -524,6 +536,7 @@ subprojects = { | |||
102 | 524 | }, | 536 | }, |
103 | 525 | "ubuntu/jammy": { | 537 | "ubuntu/jammy": { |
104 | 526 | "eol": False, | 538 | "eol": False, |
105 | 539 | "oval": True, | ||
106 | 527 | "components": ["main", "restricted", "universe", "multiverse", "partner"], | 540 | "components": ["main", "restricted", "universe", "multiverse", "partner"], |
107 | 528 | "name": "Ubuntu 22.04 LTS", | 541 | "name": "Ubuntu 22.04 LTS", |
108 | 529 | "codename": "Jammy Jellyfish", | 542 | "codename": "Jammy Jellyfish", |
109 | @@ -533,6 +546,7 @@ subprojects = { | |||
110 | 533 | }, | 546 | }, |
111 | 534 | "ubuntu/kinetic": { | 547 | "ubuntu/kinetic": { |
112 | 535 | "eol": False, | 548 | "eol": False, |
113 | 549 | "oval": True, | ||
114 | 536 | "components": ["main", "restricted", "universe", "multiverse"], | 550 | "components": ["main", "restricted", "universe", "multiverse"], |
115 | 537 | "name": "Ubuntu 22.10", | 551 | "name": "Ubuntu 22.10", |
116 | 538 | "codename": "Kinetic Kudu", | 552 | "codename": "Kinetic Kudu", |
117 | @@ -542,16 +556,18 @@ subprojects = { | |||
118 | 542 | "stamp": 1666461600, | 556 | "stamp": 1666461600, |
119 | 543 | }, | 557 | }, |
120 | 544 | "ubuntu/lunar": { | 558 | "ubuntu/lunar": { |
128 | 545 | "eol": False, | 559 | "eol": False, |
129 | 546 | "components": ["main", "restricted", "universe", "multiverse"], | 560 | "oval": True, |
130 | 547 | "name": "Ubuntu 23.04", | 561 | "components": ["main", "restricted", "universe", "multiverse"], |
131 | 548 | "codename": "Lunar Lobster", | 562 | "name": "Ubuntu 23.04", |
132 | 549 | "alias": "lunar", | 563 | "codename": "Lunar Lobster", |
133 | 550 | "devel": True, # there can be only one ⚔ | 564 | "alias": "lunar", |
134 | 551 | "description": "Interim Release", | 565 | "devel": True, # there can be only one ⚔ |
135 | 566 | "description": "Interim Release", | ||
136 | 552 | }, | 567 | }, |
137 | 553 | "snap": { | 568 | "snap": { |
138 | 554 | "eol": False, | 569 | "eol": False, |
139 | 570 | "oval": False, | ||
140 | 555 | "packages": ["snap-supported.txt"], | 571 | "packages": ["snap-supported.txt"], |
141 | 556 | } | 572 | } |
142 | 557 | } | 573 | } |
143 | @@ -561,9 +577,19 @@ def product_series(rel): | |||
144 | 561 | """Return the product,series tuple for rel.""" | 577 | """Return the product,series tuple for rel.""" |
145 | 562 | series = "" | 578 | series = "" |
146 | 563 | parts = rel.split('/', 1) | 579 | parts = rel.split('/', 1) |
147 | 564 | product = parts[0] | ||
148 | 565 | if len(parts) == 2: | 580 | if len(parts) == 2: |
149 | 581 | product = parts[0] | ||
150 | 566 | series = parts[1] | 582 | series = parts[1] |
151 | 583 | # handle trusty/esm case | ||
152 | 584 | if product in releases: | ||
153 | 585 | product, series = series, product | ||
154 | 586 | elif parts[0] in releases: | ||
155 | 587 | # by default ubuntu releases have an omitted ubuntu product | ||
156 | 588 | # this avoids cases like snaps | ||
157 | 589 | product = PRODUCT_UBUNTU | ||
158 | 590 | series = parts[0] | ||
159 | 591 | else: | ||
160 | 592 | product = parts[0] | ||
161 | 567 | return product, series | 593 | return product, series |
162 | 568 | 594 | ||
163 | 569 | # get the subproject details for rel along with it's canonical name, product and series | 595 | # get the subproject details for rel along with it's canonical name, product and series |
164 | @@ -673,6 +699,16 @@ def release_ppa(rel): | |||
165 | 673 | pass | 699 | pass |
166 | 674 | return ppa | 700 | return ppa |
167 | 675 | 701 | ||
168 | 702 | def needs_oval(rel): | ||
169 | 703 | """Return if OVAL should be generated for a given subproject""" | ||
170 | 704 | oval_type = None | ||
171 | 705 | _, product, series, details = get_subproject_details(rel) | ||
172 | 706 | try: | ||
173 | 707 | oval_type = details["oval"] | ||
174 | 708 | except (KeyError, TypeError): | ||
175 | 709 | pass | ||
176 | 710 | return oval_type | ||
177 | 711 | |||
178 | 676 | def get_subproject_description(rel): | 712 | def get_subproject_description(rel): |
179 | 677 | """Return the description for a given release.""" | 713 | """Return the description for a given release.""" |
180 | 678 | description = "?" | 714 | description = "?" |
181 | @@ -773,6 +809,7 @@ def load_external_subprojects(): | |||
182 | 773 | # subproject settings | 809 | # subproject settings |
183 | 774 | config = read_external_subproject_config(rel) | 810 | config = read_external_subproject_config(rel) |
184 | 775 | subprojects[rel].setdefault("ppa", config["ppa"]) | 811 | subprojects[rel].setdefault("ppa", config["ppa"]) |
185 | 812 | subprojects[rel].setdefault("oval", config["oval"]) | ||
186 | 776 | subprojects[rel].setdefault("name", config["name"]) | 813 | subprojects[rel].setdefault("name", config["name"]) |
187 | 777 | subprojects[rel].setdefault("description", config["description"]) | 814 | subprojects[rel].setdefault("description", config["description"]) |
188 | 778 | subprojects[rel].setdefault("parent", config["parent"]) | 815 | subprojects[rel].setdefault("parent", config["parent"]) |
189 | diff --git a/scripts/generate-oval b/scripts/generate-oval | |||
190 | index 58f1dc6..849ef82 100755 | |||
191 | --- a/scripts/generate-oval | |||
192 | +++ b/scripts/generate-oval | |||
193 | @@ -36,7 +36,7 @@ import tempfile | |||
194 | 36 | #from launchpadlib.launchpad import Launchpad | 36 | #from launchpadlib.launchpad import Launchpad |
195 | 37 | 37 | ||
196 | 38 | import apt_pkg | 38 | import apt_pkg |
198 | 39 | from cve_lib import (kernel_srcs, get_orig_rel_name, load_cve, get_subproject_details, PRODUCT_UBUNTU, all_releases, eol_releases, devel_release, release_parent, release_name, release_ppa, release_progenitor) | 39 | from cve_lib import (kernel_srcs, product_series, load_cve, PRODUCT_UBUNTU, all_releases, eol_releases, devel_release, release_parent, release_name, release_ppa, release_progenitor, needs_oval) |
199 | 40 | from kernel_lib import (meta_kernels, kernel_package_abi, kernel_package_version) | 40 | from kernel_lib import (meta_kernels, kernel_package_abi, kernel_package_version) |
200 | 41 | import oval_lib | 41 | import oval_lib |
201 | 42 | import lpl_common | 42 | import lpl_common |
202 | @@ -47,16 +47,13 @@ if 'init_system' in dir(apt_pkg): | |||
203 | 47 | else: | 47 | else: |
204 | 48 | apt_pkg.InitSystem() | 48 | apt_pkg.InitSystem() |
205 | 49 | 49 | ||
206 | 50 | supported_products = [PRODUCT_UBUNTU, 'esm', 'esm-infra', 'esm-apps', 'fips', 'fips-updates'] | ||
207 | 51 | supported_releases = [] | 50 | supported_releases = [] |
208 | 52 | for r in set(all_releases).difference(set(eol_releases)).difference(set([devel_release])): | 51 | for r in set(all_releases).difference(set(eol_releases)).difference(set([devel_release])): |
216 | 53 | _, product, _, _ = get_subproject_details(r) | 52 | if needs_oval(r): |
217 | 54 | if product in supported_products: | 53 | supported_releases.append(r) |
218 | 55 | if r not in supported_releases: | 54 | parent = release_parent(r) |
219 | 56 | supported_releases.append(r) | 55 | if parent and parent not in supported_releases: |
220 | 57 | parent = release_parent(r) | 56 | supported_releases.append(parent) |
214 | 58 | if parent and parent not in supported_releases: | ||
215 | 59 | supported_releases.append(parent) | ||
221 | 60 | 57 | ||
222 | 61 | default_cves_to_process = ['active/CVE-*', 'retired/CVE-*'] | 58 | default_cves_to_process = ['active/CVE-*', 'retired/CVE-*'] |
223 | 62 | 59 | ||
224 | @@ -71,12 +68,12 @@ def main(): | |||
225 | 71 | global debug_level | 68 | global debug_level |
226 | 72 | 69 | ||
227 | 73 | # parse command line options | 70 | # parse command line options |
229 | 74 | parser = argparse.ArgumentParser(description='Generate CVE OVAL from ' + | 71 | parser = argparse.ArgumentParser(description='Generate CVE OVAL from ' |
230 | 75 | 'CVE metadata files.') | 72 | 'CVE metadata files.') |
231 | 76 | parser.add_argument('pathname', nargs='*', | 73 | parser.add_argument('pathname', nargs='*', |
235 | 77 | help='pathname patterns (globs) specifying CVE ' + | 74 | help='pathname patterns (globs) specifying CVE ' |
236 | 78 | 'metadata files to be converted into OVAL ' + | 75 | 'metadata files to be converted into OVAL ' |
237 | 79 | '(default: "./active/CVE-*" "./retired/CVE-*")') | 76 | '(default: "./active/CVE-*" "./retired/CVE-*")') |
238 | 80 | parser.add_argument('--oci', action='store_true', | 77 | parser.add_argument('--oci', action='store_true', |
239 | 81 | help='Also generate OVAL files for scanning Official Cloud Image manifests') | 78 | help='Also generate OVAL files for scanning Official Cloud Image manifests') |
240 | 82 | parser.add_argument('--output-dir', nargs='?', default='./', | 79 | parser.add_argument('--output-dir', nargs='?', default='./', |
241 | @@ -86,7 +83,7 @@ def main(): | |||
242 | 86 | parser.add_argument('--oci-prefix', nargs='?', default='oci.', | 83 | parser.add_argument('--oci-prefix', nargs='?', default='oci.', |
243 | 87 | help='Prefix to use for OCI manifest OVAL files names (required if oci-output-dir is the same as output-dir)') | 84 | help='Prefix to use for OCI manifest OVAL files names (required if oci-output-dir is the same as output-dir)') |
244 | 88 | parser.add_argument('--cve-prefix-dir', nargs='?', default='./', | 85 | parser.add_argument('--cve-prefix-dir', nargs='?', default='./', |
246 | 89 | help='location of CVE metadata files to process ' + | 86 | help='location of CVE metadata files to process ' |
247 | 90 | '(default is ./)') | 87 | '(default is ./)') |
248 | 91 | parser.add_argument('--no-progress', action='store_true', | 88 | parser.add_argument('--no-progress', action='store_true', |
249 | 92 | help='do not show progress meter') | 89 | help='do not show progress meter') |
250 | @@ -99,15 +96,15 @@ def main(): | |||
251 | 99 | parser.add_argument('--usn-oval', action='store_true', | 96 | parser.add_argument('--usn-oval', action='store_true', |
252 | 100 | help='generates oval from the USN database') | 97 | help='generates oval from the USN database') |
253 | 101 | parser.add_argument('--usn-db-dir', default='./', type=str, | 98 | parser.add_argument('--usn-db-dir', default='./', type=str, |
255 | 102 | help='location of USN database.json to process ' + | 99 | help='location of USN database.json to process ' |
256 | 103 | '(default is ./)') | 100 | '(default is ./)') |
257 | 104 | parser.add_argument('--usn-number', default=None, type=str, | 101 | parser.add_argument('--usn-number', default=None, type=str, |
258 | 105 | help='if passed specifics a USN for the oval_usn generator') | 102 | help='if passed specifics a USN for the oval_usn generator') |
259 | 106 | parser.add_argument('--usn-oval-release', default=None, type=str, | 103 | parser.add_argument('--usn-oval-release', default=None, type=str, |
260 | 107 | help='specifies a release to generate the oval usn') | 104 | help='specifies a release to generate the oval usn') |
261 | 108 | parser.add_argument('--packages', nargs='+', action='store', default=None, | 105 | parser.add_argument('--packages', nargs='+', action='store', default=None, |
264 | 109 | help='generates oval for specific packages. Only for'+ | 106 | help='generates oval for specific packages. Only for ' |
265 | 110 | ' CVE OVAL') | 107 | 'CVE OVAL') |
266 | 111 | 108 | ||
267 | 112 | args = parser.parse_args() | 109 | args = parser.parse_args() |
268 | 113 | pathnames = args.pathname or default_cves_to_process | 110 | pathnames = args.pathname or default_cves_to_process |
269 | @@ -356,12 +353,6 @@ def parse_cve_file(filepath, cache, pkg_filter=None): | |||
270 | 356 | continue | 353 | continue |
271 | 357 | if rel not in supported_releases: | 354 | if rel not in supported_releases: |
272 | 358 | continue | 355 | continue |
273 | 359 | try: | ||
274 | 360 | _, product, _, _ = get_subproject_details(rel) | ||
275 | 361 | if product not in supported_products: | ||
276 | 362 | continue | ||
277 | 363 | except KeyError: | ||
278 | 364 | continue | ||
279 | 365 | state, details = data['pkgs'][pkg][rel] | 356 | state, details = data['pkgs'][pkg][rel] |
280 | 366 | status_line = state | 357 | status_line = state |
281 | 367 | if len(details) > 0: | 358 | if len(details) > 0: |
282 | @@ -556,7 +547,7 @@ class PackageCache(): | |||
283 | 556 | if parent: | 547 | if parent: |
284 | 557 | self.releases[release] = self.ubuntu.getSeries(name_or_version=parent) | 548 | self.releases[release] = self.ubuntu.getSeries(name_or_version=parent) |
285 | 558 | else: | 549 | else: |
287 | 559 | self.releases[release] = self.ubuntu.getSeries(name_or_version=get_orig_rel_name(release)) | 550 | self.releases[release] = self.ubuntu.getSeries(name_or_version=product_series(release)[1]) |
288 | 560 | 551 | ||
289 | 561 | ppa = release_ppa(release) | 552 | ppa = release_ppa(release) |
290 | 562 | if ppa: | 553 | if ppa: |
291 | @@ -690,7 +681,7 @@ def generate_oval_usn(outdir, usn, usn_release, cve_dir, usn_db_dir, ociprefix=N | |||
292 | 690 | else: | 681 | else: |
293 | 691 | for release in supported_releases: | 682 | for release in supported_releases: |
294 | 692 | # for now we don't differentiate products (e.g. esm) in the USN DB | 683 | # for now we don't differentiate products (e.g. esm) in the USN DB |
296 | 693 | _, product, _, _ = get_subproject_details(release) | 684 | product, series = product_series(release) |
297 | 694 | if product != PRODUCT_UBUNTU: | 685 | if product != PRODUCT_UBUNTU: |
298 | 695 | continue | 686 | continue |
299 | 696 | 687 |
lgtm