Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
61 commits
Select commit Hold shift + click to select a range
9f08e61
Update __init__.py
grumo35 Jan 31, 2022
bc964ca
Merge branch 'master' into patch-1
furlongm Feb 15, 2022
57b33e1
Merge branch 'master' into patch-1
furlongm Feb 16, 2022
8072e34
Merge branch 'master' into patch-1
furlongm Mar 20, 2025
fecca1c
Merge branch 'main' into patch-1
furlongm Mar 22, 2025
ae7d58e
Merge branch 'main' into patch-1
furlongm Mar 22, 2025
cd577bf
Update __init__.py
furlongm Mar 22, 2025
80a2d60
Update __init__.py
furlongm Mar 22, 2025
12b2d79
Merge branch 'main' into patch-1
furlongm Mar 22, 2025
d44a2ce
handle duplicate CVSSes better
Apr 23, 2025
08faacd
Merge pull request #681 from furlongm/cvss-fix
furlongm Apr 23, 2025
bf626c9
reduce max charfield length for mysql
furlongm Apr 8, 2025
382cd29
further reduce charfield size for mysql
furlongm Apr 18, 2025
20a42ed
reduce URLField max_length to 765
furlongm Apr 29, 2025
33d15b2
Merge pull request #673 from furlongm/bug/mysql-max-col-length
furlongm Apr 30, 2025
5685ef3
Merge branch 'main' into patch-1
furlongm Apr 30, 2025
bf5478c
Bump django from 4.2.20 to 4.2.21
dependabot[bot] May 8, 2025
d9c6df7
Merge pull request #682 from furlongm/dependabot/pip/django-4.2.21
furlongm May 8, 2025
57e5c0d
Bump django from 4.2.21 to 4.2.22
dependabot[bot] Jun 6, 2025
6a45e90
Bump requests from 2.32.3 to 2.32.4
dependabot[bot] Jun 10, 2025
64b1920
Merge pull request #684 from furlongm/dependabot/pip/django-4.2.22
furlongm Jun 10, 2025
334af8f
Merge pull request #685 from furlongm/dependabot/pip/requests-2.32.4
furlongm Jun 10, 2025
5674853
Remove unused dependency 'chardet' from requirements.txt
vtalos Jul 17, 2025
cf8c77f
Merge pull request #689 from vtalos/remove-unused-chardet
furlongm Jul 17, 2025
94fcb04
get_or_create_module only returns module
furlongm Aug 6, 2025
1480468
Bump django from 4.2.22 to 4.2.24
dependabot[bot] Sep 10, 2025
36cefb1
Merge pull request #700 from furlongm/dependabot/pip/django-4.2.24
furlongm Sep 10, 2025
6aee812
Merge pull request #693 from furlongm/module-creation
furlongm Sep 10, 2025
b616296
Package types are in the Package class
willfurnell Sep 12, 2025
3f8756c
Merge pull request #701 from willfurnell/package-fix
furlongm Sep 15, 2025
3676e78
Bump django from 4.2.24 to 4.2.25
dependabot[bot] Oct 1, 2025
1328e52
Merge pull request #704 from furlongm/dependabot/pip/django-4.2.25
furlongm Oct 3, 2025
1c26001
bump redis
furlongm Oct 3, 2025
0f54454
Update license in common.py
furlongm Oct 3, 2025
ce9f4f0
fix licenses
furlongm Oct 3, 2025
c651c3f
use GPL-3.0-only for debian copyright
furlongm Oct 3, 2025
807e5de
Merge pull request #377 from grumo35/patch-1
furlongm Oct 21, 2025
fb9b56c
fix tag handling
furlongm Oct 21, 2025
eee5675
fix some flake8-bugbear bugs
furlongm Oct 22, 2025
ad28bfe
Merge pull request #711 from furlongm/bugbear
furlongm Oct 22, 2025
cc14aea
Merge pull request #710 from furlongm/tags
furlongm Oct 30, 2025
2bcd4da
fix package filter list for errata
furlongm Oct 30, 2025
856f41f
add support for zstd compression in deb and rpm repos
furlongm Oct 30, 2025
7045e1b
Merge pull request #708 from furlongm/zstd-support
furlongm Oct 30, 2025
0c53c82
Merge pull request #713 from furlongm/package-errata-fix
furlongm Oct 30, 2025
8d9da89
simplify logging
furlongm Oct 30, 2025
dc68147
Merge pull request #714 from furlongm/logging
furlongm Oct 30, 2025
00fbd6e
use redis for caching and use locks for tasks
furlongm Oct 30, 2025
fd6f9aa
add errata source options to config file
furlongm Apr 18, 2025
60a80cd
Merge pull request #716 from furlongm/errata-source-options
furlongm Oct 30, 2025
8fa3eb2
Merge pull request #715 from furlongm/redis-caching
furlongm Oct 30, 2025
f06729e
remove daily cronjob in favour of patchman-celery
furlongm May 15, 2025
15e5ba1
Merge pull request #717 from furlongm/cronjob
furlongm Oct 30, 2025
a59a23b
add isort check
furlongm Oct 31, 2025
c13a564
Merge pull request #718 from furlongm/isort
furlongm Oct 31, 2025
5fa1ef0
Bump django from 4.2.25 to 4.2.26
dependabot[bot] Nov 6, 2025
c8cf5e0
Merge pull request #719 from furlongm/dependabot/pip/django-4.2.26
furlongm Nov 6, 2025
aac552d
Bump django from 4.2.26 to 4.2.27
dependabot[bot] Dec 3, 2025
ffa815b
Merge pull request #720 from furlongm/dependabot/pip/django-4.2.27
furlongm Dec 10, 2025
bdfafb1
Fix duplicate insert error in get_or_create_module by removing repo f…
mauricesmiley Dec 11, 2025
ac8a4bc
Adjust Module field lengths and unique_together for MySQL compatibility
mauricesmiley Dec 11, 2025
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
4 changes: 4 additions & 0 deletions .github/workflows/lint-and-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,10 @@ jobs:
pip install flake8
flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
flake8 . --count --max-line-length=120 --show-source --statistics
- name: Check isort
run: |
pip install isort
isort --check --profile=django .
- name: Set secret key
run: ./sbin/patchman-set-secret-key
- name: Test with django
Expand Down
3 changes: 2 additions & 1 deletion arch/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@
# along with Patchman. If not, see <http://www.gnu.org/licenses/>

