Merge branch 'netbox-community:develop' into add_edit_cable_button

This commit is contained in:
Mario 2023-01-06 00:13:17 +01:00 committed by GitHub
commit c442c07d99
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 43 additions and 12 deletions

View File

@ -19,7 +19,7 @@ employed by thousands of organizations around the world.
## About NetBox ## About NetBox
![Screenshot of Netbox UI](docs/media/screenshots/netbox-ui.png "NetBox UI") ![Screenshot of NetBox UI](docs/media/screenshots/netbox-ui.png "NetBox UI")
Myriad infrastructure components can be modeled in NetBox, including: Myriad infrastructure components can be modeled in NetBox, including:

View File

@ -1,4 +1,4 @@
# The IP address (typically localhost) and port that the Netbox WSGI process should listen on # The IP address (typically localhost) and port that the NetBox WSGI process should listen on
bind = '127.0.0.1:8001' bind = '127.0.0.1:8001'
# Number of gunicorn workers to spawn. This should typically be 2n+1, where # Number of gunicorn workers to spawn. This should typically be 2n+1, where

View File

@ -40,8 +40,8 @@ is represented in JSON as
```json ```json
{ {
'tag': ['alpha', 'bravo'], "tag": ["alpha", "bravo"],
'status': 'active', "status": "active",
'region_id': 51 "region_id": 51
} }
``` ```

View File

@ -168,7 +168,7 @@ Some text to show that the reference links can follow later.
## Images ## Images
``` ```
Here's the Netbox logo (hover to see the title text): Here's the NetBox logo (hover to see the title text):
Inline-style: Inline-style:
![alt text](/static/netbox_logo.png "Logo Title Text 1") ![alt text](/static/netbox_logo.png "Logo Title Text 1")
@ -179,7 +179,7 @@ Reference-style:
[logo]: /static/netbox_logo.png "Logo Title Text 2" [logo]: /static/netbox_logo.png "Logo Title Text 2"
``` ```
Here's the Netbox logo (hover to see the title text): Here's the NetBox logo (hover to see the title text):
Inline-style: Inline-style:
![alt text](/static/netbox_logo.png "Logo Title Text 1") ![alt text](/static/netbox_logo.png "Logo Title Text 1")

View File

