Просмотр исходного кода

Add release check to the housekeeping task

jeremystretch 4 лет назад
Родитель
Сommit
e173c8b548
1 измененных файлов с 36 добавлено и 0 удалено
  1. 36 0
      netbox/extras/management/commands/housekeeping.py

+ 36 - 0
netbox/extras/management/commands/housekeeping.py

@@ -1,10 +1,13 @@
 from datetime import timedelta
 from datetime import timedelta
 from importlib import import_module
 from importlib import import_module
 
 
+import requests
 from django.conf import settings
 from django.conf import settings
+from django.core.cache import cache
 from django.core.management.base import BaseCommand
 from django.core.management.base import BaseCommand
 from django.db import DEFAULT_DB_ALIAS
 from django.db import DEFAULT_DB_ALIAS
 from django.utils import timezone
 from django.utils import timezone
+from packaging import version
 
 
 from extras.models import ObjectChange
 from extras.models import ObjectChange
 
 
@@ -48,4 +51,37 @@ class Command(BaseCommand):
                 f"\tSkipping: No retention period specified (CHANGELOG_RETENTION = {settings.CHANGELOG_RETENTION})"
                 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)
         self.stdout.write("Finished.", self.style.SUCCESS)