from django.contrib import admin
from arch.models import PackageArchitecture, MachineArchitecture

from arch.models import MachineArchitecture, PackageArchitecture

admin.site.register(PackageArchitecture)
admin.site.register(MachineArchitecture)
2 changes: 1 addition & 1 deletion arch/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

from rest_framework import serializers

from arch.models import PackageArchitecture, MachineArchitecture
from arch.models import MachineArchitecture, PackageArchitecture


class PackageArchitectureSerializer(serializers.HyperlinkedModelSerializer):
Expand Down
12 changes: 6 additions & 6 deletions arch/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@
# You should have received a copy of the GNU General Public License
# along with Patchman. If not, see <http://www.gnu.org/licenses/>

from arch.models import PackageArchitecture, MachineArchitecture
from patchman.signals import info_message
from arch.models import MachineArchitecture, PackageArchitecture
from util.logging import info_message


def clean_package_architectures():
Expand All @@ -24,9 +24,9 @@ def clean_package_architectures():
parches = PackageArchitecture.objects.filter(package__isnull=True)
plen = parches.count()
if plen == 0:
info_message.send(sender=None, text='No orphaned PackageArchitectures found.')
info_message(text='No orphaned PackageArchitectures found.')
else:
info_message.send(sender=None, text=f'Removing {plen} orphaned PackageArchitectures')
info_message(text=f'Removing {plen} orphaned PackageArchitectures')
parches.delete()


