From e173c8b548999a6e35b5b8b85aee7ad7f6ee033d Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Wed, 7 Jul 2021 21:37:35 -0400 Subject: [PATCH] Add release check to the housekeeping task --- .../management/commands/housekeeping.py | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/netbox/extras/management/commands/housekeeping.py b/netbox/extras/management/commands/housekeeping.py index 53dd74b96..4dbfa6725 100644 --- a/netbox/extras/management/commands/housekeeping.py +++ b/netbox/extras/management/commands/housekeeping.py @@ -1,10 +1,13 @@ from datetime import timedelta from importlib import import_module +import requests from django.conf import settings +from django.core.cache import cache from django.core.management.base import BaseCommand from django.db import DEFAULT_DB_ALIAS from django.utils import timezone +from packaging import version from extras.models import ObjectChange @@ -48,4 +51,37 @@ class Command(BaseCommand): f"\tSkipping: No retention period specified (CHANGELOG_RETENTION = {settings.CHANGELOG_RETENTION})" ) + # Check for new releases (if enabled) + self.stdout.write("[*] Checking for latest release") + if settings.RELEASE_CHECK_URL: + headers = { + 'Accept': 'application/vnd.github.v3+json', + } + + try: + self.stdout.write(f"\tFetching {settings.RELEASE_CHECK_URL}") + response = requests.get( + url=settings.RELEASE_CHECK_URL, + headers=headers, + proxies=settings.HTTP_PROXIES + ) + response.raise_for_status() + + releases = [] + for release in response.json(): + if 'tag_name' not in release or release.get('devrelease') or release.get('prerelease'): + continue + releases.append((version.parse(release['tag_name']), release.get('html_url'))) + latest_release = max(releases) + self.stdout.write(f"\tFound {len(response.json())} releases; {len(releases)} usable") + self.stdout.write(f"\tLatest release: {latest_release[0]}") + + # Cache the most recent release + cache.set('latest_release', latest_release, None) + + except requests.exceptions.RequestException as exc: + self.stdout.write(f"\tRequest error: {exc}") + else: + self.stdout.write(f"\tSkipping: RELEASE_CHECK_URL not set") + self.stdout.write("Finished.", self.style.SUCCESS)