mirror of
https://github.com/netbox-community/netbox.git
synced 2024-05-10 07:54:54 +00:00
53 lines
1.8 KiB
Python
53 lines
1.8 KiB
Python
import logging
|
|
|
|
import requests
|
|
from cacheops.simple import cache, CacheMiss
|
|
from django.conf import settings
|
|
from django_rq import job
|
|
from packaging import version
|
|
|
|
# Get an instance of a logger
|
|
logger = logging.getLogger('netbox.releases')
|
|
|
|
|
|
@job('check_releases')
|
|
def get_releases(pre_releases=False):
|
|
url = settings.RELEASE_CHECK_URL
|
|
headers = {
|
|
'Accept': 'application/vnd.github.v3+json',
|
|
}
|
|
releases = []
|
|
|
|
# Check whether this URL has failed recently and shouldn't be retried yet
|
|
try:
|
|
if url == cache.get('latest_release_no_retry'):
|
|
logger.info("Skipping release check; URL failed recently: {}".format(url))
|
|
return []
|
|
except CacheMiss:
|
|
pass
|
|
|
|
try:
|
|
logger.debug("Fetching new releases from {}".format(url))
|
|
response = requests.get(url, headers=headers, proxies=settings.HTTP_PROXIES)
|
|
response.raise_for_status()
|
|
total_releases = len(response.json())
|
|
|
|
for release in response.json():
|
|
if 'tag_name' not in release:
|
|
continue
|
|
if not pre_releases and (release.get('devrelease') or release.get('prerelease')):
|
|
continue
|
|
releases.append((version.parse(release['tag_name']), release.get('html_url')))
|
|
logger.debug("Found {} releases; {} usable".format(total_releases, len(releases)))
|
|
|
|
except requests.exceptions.RequestException:
|
|
# The request failed. Set a flag in the cache to disable future checks to this URL for 15 minutes.
|
|
logger.exception("Error while fetching {}. Disabling checks for 15 minutes.".format(url))
|
|
cache.set('latest_release_no_retry', url, 900)
|
|
return []
|
|
|
|
# Cache the most recent release
|
|
cache.set('latest_release', max(releases), settings.RELEASE_CHECK_TIMEOUT)
|
|
|
|
return releases
|