Expand All @@ -39,9 +39,9 @@ def clean_machine_architectures():
)
mlen = marches.count()
if mlen == 0:
info_message.send(sender=None, text='No orphaned MachineArchitectures found.')
info_message(text='No orphaned MachineArchitectures found.')
else:
info_message.send(sender=None, text=f'Removing {mlen} orphaned MachineArchitectures')
info_message(text=f'Removing {mlen} orphaned MachineArchitectures')
marches.delete()


Expand Down
7 changes: 4 additions & 3 deletions arch/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,10 @@

from rest_framework import viewsets

from arch.models import PackageArchitecture, MachineArchitecture
from arch.serializers import PackageArchitectureSerializer, \
MachineArchitectureSerializer
from arch.models import MachineArchitecture, PackageArchitecture
from arch.serializers import (
MachineArchitectureSerializer, PackageArchitectureSerializer,
)


class PackageArchitectureViewSet(viewsets.ModelViewSet):
Expand Down
2 changes: 1 addition & 1 deletion debian/control
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ Depends: ${misc:Depends}, python3 (>= 3.11), python3-django (>= 4.2),
python3-requests, python3-colorama, python3-magic, python3-humanize,
python3-yaml, libapache2-mod-wsgi-py3, apache2, sqlite3,
celery, python3-celery, python3-django-celery-beat, redis-server,
python3-redis, python3-git, python3-django-taggit
python3-redis, python3-git, python3-django-taggit, python3-zstandard
Suggests: python3-mysqldb, python3-psycopg2, python3-pymemcache, memcached
Description: Django-based patch status monitoring tool for linux systems.
.
Expand Down
2 changes: 1 addition & 1 deletion debian/copyright
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ Source: https://github.com/furlongm/patchman
Files: *
Copyright: 2011-2012 VPAC http://www.vpac.org
2013-2021 Marcus Furlong <furlongm@gmail.com>
License: GPL-3.0
License: GPL-3.0-only
This package is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 3 only.
Expand Down
3 changes: 0 additions & 3 deletions debian/python3-patchman.cron.daily

This file was deleted.

1 change: 1 addition & 0 deletions domains/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
# along with Patchman. If not, see <http://www.gnu.org/licenses/>

from django.contrib import admin

from domains.models import Domain

admin.site.register(Domain)
1 change: 1 addition & 0 deletions errata/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
# along with Patchman. If not, see <http://www.gnu.org/licenses/>

from django.contrib import admin

from errata.models import Erratum


