Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 8 additions & 7 deletions errata/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -91,15 +91,16 @@ def _mark_updates_security(self, updates):
error_message(text=e)
update.delete()

def fetch_osv_dev_data(self):
def fetch_osv_dev_data(self, session=None):
""" Fetch osv.dev JSON for this erratum. Returns parsed JSON or None.
"""
osv_dev_url = f'https://api.osv.dev/v1/vulns/{self.name}'
res = get_url(osv_dev_url)
res = get_url(osv_dev_url, session=session)
if res is None:
return None
if res.status_code == 404:
error_message(text=f'404 - Skipping {self.name} - {osv_dev_url}')
return
data = res.content
osv_dev_json = json.loads(data)
self.parse_osv_dev_data(osv_dev_json)
return None
return json.loads(res.content)

def parse_osv_dev_data(self, osv_dev_json):
from django.db.models import Q
Expand Down
43 changes: 21 additions & 22 deletions errata/sources/distros/alma.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,19 +14,21 @@
# You should have received a copy of the GNU General Public License
# along with Patchman. If not, see <http://www.gnu.org/licenses/>

import concurrent.futures
import json

from django.db import connections

from operatingsystems.utils import get_or_create_osrelease
from errata.utils import get_or_create_erratum
from modules.utils import get_matching_modules
from operatingsystems.utils import (
get_or_create_osrelease, normalize_el_osrelease,
)
from packages.models import Package
from packages.utils import get_or_create_package, parse_package_string
from patchman.signals import pbar_start, pbar_update
from util import fetch_content, get_setting_of_type, get_url
from util import fetch_content, get_setting_of_type, get_url, run_concurrently
from util.logging import clear_forked_pbar


def update_alma_errata(concurrent_processing=True):
def update_alma_errata(concurrent_processing=True, max_workers=25):
""" Update Alma Linux advisories from errata.almalinux.org:
https://errata.almalinux.org/8/errata.full.json
https://errata.almalinux.org/9/errata.full.json
Expand All @@ -40,7 +42,7 @@ def update_alma_errata(concurrent_processing=True):
)
for release in alma_releases:
advisories = fetch_alma_advisories(release)
process_alma_errata(release, advisories, concurrent_processing)
process_alma_errata(release, advisories, concurrent_processing, max_workers)


def fetch_alma_advisories(release):
Expand All @@ -54,11 +56,11 @@ def fetch_alma_advisories(release):
return advisories


def process_alma_errata(release, advisories, concurrent_processing):
def process_alma_errata(release, advisories, concurrent_processing, max_workers=25):
""" Process Alma Linux Errata
"""
if concurrent_processing:
process_alma_errata_concurrently(release, advisories)
process_alma_errata_concurrently(release, advisories, max_workers)
else:
process_alma_errata_serially(release, advisories)

Expand All @@ -73,24 +75,24 @@ def process_alma_errata_serially(release, advisories):
pbar_update.send(sender=None, index=i + 1)


def process_alma_errata_concurrently(release, advisories):
def process_alma_errata_concurrently(release, advisories, max_workers=25):
""" Process Alma Linux Errata concurrently
"""
connections.close_all()
elen = len(advisories)
pbar_start.send(sender=None, ptext=f'Processing {elen} Alma {release} Errata', plen=elen)
i = 0
with concurrent.futures.ProcessPoolExecutor(max_workers=25) as executor:
futures = [executor.submit(process_alma_erratum, release, advisory) for advisory in advisories]
for future in concurrent.futures.as_completed(futures):
i += 1
pbar_update.send(sender=None, index=i + 1)
args = [(release, advisory) for advisory in advisories]
for i, _ in enumerate(run_concurrently(process_alma_erratum_wrapper, args, max_workers)):
pbar_update.send(sender=None, index=i + 1)


def process_alma_erratum_wrapper(args):
clear_forked_pbar()
return process_alma_erratum(*args)


def process_alma_erratum(release, advisory):
""" Process a single Alma Linux Erratum
"""
from errata.utils import get_or_create_erratum
erratum_name = advisory.get('id')
issue_date = advisory.get('issued_date')
synopsis = advisory.get('title')
Expand All @@ -110,7 +112,6 @@ def process_alma_erratum(release, advisory):
def add_alma_erratum_osreleases(e, release):
""" Update OS Release for Alma Linux errata
"""
from operatingsystems.utils import normalize_el_osrelease
osrelease_name = normalize_el_osrelease(f'Alma Linux {release}')
osrelease = get_or_create_osrelease(name=osrelease_name)
e.osreleases.add(osrelease)
Expand Down Expand Up @@ -150,7 +151,6 @@ def add_alma_erratum_packages(e, advisory):
def add_alma_erratum_modules(e, advisory):
""" Parse and add modules for Alma Linux errata
"""
from modules.utils import get_matching_modules
fixed_packages = set()
modules = advisory.get('modules')
for module in modules:
Expand All @@ -160,8 +160,7 @@ def add_alma_erratum_modules(e, advisory):
stream = module.get('stream')
version = module.get('version')
matching_modules = get_matching_modules(name, stream, version, context, arch)
for match in matching_modules:
for match in matching_modules.prefetch_related('packages'):
for fixed_package in match.packages.all():
match.packages.add(fixed_package)
fixed_packages.add(fixed_package)
e.add_fixed_packages(fixed_packages)
27 changes: 16 additions & 11 deletions errata/sources/distros/arch.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,25 +17,25 @@
import concurrent.futures
import json

from django.db import connections

from errata.utils import get_or_create_erratum
from operatingsystems.utils import get_or_create_osrelease
from packages.models import Package
from packages.utils import (
find_evr, get_matching_packages, get_or_create_package,
)
from patchman.signals import pbar_start, pbar_update
from util import fetch_content, get_url
from util.logging import error_message
from util.logging import clear_forked_pbar, error_message


def update_arch_errata(concurrent_processing=False):
def update_arch_errata(concurrent_processing=False, max_workers=25):
""" Update Arch Linux Errata from the following sources:
https://security.archlinux.org/advisories.json
"""
add_arch_linux_osrelease()
advisories = fetch_arch_errata()
parse_arch_errata(advisories, concurrent_processing)
if advisories:
parse_arch_errata(advisories, concurrent_processing, max_workers)


def fetch_arch_errata():
Expand All @@ -44,14 +44,16 @@ def fetch_arch_errata():
"""
res = get_url('https://security.archlinux.org/advisories.json')
advisories = fetch_content(res, 'Fetching Arch Advisories')
if advisories is None:
return None
return json.loads(advisories)