@ -2,6 +2,17 @@
## v3.4.3 (FUTURE) ## v3.4.3 (FUTURE)
### Enhancements
* [#9996](https://github.com/netbox-community/netbox/issues/9996) - Introduce `CA_CERT_PATH` parameter to define SSL CA path for Redis servers
* [#11150](https://github.com/netbox-community/netbox/issues/11150) - Add primary IPv4/v6 address filters for devices
* [#11245](https://github.com/netbox-community/netbox/issues/11245) - Enable export templates for journal entries
* [#11371](https://github.com/netbox-community/netbox/issues/11371) - Introduce additional 100M Ethernet interface types
### Bug Fixes
* [#11403](https://github.com/netbox-community/netbox/issues/11403) - Fix exception when scheduling a job in the past
--- ---
## v3.4.2 (2023-01-03) ## v3.4.2 (2023-01-03)

View File

@ -785,7 +785,10 @@ class InterfaceTypeChoices(ChoiceSet):
TYPE_LAG = 'lag' TYPE_LAG = 'lag'
# Ethernet # Ethernet
TYPE_100ME_FX = '100base-fx'
TYPE_100ME_LFX = '100base-lfx'
TYPE_100ME_FIXED = '100base-tx' TYPE_100ME_FIXED = '100base-tx'
TYPE_100ME_T1 = '100base-t1'
TYPE_1GE_FIXED = '1000base-t' TYPE_1GE_FIXED = '1000base-t'
TYPE_1GE_GBIC = '1000base-x-gbic' TYPE_1GE_GBIC = '1000base-x-gbic'
TYPE_1GE_SFP = '1000base-x-sfp' TYPE_1GE_SFP = '1000base-x-sfp'
@ -918,7 +921,10 @@ class InterfaceTypeChoices(ChoiceSet):
( (
'Ethernet (fixed)', 'Ethernet (fixed)',
( (
(TYPE_100ME_FX, '100BASE-FX (10/100ME FIBER)'),
(TYPE_100ME_LFX, '100BASE-LFX (10/100ME FIBER)'),
(TYPE_100ME_FIXED, '100BASE-TX (10/100ME)'), (TYPE_100ME_FIXED, '100BASE-TX (10/100ME)'),
(TYPE_100ME_T1, '100BASE-T1 (10/100ME Single Pair)'),
(TYPE_1GE_FIXED, '1000BASE-T (1GE)'), (TYPE_1GE_FIXED, '1000BASE-T (1GE)'),
(TYPE_2GE_FIXED, '2.5GBASE-T (2.5GE)'), (TYPE_2GE_FIXED, '2.5GBASE-T (2.5GE)'),
(TYPE_5GE_FIXED, '5GBASE-T (5GE)'), (TYPE_5GE_FIXED, '5GBASE-T (5GE)'),

View File

@ -20,7 +20,7 @@ from utilities.utils import NetBoxFakeRequest
class Command(BaseCommand): class Command(BaseCommand):
help = "Run a script in Netbox" help = "Run a script in NetBox"
def add_arguments(self, parser): def add_arguments(self, parser):
parser.add_argument( parser.add_argument(

View File

@ -514,7 +514,7 @@ class ImageAttachment(WebhooksMixin, ChangeLoggedModel):
return objectchange return objectchange
class JournalEntry(CustomFieldsMixin, CustomLinksMixin, TagsMixin, WebhooksMixin, ChangeLoggedModel): class JournalEntry(CustomFieldsMixin, CustomLinksMixin, TagsMixin, WebhooksMixin, ExportTemplatesMixin, ChangeLoggedModel):
""" """
A historical remark concerning an object; collectively, these form an object's journal. The journal is used to A historical remark concerning an object; collectively, these form an object's journal. The journal is used to
preserve historical context around an object, and complements NetBox's built-in change logging. For example, you preserve historical context around an object, and complements NetBox's built-in change logging. For example, you

View File

@ -38,6 +38,8 @@ REDIS = {
# Set this to True to skip TLS certificate verification # Set this to True to skip TLS certificate verification
# This can expose the connection to attacks, be careful # This can expose the connection to attacks, be careful
# 'INSECURE_SKIP_TLS_VERIFY': False, # 'INSECURE_SKIP_TLS_VERIFY': False,
# Set a path to a certificate authority, typically used with a self signed certificate.
# 'CA_CERT_PATH': '/etc/ssl/certs/ca.crt',
}, },
'caching': { 'caching': {
'HOST': 'localhost', 'HOST': 'localhost',
@ -52,6 +54,8 @@ REDIS = {
# Set this to True to skip TLS certificate verification # Set this to True to skip TLS certificate verification
# This can expose the connection to attacks, be careful # This can expose the connection to attacks, be careful
# 'INSECURE_SKIP_TLS_VERIFY': False, # 'INSECURE_SKIP_TLS_VERIFY': False,
# Set a path to a certificate authority, typically used with a self signed certificate.
# 'CA_CERT_PATH': '/etc/ssl/certs/ca.crt',
} }
} }

View File

@ -235,6 +235,7 @@ TASKS_REDIS_PASSWORD = TASKS_REDIS.get('PASSWORD', '')
TASKS_REDIS_DATABASE = TASKS_REDIS.get('DATABASE', 0) TASKS_REDIS_DATABASE = TASKS_REDIS.get('DATABASE', 0)
TASKS_REDIS_SSL = TASKS_REDIS.get('SSL', False) TASKS_REDIS_SSL = TASKS_REDIS.get('SSL', False)
TASKS_REDIS_SKIP_TLS_VERIFY = TASKS_REDIS.get('INSECURE_SKIP_TLS_VERIFY', False) TASKS_REDIS_SKIP_TLS_VERIFY = TASKS_REDIS.get('INSECURE_SKIP_TLS_VERIFY', False)
TASKS_REDIS_CA_CERT_PATH = TASKS_REDIS.get('CA_CERT_PATH', False)
# Caching # Caching
if 'caching' not in REDIS: if 'caching' not in REDIS:
@ -251,6 +252,7 @@ CACHING_REDIS_SENTINELS = REDIS['caching'].get('SENTINELS', [])
CACHING_REDIS_SENTINEL_SERVICE = REDIS['caching'].get('SENTINEL_SERVICE', 'default') CACHING_REDIS_SENTINEL_SERVICE = REDIS['caching'].get('SENTINEL_SERVICE', 'default')
CACHING_REDIS_PROTO = 'rediss' if REDIS['caching'].get('SSL', False) else 'redis' CACHING_REDIS_PROTO = 'rediss' if REDIS['caching'].get('SSL', False) else 'redis'
CACHING_REDIS_SKIP_TLS_VERIFY = REDIS['caching'].get('INSECURE_SKIP_TLS_VERIFY', False) CACHING_REDIS_SKIP_TLS_VERIFY = REDIS['caching'].get('INSECURE_SKIP_TLS_VERIFY', False)
CACHING_REDIS_CA_CERT_PATH = REDIS['caching'].get('CA_CERT_PATH', False)
CACHES = { CACHES = {
'default': { 'default': {
@ -262,6 +264,8 @@ CACHES = {
} }
} }
} }
if CACHING_REDIS_SENTINELS: if CACHING_REDIS_SENTINELS:
DJANGO_REDIS_CONNECTION_FACTORY = 'django_redis.pool.SentinelConnectionFactory' DJANGO_REDIS_CONNECTION_FACTORY = 'django_redis.pool.SentinelConnectionFactory'
CACHES['default']['LOCATION'] = f'{CACHING_REDIS_PROTO}://{CACHING_REDIS_SENTINEL_SERVICE}/{CACHING_REDIS_DATABASE}' CACHES['default']['LOCATION'] = f'{CACHING_REDIS_PROTO}://{CACHING_REDIS_SENTINEL_SERVICE}/{CACHING_REDIS_DATABASE}'
@ -270,7 +274,9 @@ if CACHING_REDIS_SENTINELS:
if CACHING_REDIS_SKIP_TLS_VERIFY: if CACHING_REDIS_SKIP_TLS_VERIFY:
CACHES['default']['OPTIONS'].setdefault('CONNECTION_POOL_KWARGS', {}) CACHES['default']['OPTIONS'].setdefault('CONNECTION_POOL_KWARGS', {})
CACHES['default']['OPTIONS']['CONNECTION_POOL_KWARGS']['ssl_cert_reqs'] = False CACHES['default']['OPTIONS']['CONNECTION_POOL_KWARGS']['ssl_cert_reqs'] = False
if CACHING_REDIS_CA_CERT_PATH:
CACHES['default']['OPTIONS'].setdefault('CONNECTION_POOL_KWARGS', {})
CACHES['default']['OPTIONS']['CONNECTION_POOL_KWARGS']['ssl_ca_certs'] = CACHING_REDIS_CA_CERT_PATH
# #
# Sessions # Sessions
@ -648,6 +654,10 @@ RQ_PARAMS.update({
'DEFAULT_TIMEOUT': RQ_DEFAULT_TIMEOUT, 'DEFAULT_TIMEOUT': RQ_DEFAULT_TIMEOUT,
}) })
if TASKS_REDIS_CA_CERT_PATH:
RQ_PARAMS.setdefault('REDIS_CLIENT_KWARGS', {})
RQ_PARAMS['REDIS_CLIENT_KWARGS']['ssl_ca_certs'] = TASKS_REDIS_CA_CERT_PATH
RQ_QUEUES = { RQ_QUEUES = {
RQ_QUEUE_HIGH: RQ_PARAMS, RQ_QUEUE_HIGH: RQ_PARAMS,
RQ_QUEUE_DEFAULT: RQ_PARAMS, RQ_QUEUE_DEFAULT: RQ_PARAMS,

View File

@ -1,4 +1,4 @@
// Netbox-specific Styles and Overrides. // NetBox-specific Styles and Overrides.
@use 'sass:map'; @use 'sass:map';
@use 'sass:math'; @use 'sass:math';

View File

@ -21,7 +21,7 @@ Blocks:
{# Body #} {# Body #}
<div class="content-container" tabindex="-2"> <div class="content-container" tabindex="-2">
{# Netbox Logo, only visible when printing #} {# NetBox Logo, only visible when printing #}
<div class="p-2 printonly"> <div class="p-2 printonly">
<img src="{% static 'netbox_logo.svg' %}" alt="NetBox logo" width="200px" /> <img src="{% static 'netbox_logo.svg' %}" alt="NetBox logo" width="200px" />
</div> </div>