Expand Down
2 changes: 1 addition & 1 deletion errata/migrations/0001_initial.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ class Migration(migrations.Migration):
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('er_type', models.CharField(max_length=255)),
('url', models.URLField(max_length=2000)),
('url', models.URLField(max_length=765)),
],
),
migrations.CreateModel(
Expand Down
17 changes: 8 additions & 9 deletions errata/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,17 +16,16 @@

import json

from django.db import models
from django.db import IntegrityError, models
from django.urls import reverse
from django.db import IntegrityError

from errata.managers import ErratumManager
from packages.models import Package, PackageUpdate
from packages.utils import find_evr, get_matching_packages
from errata.managers import ErratumManager
from security.models import CVE, Reference
from security.utils import get_or_create_cve, get_or_create_reference
from patchman.signals import error_message
from util import get_url
from util.logging import error_message


class Erratum(models.Model):
Expand Down Expand Up @@ -70,7 +69,7 @@ def scan_for_security_updates(self):
try:
affected_update.save()
except IntegrityError as e:
error_message.send(sender=None, text=e)
error_message(text=e)
# a version of this update already exists that is
# marked as a security update, so delete this one
affected_update.delete()
Expand All @@ -84,7 +83,7 @@ def scan_for_security_updates(self):
try:
affected_update.save()
except IntegrityError as e:
error_message.send(sender=None, text=e)
error_message(text=e)
# a version of this update already exists that is
# marked as a security update, so delete this one
affected_update.delete()
Expand All @@ -93,7 +92,7 @@ def fetch_osv_dev_data(self):
osv_dev_url = f'https://api.osv.dev/v1/vulns/{self.name}'
res = get_url(osv_dev_url)
if res.status_code == 404:
error_message.send(sender=None, text=f'404 - Skipping {self.name} - {osv_dev_url}')
error_message(text=f'404 - Skipping {self.name} - {osv_dev_url}')
return
data = res.content
osv_dev_json = json.loads(data)
Expand All @@ -102,7 +101,7 @@ def fetch_osv_dev_data(self):
def parse_osv_dev_data(self, osv_dev_json):
name = osv_dev_json.get('id')
if name != self.name:
error_message.send(sender=None, text=f'Erratum name mismatch - {self.name} != {name}')
error_message(text=f'Erratum name mismatch - {self.name} != {name}')
return
related = osv_dev_json.get('related')
if related:
Expand Down Expand Up @@ -155,7 +154,7 @@ def add_cve(self, cve_id):
""" Add a CVE to an Erratum object
"""
if not cve_id.startswith('CVE') or not cve_id.split('-')[1].isdigit():
error_message.send(sender=None, text=f'Not a CVE ID: {cve_id}')
error_message(text=f'Not a CVE ID: {cve_id}')
return
self.cves.add(get_or_create_cve(cve_id))

Expand Down
2 changes: 1 addition & 1 deletion errata/sources/distros/alma.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@
from operatingsystems.utils import get_or_create_osrelease
from packages.models import Package
from packages.utils import get_or_create_package, parse_package_string
from util import get_url, fetch_content, get_setting_of_type
from patchman.signals import pbar_start, pbar_update
from util import fetch_content, get_setting_of_type, get_url


def update_alma_errata(concurrent_processing=True):
Expand Down
11 changes: 7 additions & 4 deletions errata/sources/distros/arch.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,13 @@
from django.db import connections

from operatingsystems.utils import get_or_create_osrelease
from patchman.signals import error_message, pbar_start, pbar_update
from packages.models import Package
from packages.utils import find_evr, get_matching_packages, get_or_create_package
from util import get_url, fetch_content
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


def update_arch_errata(concurrent_processing=False):
Expand Down Expand Up @@ -99,7 +102,7 @@ def process_arch_erratum(advisory, osrelease):
add_arch_erratum_references(e, advisory)
add_arch_erratum_packages(e, advisory)
except Exception as exc:
error_message.send(sender=None, text=exc)
error_message(text=exc)


def add_arch_linux_osrelease():
Expand Down
10 changes: 6 additions & 4 deletions errata/sources/distros/centos.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,15 @@
# along with Patchman. If not, see <http://www.gnu.org/licenses/>

import re

from defusedxml import ElementTree

from operatingsystems.utils import get_or_create_osrelease
from packages.models import Package
from packages.utils import parse_package_string, get_or_create_package
from patchman.signals import error_message, pbar_start, pbar_update
from util import bunzip2, get_url, fetch_content, get_sha1, get_setting_of_type
from packages.utils import get_or_create_package, parse_package_string
from patchman.signals import pbar_start, pbar_update
from util import bunzip2, fetch_content, get_setting_of_type, get_sha1, get_url
from util.logging import error_message


def update_centos_errata():
Expand All @@ -34,7 +36,7 @@ def update_centos_errata():
if actual_checksum != expected_checksum:
e = 'CEFS checksum mismatch, skipping CentOS errata parsing\n'
e += f'{actual_checksum} (actual) != {expected_checksum} (expected)'
error_message.send(sender=None, text=e)
error_message(text=e)
else:
if data:
parse_centos_errata(bunzip2(data))
Expand Down
15 changes: 8 additions & 7 deletions errata/sources/distros/debian.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,17 +18,18 @@
import csv
import re
from datetime import datetime
from debian.deb822 import Dsc
from io import StringIO

from debian.deb822 import Dsc
from django.db import connections

from operatingsystems.models import OSRelease
from operatingsystems.utils import get_or_create_osrelease
from packages.models import Package
from packages.utils import get_or_create_package, find_evr
from patchman.signals import error_message, pbar_start, pbar_update, warning_message
from util import get_url, fetch_content, get_setting_of_type, extract
from packages.utils import find_evr, get_or_create_package
from patchman.signals import pbar_start, pbar_update
from util import extract, fetch_content, get_setting_of_type, get_url
from util.logging import error_message, warning_message

DSCs = {}

Expand Down Expand Up @@ -217,7 +218,7 @@ def process_debian_erratum(erratum, accepted_codenames):
for package in packages:
process_debian_erratum_fixed_packages(e, package)
except Exception as exc:
error_message.send(sender=None, text=exc)
error_message(text=exc)


def parse_debian_erratum_package(line, accepted_codenames):
Expand Down Expand Up @@ -249,7 +250,7 @@ def fetch_debian_dsc_package_list(package, version):
""" Fetch the package list from a DSC file for a given source package/version
"""
if not DSCs.get(package) or not DSCs[package].get(version):
warning_message.send(sender=None, text=f'No DSC found for {package} {version}')
warning_message(text=f'No DSC found for {package} {version}')
return
source_url = DSCs[package][version]['url']
res = get_url(source_url)
Expand All @@ -263,7 +264,7 @@ def get_accepted_debian_codenames():
""" Get acceptable Debian OS codenames
Can be overridden by specifying DEBIAN_CODENAMES in settings
"""
default_codenames = ['bookworm', 'bullseye']
default_codenames = ['bookworm', 'trixie']
accepted_codenames = get_setting_of_type(
setting_name='DEBIAN_CODENAMES',
setting_type=list,
Expand Down
19 changes: 11 additions & 8 deletions errata/sources/distros/rocky.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,18 +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 json
import concurrent.futures
from tenacity import retry, retry_if_exception_type, stop_after_attempt, wait_exponential
import json

from django.db import connections
from django.db.utils import OperationalError
from tenacity import (
retry, retry_if_exception_type, stop_after_attempt, wait_exponential,
)

from operatingsystems.utils import get_or_create_osrelease
from packages.models import Package
from packages.utils import parse_package_string, get_or_create_package
from packages.utils import get_or_create_package, parse_package_string
from patchman.signals import pbar_start, pbar_update
from util import get_url, fetch_content, info_message, error_message
from util import fetch_content, get_url
from util.logging import error_message, info_message


def update_rocky_errata(concurrent_processing=True):
Expand All @@ -50,16 +53,16 @@ def check_rocky_errata_endpoint_health(rocky_errata_api_host):
health = json.loads(data)
if health.get('status') == 'ok':
s = f'Rocky Errata API healthcheck OK: {rocky_errata_healthcheck_url}'
info_message.send(sender=None, text=s)
info_message(text=s)
return True
else:
s = f'Rocky Errata API healthcheck FAILED: {rocky_errata_healthcheck_url}'
error_message.send(sender=None, text=s)
error_message(text=s)
return False
except Exception as e:
s = f'Rocky Errata API healthcheck exception occured: {rocky_errata_healthcheck_url}\n'
s += str(e)
error_message.send(sender=None, text=s)
error_message(text=s)
return False


Expand Down Expand Up @@ -194,7 +197,7 @@ def process_rocky_erratum(advisory):
add_rocky_erratum_oses(e, advisory)
add_rocky_erratum_packages(e, advisory)
except Exception as exc:
error_message.send(sender=None, text=exc)
error_message(text=exc)


def add_rocky_erratum_references(e, advisory):
Expand Down
Loading
Loading