def parse_arch_errata(advisories, concurrent_processing):
def parse_arch_errata(advisories, concurrent_processing, max_workers=25):
""" Parse Arch Linux Errata Advisories
"""
if concurrent_processing:
parse_arch_errata_concurrently(advisories)
parse_arch_errata_concurrently(advisories, max_workers)
else:
parse_arch_errata_serially(advisories)

Expand All @@ -67,15 +69,14 @@ def parse_arch_errata_serially(advisories):
pbar_update.send(sender=None, index=i + 1)


def parse_arch_errata_concurrently(advisories):
def parse_arch_errata_concurrently(advisories, max_workers=25):
""" Parse Arch Linux Errata Advisories concurrently
"""
osrelease = get_or_create_osrelease(name='Arch Linux')
connections.close_all()
elen = len(advisories)
pbar_start.send(sender=None, ptext=f'Processing {elen} Arch Advisories', plen=elen)
i = 0
with concurrent.futures.ProcessPoolExecutor(max_workers=25) as executor:
with concurrent.futures.ThreadPoolExecutor(max_workers=max_workers) as executor:
futures = [executor.submit(process_arch_erratum, advisory, osrelease) for advisory in advisories]
for future in concurrent.futures.as_completed(futures):
i += 1
Expand All @@ -85,7 +86,7 @@ def parse_arch_errata_concurrently(advisories):
def process_arch_erratum(advisory, osrelease):
""" Process a single Arch Linux Erratum
"""
from errata.utils import get_or_create_erratum
clear_forked_pbar()
try:
name = advisory.get('name')
issue_date = advisory.get('date')
Expand Down Expand Up @@ -121,6 +122,8 @@ def add_arch_erratum_references(e, advisory):
e.add_reference('ASA', url)
raw_url = f'{url}/raw'
res = get_url(raw_url)
if res is None:
return
data = res.content
parse_arch_erratum_raw(e, data.decode())

Expand Down Expand Up @@ -152,6 +155,8 @@ def add_arch_erratum_packages(e, advisory):
group_id = advisory.get('group')
group_url = f'https://security.archlinux.org/group/{group_id}.json'
res = get_url(group_url)
if res is None:
return
data = res.content
group = json.loads(data)
packages = group.get('packages')
Expand Down
Loading
Loading