diff --git a/netbox/core/data_backends.py b/netbox/core/data_backends.py index f20ac017c..8b36c6995 100644 --- a/netbox/core/data_backends.py +++ b/netbox/core/data_backends.py @@ -13,7 +13,7 @@ from django.utils.translation import gettext as _ from netbox.data_backends import DataBackend from netbox.utils import register_data_backend -from utilities.constants import DATA_SOURCE_SUPPORTED_SCHEMAS, DATA_SOURCE_SUPPORTED_SOCK_SCHEMAS +from utilities.constants import HTTP_PROXY_SUPPORTED_SCHEMAS, HTTP_PROXY_SUPPORTED_SOCK_SCHEMAS from utilities.socks import ProxyPoolManager from .exceptions import SyncError @@ -75,12 +75,12 @@ class GitBackend(DataBackend): # Apply HTTP proxy (if configured) if settings.HTTP_PROXIES: if proxy := settings.HTTP_PROXIES.get(self.url_scheme, None): - if urlparse(proxy).scheme not in DATA_SOURCE_SUPPORTED_SCHEMAS: + if urlparse(proxy).scheme not in HTTP_PROXY_SUPPORTED_SCHEMAS: raise ImproperlyConfigured(f"Unsupported Git DataSource proxy scheme: {urlparse(proxy).scheme}") if self.url_scheme in ('http', 'https'): config.set("http", "proxy", proxy) - if urlparse(proxy).scheme in DATA_SOURCE_SUPPORTED_SOCK_SCHEMAS: + if urlparse(proxy).scheme in HTTP_PROXY_SUPPORTED_SOCK_SCHEMAS: self.use_socks = True return config diff --git a/netbox/utilities/constants.py b/netbox/utilities/constants.py index 3ec6fd2dd..2b93f2b96 100644 --- a/netbox/utilities/constants.py +++ b/netbox/utilities/constants.py @@ -94,6 +94,6 @@ HTML_ALLOWED_ATTRIBUTES = { "th": {"align"}, } -DATA_SOURCE_SUPPORTED_SOCK_SCHEMAS = ['socks4', 'socks4a', 'socks4h', 'socks5', 'socks5a', 'socks5h'] -DATA_SOURCE_SOCK_RDNS_SCHEMAS = ['socks4h', 'socks4a', 'socks5h', 'socks5a'] -DATA_SOURCE_SUPPORTED_SCHEMAS = ['http', 'https', 'socks4', 'socks4a', 'socks4h', 'socks5', 'socks5a', 'socks5h'] +HTTP_PROXY_SUPPORTED_SOCK_SCHEMAS = ['socks4', 'socks4a', 'socks4h', 'socks5', 'socks5a', 'socks5h'] +HTTP_PROXY_SOCK_RDNS_SCHEMAS = ['socks4h', 'socks4a', 'socks5h', 'socks5a'] +HTTP_PROXY_SUPPORTED_SCHEMAS = ['http', 'https', 'socks4', 'socks4a', 'socks4h', 'socks5', 'socks5a', 'socks5h'] diff --git a/netbox/utilities/socks.py b/netbox/utilities/socks.py index 8df82fb7a..bb0b6b250 100644 --- a/netbox/utilities/socks.py +++ b/netbox/utilities/socks.py @@ -1,7 +1,12 @@ +import logging + from urllib.parse import urlparse from urllib3 import PoolManager, HTTPConnectionPool, HTTPSConnectionPool from urllib3.connection import HTTPConnection, HTTPSConnection -from .constants import DATA_SOURCE_SOCK_RDNS_SCHEMAS +from .constants import HTTP_PROXY_SOCK_RDNS_SCHEMAS + + +logger = logging.getLogger('netbox.utilities') class ProxyHTTPConnection(HTTPConnection): @@ -18,7 +23,12 @@ class ProxyHTTPConnection(HTTPConnection): super().__init__(*args, **kwargs) def _new_conn(self): - from python_socks.sync import Proxy + try: + from python_socks.sync import Proxy + except ModuleNotFoundError as e: + logger.info("Configuring an HTTP proxy using SOCKS requires the python_socks library. Check that it has been installed.") + raise e + proxy = Proxy.from_url(self._proxy_url, rdns=self.use_rdns) return proxy.connect( dest_host=self.host, @@ -70,7 +80,7 @@ class ProxyPoolManager(PoolManager): def __init__(self, proxy_url, timeout=5, num_pools=10, headers=None, **connection_pool_kw): # python_socks uses rdns param to denote remote DNS parsing and # doesn't accept the 'h' or 'a' in the proxy URL - if use_rdns := urlparse(proxy_url).scheme in DATA_SOURCE_SOCK_RDNS_SCHEMAS: + if use_rdns := urlparse(proxy_url).scheme in HTTP_PROXY_SOCK_RDNS_SCHEMAS: proxy_url = proxy_url.replace('socks5h:', 'socks5:').replace('socks5a:', 'socks5:') proxy_url = proxy_url.replace('socks4h:', 'socks4:').replace('socks4a:', 'socks4:')