diff --git a/netbox/core/plugins.py b/netbox/core/plugins.py index 374cfbe9a..9924bbee7 100644 --- a/netbox/core/plugins.py +++ b/netbox/core/plugins.py @@ -5,6 +5,7 @@ from dataclasses import dataclass, field from typing import Optional import requests +from django.contrib import messages from django.conf import settings from django.core.cache import cache from django.utils.translation import gettext_lazy as _ @@ -187,15 +188,21 @@ def get_catalog_plugins(): return plugins -def get_plugins(): +def get_plugins(request): """ Return a dictionary of all plugins (both catalog and locally installed), mapped by name. """ local_plugins = get_local_plugins() - catalog_plugins = cache.get('plugins-catalog-feed') - if not catalog_plugins: - catalog_plugins = get_catalog_plugins() - cache.set('plugins-catalog-feed', catalog_plugins, 3600) + catalog_plugins = cache.get('plugins-catalog-feed', default={}) + catalog_plugins_error = cache.get('plugins-catalog-error', default=False) + if not catalog_plugins and not catalog_plugins_error: + try: + catalog_plugins = get_catalog_plugins() + cache.set('plugins-catalog-feed', catalog_plugins, 3600) + except requests.exceptions.RequestException: + # Cache for 15 minutes to avoid spamming connection + cache.set('plugins-catalog-error', True, 900) + messages.warning(request, _("Plugins catalog could not be loaded")) plugins = catalog_plugins for k, v in local_plugins.items(): diff --git a/netbox/core/views.py b/netbox/core/views.py index 06c8b00d0..6e2d81d50 100644 --- a/netbox/core/views.py +++ b/netbox/core/views.py @@ -658,7 +658,7 @@ class PluginListView(UserPassesTestMixin, View): def get(self, request): q = request.GET.get('q', None) - plugins = get_plugins().values() + plugins = get_plugins(request).values() if q: plugins = [obj for obj in plugins if q.casefold() in obj.title_short.casefold()] @@ -683,7 +683,7 @@ class PluginView(UserPassesTestMixin, View): def get(self, request, name): - plugins = get_plugins() + plugins = get_plugins(request) if name not in plugins: raise Http404(_("Plugin {name} not found").format(name=name)) plugin = plugins[name]