3131from typing import Tuple
3232
3333from django .core import serializers
34+ from django .db import transaction
3435
3536from vulnerabilities import models
3637from vulnerabilities .data_source import Advisory , DataSource
@@ -110,6 +111,7 @@ def get_vuln_pkg_refs(vulnerability, package):
110111 )
111112
112113
114+ @transaction .atomic
113115def process_advisories (data_source : DataSource ) -> None :
114116 bulk_create_vuln_pkg_refs = set ()
115117 # Treat updated_advisories and added_advisories as same. Eventually
@@ -118,46 +120,39 @@ def process_advisories(data_source: DataSource) -> None:
118120 advisory_batches = chain (data_source .updated_advisories (), data_source .added_advisories ())
119121 for batch in advisory_batches :
120122 for advisory in batch :
121- try :
122- vuln , vuln_created = _get_or_create_vulnerability (advisory )
123- for vuln_ref in advisory .references :
124- ref , _ = models .VulnerabilityReference .objects .get_or_create (
125- vulnerability = vuln , reference_id = vuln_ref .reference_id , url = vuln_ref .url
126- )
127-
128- for score in vuln_ref .severities :
129- models .VulnerabilitySeverity .objects .update_or_create (
130- vulnerability = vuln ,
131- scoring_system = score .system .identifier ,
132- reference = ref ,
133- defaults = {"value" : str (score .value )},
134- )
135-
136- for aff_pkg_with_patched_pkg in advisory .affected_packages :
137- vulnerable_package , _ = _get_or_create_package (
138- aff_pkg_with_patched_pkg .vulnerable_package
139- )
140- patched_package = None
141- if aff_pkg_with_patched_pkg .patched_package :
142- patched_package , _ = _get_or_create_package (
143- aff_pkg_with_patched_pkg .patched_package
144- )
123+ vuln , vuln_created = _get_or_create_vulnerability (advisory )
124+ for vuln_ref in advisory .references :
125+ ref , _ = models .VulnerabilityReference .objects .get_or_create (
126+ vulnerability = vuln , reference_id = vuln_ref .reference_id , url = vuln_ref .url
127+ )
145128
146- prv , _ = models .PackageRelatedVulnerability .objects .get_or_create (
129+ for score in vuln_ref .severities :
130+ models .VulnerabilitySeverity .objects .update_or_create (
147131 vulnerability = vuln ,
148- package = vulnerable_package ,
132+ scoring_system = score .system .identifier ,
133+ reference = ref ,
134+ defaults = {"value" : str (score .value )},
149135 )
150136
151- if patched_package :
152- prv .patched_package = patched_package
153- prv .save ()
137+ for aff_pkg_with_patched_pkg in advisory .affected_packages :
138+ vulnerable_package , _ = _get_or_create_package (
139+ aff_pkg_with_patched_pkg .vulnerable_package
140+ )
141+ patched_package = None
142+ if aff_pkg_with_patched_pkg .patched_package :
143+ patched_package , _ = _get_or_create_package (
144+ aff_pkg_with_patched_pkg .patched_package
145+ )
154146
155- except Exception :
156- # TODO: store error but continue
157- logger .error (
158- f"Failed to process advisory: { advisory !r} :\n " + traceback .format_exc ()
147+ prv , _ = models .PackageRelatedVulnerability .objects .get_or_create (
148+ vulnerability = vuln ,
149+ package = vulnerable_package ,
159150 )
160151
152+ if patched_package :
153+ prv .patched_package = patched_package
154+ prv .save ()
155+
161156 models .PackageRelatedVulnerability .objects .bulk_create (
162157 [i .to_model_object () for i in bulk_create_vuln_pkg_refs ]
163158 )
0 commit comments