2
.github/ISSUE_TEMPLATE/bug_report.yaml
vendored
@ -23,7 +23,7 @@ body:
|
||||
attributes:
|
||||
label: NetBox Version
|
||||
description: What version of NetBox are you currently running?
|
||||
placeholder: v3.7.0
|
||||
placeholder: v3.7.1
|
||||
validations:
|
||||
required: true
|
||||
- type: dropdown
|
||||
|
3
.github/ISSUE_TEMPLATE/config.yml
vendored
@ -7,6 +7,9 @@ contact_links:
|
||||
- name: ❓ Discussion
|
||||
url: https://github.com/netbox-community/netbox/discussions
|
||||
about: "If you're just looking for help, try starting a discussion instead."
|
||||
- name: 🌎 Correct a Translation
|
||||
url: https://explore.transifex.com/netbox-community/netbox/
|
||||
about: "Spot an incorrect translation? You can propose a fix on Transifex."
|
||||
- name: 💡 Plugin Idea
|
||||
url: https://plugin-ideas.netbox.dev
|
||||
about: "Have an idea for a plugin? Head over to the ideas board!"
|
||||
|
2
.github/ISSUE_TEMPLATE/feature_request.yaml
vendored
@ -14,7 +14,7 @@ body:
|
||||
attributes:
|
||||
label: NetBox version
|
||||
description: What version of NetBox are you currently running?
|
||||
placeholder: v3.7.0
|
||||
placeholder: v3.7.1
|
||||
validations:
|
||||
required: true
|
||||
- type: dropdown
|
||||
|
153
README.md
@ -1,86 +1,129 @@
|
||||
<div align="center">
|
||||
<img src="https://raw.githubusercontent.com/netbox-community/netbox/develop/docs/netbox_logo.svg" width="400" alt="NetBox logo" />
|
||||
<p>The premier source of truth powering network automation</p>
|
||||
<img src="https://github.com/netbox-community/netbox/workflows/CI/badge.svg?branch=master" alt="CI status" />
|
||||
<p><strong>The cornerstone of every automated network</strong></p>
|
||||
<a href="https://github.com/netbox-community/netbox/releases"><img src="https://img.shields.io/github/v/release/netbox-community/netbox" alt="Latest release" /></a>
|
||||
<a href="https://github.com/netbox-community/netbox/blob/master/LICENSE.txt"><img src="https://img.shields.io/badge/license-Apache_2.0-blue.svg" alt="License" /></a>
|
||||
<a href="https://github.com/netbox-community/netbox/graphs/contributors"><img src="https://img.shields.io/github/contributors/netbox-community/netbox?color=blue" alt="Contributors" /></a>
|
||||
<a href="https://github.com/netbox-community/netbox/stargazers"><img src="https://img.shields.io/github/stars/netbox-community/netbox?style=flat" alt="GitHub stars" /></a>
|
||||
<a href="https://explore.transifex.com/netbox-community/netbox/"><img src="https://img.shields.io/badge/languages-4-blue" alt="Languages supported" /></a>
|
||||
<a href="https://github.com/netbox-community/netbox/actions/workflows/ci.yml"><img src="https://github.com/netbox-community/netbox/workflows/CI/badge.svg?branch=master" alt="CI status" /></a>
|
||||
<p></p>
|
||||
</div>
|
||||
|
||||
NetBox is the leading solution for modeling and documenting modern networks. By
|
||||
combining the traditional disciplines of IP address management (IPAM) and
|
||||
datacenter infrastructure management (DCIM) with powerful APIs and extensions,
|
||||
NetBox provides the ideal "source of truth" to power network automation.
|
||||
Available as open source software under the Apache 2.0 license, NetBox serves
|
||||
as the cornerstone for network automation in thousands of organizations.
|
||||
NetBox exists to empower network engineers. Since its release in 2016, it has become the go-to solution for modeling and documenting network infrastructure for thousands of organizations worldwide. As a successor to legacy IPAM and DCIM applications, NetBox provides a cohesive, extensive, and accessible data model for all things networked. By providing a single robust user interface and programmable APIs for everything from cable maps to device configurations, NetBox serves as the central source of truth for the modern network.
|
||||
|
||||
* **Physical infrastructure:** Accurately model the physical world, from global regions down to individual racks of gear. Then connect everything - network, console, and power!
|
||||
* **Modern IPAM:** All the standard IPAM functionality you expect, plus VRF import/export tracking, VLAN management, and overlay support.
|
||||
* **Data circuits:** Confidently manage the delivery of critical circuits from various service providers, modeled seamlessly alongside your own infrastructure.
|
||||
* **Power tracking:** Map the distribution of power from upstream sources to individual feeds and outlets.
|
||||
* **Organization:** Manage tenant and contact assignments natively.
|
||||
* **Powerful search:** Easily find anything you need using a single global search function.
|
||||
* **Comprehensive logging:** Leverage both automatic change logging and user-submitted journal entries to track your network's growth over time.
|
||||
* **Endless customization:** Custom fields, custom links, tags, export templates, custom validation, reports, scripts, and more!
|
||||
* **Flexible permissions:** An advanced permissions systems enables very flexible delegation of permissions.
|
||||
* **Integrations:** Easily connect NetBox to your other tooling via its REST & GraphQL APIs.
|
||||
* **Plugins:** Not finding what you need in the core application? Try one of many community plugins - or build your own!
|
||||
<p align="center">
|
||||
<a href="#netboxs-role">NetBox's Role</a> |
|
||||
<a href="#why-netbox">Why NetBox?</a> |
|
||||
<a href="#getting-started">Getting Started</a> |
|
||||
<a href="#get-involved">Get Involved</a> |
|
||||
<a href="#project-stats">Project Stats</a> |
|
||||
<a href="#screenshots">Screenshots</a>
|
||||
</p>
|
||||
|
||||

|
||||
<p align="center">
|
||||
<img src="docs/media/screenshots/home-light.png" width="600" alt="NetBox user interface screenshot" />
|
||||
</p>
|
||||
|
||||
## NetBox's Role
|
||||
|
||||
NetBox functions as the **source of truth** for your network infrastructure. Its job is to define and validate the _intended state_ of all network components and resources. NetBox does not interact with network nodes directly; rather, it makes this data available programmatically to purpose-built automation, monitoring, and assurance tools. This separation of duties enables the construction of a robust yet flexible automation system.
|
||||
|
||||
<p align="center">
|
||||
<img src="docs/media/misc/reference_architecture.png" alt="Reference network automation architecture" />
|
||||
</p>
|
||||
|
||||
The diagram above illustrates the recommended deployment architecture for an automated network, leveraging NetBox as the central authority for network state. This approach allows your team to swap out individual tools to meet changing needs while retaining a predictable, modular workflow.
|
||||
|
||||
## Why NetBox?
|
||||
|
||||
### Comprehensive Data Model
|
||||
|
||||
Racks, devices, cables, IP addresses, VLANs, circuits, power, VPNs, and lots more: NetBox is built for networks. Its comprehensive and thoroughly inter-linked data model provides for natural and highly structured modeling of myriad network primitives that just isn't possible using general-purpose tools. And there's no need to waste time contemplating how to build out a database: Everything is ready to go upon installation.
|
||||
|
||||
### Focused Development
|
||||
|
||||
NetBox strives to meet a singular goal: Provide the best available solution for making network infrastructure programmatically accessible. Unlike "all-in-one" tools which awkwardly bolt on half-baked features in an attempt to check every box, NetBox is committed to its core function. NetBox provides the best possible solution for modeling network infrastructure, and provides rich APIs for integrating with tools that excel in other areas of network automation.
|
||||
|
||||
### Extensible and Customizable
|
||||
|
||||
No two networks are exactly the same. Users are empowered to extend NetBox's native data model with custom fields and tags to best suit their unique needs. You can even write your own plugins to introduce entirely new objects and functionality!
|
||||
|
||||
### Flexible Permissions
|
||||
|
||||
NetBox includes a fully customizable permission system, which affords administrators incredible granularity when assigning roles to users and groups. Want to restrict certain users to working only with cabling and not be able to change IP addresses? Or maybe each team should have access only to a particular tenant? NetBox enables you to craft roles as you see fit.
|
||||
|
||||
### Custom Validation & Protection Rules
|
||||
|
||||
The data you put into NetBox is crucial to network operations. In addition to its robust native validation rules, NetBox provides mechanisms for administrators to define their own custom validation rules for objects. Custom validation can be used both to ensure new or modified objects adhere to a set of rules, and to prevent the deletion of objects which don't meet certain criteria. (For example, you might want to prevent the deletion of a device with an "active" status.)
|
||||
|
||||
### Device Configuration Rendering
|
||||
|
||||
NetBox can render user-created Jinja2 templates to generate device configurations from its own data. Configuration templates can be uploaded individually or pulled automatically from an external source, such as a git repository. Rendered configurations can be retrieved via the REST API for application directly to network devices via a provisioning tool such as Ansible or Salt.
|
||||
|
||||
### Custom Scripts
|
||||
|
||||
Complex workflows, such as provisioning a new branch office, can be tedious to carry out via the user interface. NetBox allows you to write and upload custom scripts that can be run directly from the UI. Scripts prompt users for input and then automate the necessary tasks to greatly simplify otherwise burdensome processes.
|
||||
|
||||
### Automated Events
|
||||
|
||||
Users can define event rules to automatically trigger a custom script or outbound webhook in response to a NetBox event. For example, you might want to automatically update a network monitoring service whenever a new device is added to NetBox, or update a DHCP server when an IP range is allocated.
|
||||
|
||||
### Comprehensive Change Logging
|
||||
|
||||
NetBox automatically logs the creation, modification, and deletion of all managed objects, providing a thorough change history. Changes can be attributed to the executing user, and related changes are grouped automatically by request ID.
|
||||
|
||||
> [!NOTE]
|
||||
> A complete list of NetBox's myriad features can be found in [the introductory documentation](https://docs.netbox.dev/en/stable/introduction/).
|
||||
|
||||
## Getting Started
|
||||
|
||||
<div align="center">
|
||||
|
||||
[](https://github.com/netbox-community/netbox)
|
||||
|
||||
[](https://github.com/netbox-community/netbox-docker)
|
||||
|
||||
[](https://netboxlabs.com/netbox-cloud/)
|
||||
|
||||
</div>
|
||||
|
||||
* Just want to explore? Check out [our public demo](https://demo.netbox.dev/) right now!
|
||||
* The [official documentation](https://docs.netbox.dev) offers a comprehensive introduction.
|
||||
* Check out [our wiki](https://github.com/netbox-community/netbox/wiki/Community-Contributions) for even more projects to get the most out of NetBox!
|
||||
|
||||
<p align="center">
|
||||
<a href="https://netboxlabs.com/netbox-cloud/"><img src="docs/media/misc/netbox_cloud.png" alt="NetBox Cloud" /></a><br />
|
||||
Looking for an enterprise solution? Check out <strong><a href="https://netboxlabs.com/netbox-cloud/">NetBox Cloud</a></strong>!
|
||||
</p>
|
||||
|
||||
## Get Involved
|
||||
|
||||
* Follow [@NetBoxOfficial](https://twitter.com/NetBoxOfficial) on Twitter!
|
||||
* Join the conversation on [the discussion forum](https://github.com/netbox-community/netbox/discussions) and [Slack](https://netdev.chat/)!
|
||||
* Already a power user? You can [suggest a feature](https://github.com/netbox-community/netbox/issues/new?assignees=&labels=type%3A+feature&template=feature_request.yaml) or [report a bug](https://github.com/netbox-community/netbox/issues/new?assignees=&labels=type%3A+bug&template=bug_report.yaml) on GitHub.
|
||||
* Contributions from the community are encouraged and appreciated! Check out our [contributing guide](CONTRIBUTING.md) to get started.
|
||||
* [Share your idea](https://plugin-ideas.netbox.dev/) for a new plugin, or [learn how to build one](https://github.com/netbox-community/netbox-plugin-tutorial) yourself!
|
||||
|
||||
## Project Stats
|
||||
|
||||
<div align="center">
|
||||
<p align="center">
|
||||
<a href="https://github.com/netbox-community/netbox/commits"><img src="https://images.repography.com/29023055/netbox-community/netbox/recent-activity/whQtEr_TGD9PhW1BPlhlEQ5jnrgQ0KJpm-LlGtpoGO0/3Kx_iWUSBRJ5-AI4QwJEJWrUDEz3KrX2lvh8aYE0WXY_timeline.svg" alt="Timeline graph"></a>
|
||||
<a href="https://github.com/netbox-community/netbox/issues"><img src="https://images.repography.com/29023055/netbox-community/netbox/recent-activity/whQtEr_TGD9PhW1BPlhlEQ5jnrgQ0KJpm-LlGtpoGO0/3Kx_iWUSBRJ5-AI4QwJEJWrUDEz3KrX2lvh8aYE0WXY_issues.svg" alt="Issues graph"></a>
|
||||
<a href="https://github.com/netbox-community/netbox/pulls"><img src="https://images.repography.com/29023055/netbox-community/netbox/recent-activity/whQtEr_TGD9PhW1BPlhlEQ5jnrgQ0KJpm-LlGtpoGO0/3Kx_iWUSBRJ5-AI4QwJEJWrUDEz3KrX2lvh8aYE0WXY_prs.svg" alt="Pull requests graph"></a>
|
||||
<a href="https://github.com/netbox-community/netbox/graphs/contributors"><img src="https://images.repography.com/29023055/netbox-community/netbox/recent-activity/whQtEr_TGD9PhW1BPlhlEQ5jnrgQ0KJpm-LlGtpoGO0/3Kx_iWUSBRJ5-AI4QwJEJWrUDEz3KrX2lvh8aYE0WXY_users.svg" alt="Top contributors"></a>
|
||||
<br />Stats via <a href="https://repography.com">Repography</a>
|
||||
</div>
|
||||
|
||||
## Sponsors
|
||||
|
||||
<div align="center">
|
||||
|
||||
[](https://netboxlabs.com)
|
||||
|
||||
[](https://try.digitalocean.com/developer-cloud)
|
||||
|
||||
[](https://sentry.io)
|
||||
<br />
|
||||
[](https://metal.equinix.com)
|
||||
|
||||
[](https://onemindservices.com)
|
||||
|
||||
</div>
|
||||
</p>
|
||||
|
||||
## Screenshots
|
||||
|
||||
")
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
<p align="center">
|
||||
<strong>NetBox Dashboard (Light Mode)</strong><br />
|
||||
<img src="docs/media/screenshots/home-light.png" width="600" alt="NetBox dashboard (light mode)" />
|
||||
</p>
|
||||
<p align="center">
|
||||
<strong>NetBox Dashboard (Dark Mode)</strong><br />
|
||||
<img src="docs/media/screenshots/home-dark.png" width="600" alt="NetBox dashboard (dark mode)" />
|
||||
</p>
|
||||
<p align="center">
|
||||
<strong>Prefixes List</strong><br />
|
||||
<img src="docs/media/screenshots/prefixes-list.png" width="600" alt="Prefixes list" />
|
||||
</p>
|
||||
<p align="center">
|
||||
<strong>Rack View</strong><br />
|
||||
<img src="docs/media/screenshots/rack.png" width="600" alt="Rack view" />
|
||||
</p>
|
||||
<p align="center">
|
||||
<strong>Cable Trace</strong><br />
|
||||
<img src="docs/media/screenshots/cable-trace.png" width="600" alt="Cable trace" />
|
||||
</p>
|
||||
|
@ -73,7 +73,7 @@ You should be redirected to Microsoft's authentication portal. Enter the usernam
|
||||
|
||||
If successful, you will be redirected back to the NetBox UI, and will be logged in as the AD user. You can verify this by navigating to your profile (using the button at top right).
|
||||
|
||||
This user account has been replicated locally to NetBox, and can now be assigned groups and permissions within the NetBox admin UI.
|
||||
This user account has been replicated locally to NetBox, and can now be assigned groups and permissions by navigating to Admin > Permissions.
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
|
@ -67,4 +67,4 @@ You should be redirected to Okta's authentication portal. Enter the username/ema
|
||||
|
||||
If successful, you will be redirected back to the NetBox UI, and will be logged in as the Okta user. You can verify this by navigating to your profile (using the button at top right).
|
||||
|
||||
This user account has been replicated locally to NetBox, and can now be assigned groups and permissions within the NetBox admin UI.
|
||||
This user account has been replicated locally to NetBox, and can now be assigned groups and permissions by navigating to Admin > Permissions.
|
||||
|
@ -2,9 +2,9 @@
|
||||
|
||||
## Local Authentication
|
||||
|
||||
Local user accounts and groups can be created in NetBox under the "Authentication and Authorization" section of the administrative user interface. This interface is available only to users with the "staff" permission enabled.
|
||||
Local user accounts and groups can be created in NetBox under the "Authentication" section in the "Admin" menu. This section is available only to users with the "staff" permission enabled.
|
||||
|
||||
At a minimum, each user account must have a username and password set. User accounts may also denote a first name, last name, and email address. [Permissions](../permissions.md) may also be assigned to users and/or groups within the admin UI.
|
||||
At a minimum, each user account must have a username and password set. User accounts may also denote a first name, last name, and email address. [Permissions](../permissions.md) may also be assigned to users and/or groups under Admin > Permissions.
|
||||
|
||||
## Remote Authentication
|
||||
|
||||
|
@ -46,4 +46,4 @@ The configuration file may be modified at any time. However, the WSGI service (e
|
||||
$ sudo systemctl restart netbox
|
||||
```
|
||||
|
||||
Configuration parameters which are set via the admin UI (those listed under "dynamic settings") take effect immediately.
|
||||
Dynamic configuration parameters (those which can be modified via the UI) take effect immediately.
|
||||
|
@ -288,9 +288,9 @@ An IPv4 or IPv6 network with a mask. Returns a `netaddr.IPNetwork` object. Two a
|
||||
## Running Custom Scripts
|
||||
|
||||
!!! note
|
||||
To run a custom script, a user must be assigned via permissions for `Extras > Script`, `Extras > ScriptModule`, and `Core > ManagedFile` objects. They must also be assigned the `extras.run_script` permission. This is achieved by assigning the user (or group) a permission on the Script object and specifying the `run` action in the admin UI as shown below.
|
||||
To run a custom script, a user must be assigned permissions for `Extras > Script`, `Extras > Script Module`, and `Core > Managed File` objects. They must also be assigned the `extras.run_script` permission. This is achieved by assigning the user (or group) a permission on the Script object and specifying the `run` action in "Permissions" as shown below.
|
||||
|
||||

|
||||

|
||||
|
||||
### Via the Web UI
|
||||
|
||||
|
@ -132,9 +132,9 @@ Once you have created a report, it will appear in the reports list. Initially, r
|
||||
## Running Reports
|
||||
|
||||
!!! note
|
||||
To run a report, a user must be assigned via permissions for `Extras > Report`, `Extras > ReportModule`, and `Core > ManagedFile` objects. They must also be assigned the `extras.run_report` permission. This is achieved by assigning the user (or group) a permission on the Report object and specifying the `run` action in the admin UI as shown below.
|
||||
To run a report, a user must be assigned permissions for `Extras > Report`, `Extras > Report Module`, and `Core > Managed File` objects. They must also be assigned the `extras.run_report` permission. This is achieved by assigning the user (or group) a permission on the Report object and specifying the `run` action in "Permissions" as shown below.
|
||||
|
||||

|
||||

|
||||
|
||||
### Via the Web UI
|
||||
|
||||
|
@ -80,6 +80,18 @@ Run the following command to update the device type definition validation schema
|
||||
|
||||
This will automatically update the schema file at `contrib/generated_schema.json`.
|
||||
|
||||
### Update & Compile Translations
|
||||
|
||||
Log into [Transifex](https://app.transifex.com/netbox-community/netbox/dashboard/) to download the updated string maps. Download the resource (portable object, or `.po`) file for each language and save them to `netbox/translations/$lang/LC_MESSAGES/django.po`, overwriting the current files. (Be sure to click the **Download for use** link.)
|
||||
|
||||

|
||||
|
||||
Once the resource files for all languages have been updated, compile the machine object (`.mo`) files using the `compilemessages` management command:
|
||||
|
||||
```nohighlight
|
||||
./manage.py compilemessages
|
||||
```
|
||||
|
||||
### Update Version and Changelog
|
||||
|
||||
* Update the `VERSION` constant in `settings.py` to the new release version.
|
||||
@ -90,7 +102,7 @@ Commit these changes to the `develop` branch and push upstream.
|
||||
|
||||
### Verify CI Build Status
|
||||
|
||||
Ensure that continuous integration testing on the `develop` branch is completing successfully. If it fails, take action to correct the failure before proceding with the release.
|
||||
Ensure that continuous integration testing on the `develop` branch is completing successfully. If it fails, take action to correct the failure before proceeding with the release.
|
||||
|
||||
### Submit a Pull Request
|
||||
|
||||
|
30
docs/development/translations.md
Normal file
@ -0,0 +1,30 @@
|
||||
# Translations
|
||||
|
||||
NetBox coordinates all translation work using the [Transifex](https://explore.transifex.com/netbox-community/netbox/) platform. Signing up for a Transifex account is free.
|
||||
|
||||
All language translations in NetBox are generated from the source file found at `netbox/translations/en/LC_MESSAGES/django.po`. This file contains the original English strings with empty mappings, and is generated as part of NetBox's release process. Transifex updates source strings from this file on a recurring basis, so new translation strings will appear in the platform automatically as it is updated in the code base.
|
||||
|
||||
Reviewers log into Transifex and navigate to their designated language(s) to translate strings. The initial translation for most strings will be machine-generated via the AWS Translate service. Human reviewers are responsible for reviewing these translations and making corrections where necessary.
|
||||
|
||||
Immediately prior to each NetBox release, the translation maps for all completed languages will be downloaded from Transifex, compiled, and checked into the NetBox code base by a maintainer.
|
||||
|
||||
## Updating Translation Sources
|
||||
|
||||
To update the English `.po` file from which all translations are derived, use the `makemessages` management command:
|
||||
|
||||
```nohighlight
|
||||
./manage.py makemessages -l en
|
||||
```
|
||||
|
||||
Then, commit the change and push to the `develop` branch on GitHub. After some time, any new strings will appear for translation on Transifex automatically.
|
||||
|
||||
## Proposing New Languages
|
||||
|
||||
If you'd like to add support for a new language to NetBox, the first step is to [submit a GitHub issue](https://github.com/netbox-community/netbox/issues/new?assignees=&labels=type%3A+translation&projects=&template=translation.yaml) to capture the proposal. While we'd like to add as many languages as possible, we do need to limit the rate at which new languages are added. New languages will be selected according to community interest and the number of volunteers who sign up as translators.
|
||||
|
||||
Once a proposed language has been approved, a NetBox maintainer will:
|
||||
|
||||
* Add it to the Transifex platform
|
||||
* Designate one or more reviewers
|
||||
* Create the initial machine-generated translations for review
|
||||
* Add it to the list of supported languages
|
@ -39,7 +39,7 @@ When rendered for a specific NetBox device, the template's `device` variable wil
|
||||
|
||||
### Context Data
|
||||
|
||||
The objet for which the configuration is being rendered is made available as template context as `device` or `virtualmachine` for devices and virtual machines, respectively. Additionally, NetBox model classes can be accessed by the app or plugin in which they reside. For example:
|
||||
The object for which the configuration is being rendered is made available as template context as `device` or `virtualmachine` for devices and virtual machines, respectively. Additionally, NetBox model classes can be accessed by the app or plugin in which they reside. For example:
|
||||
|
||||
```
|
||||
There are {{ dcim.Site.objects.count() }} sites.
|
||||
@ -70,6 +70,11 @@ This request will trigger resolution of the device's preferred config template i
|
||||
|
||||
If no config template has been assigned to any of these three objects, the request will fail.
|
||||
|
||||
The configuration can be rendered as JSON or as plaintext by setting the `Accept:` HTTP header. For example:
|
||||
|
||||
* `Accept: application/json`
|
||||
* `Accept: text/plain`
|
||||
|
||||
### General Purpose Use
|
||||
|
||||
NetBox config templates can also be rendered without being tied to any specific device, using a separate general purpose REST API endpoint. Any data included with a POST request to this endpoint will be passed as context data for the template.
|
||||
|
@ -1,6 +1,6 @@
|
||||
# Synchronized Data
|
||||
|
||||
Several models in NetBox support the automatic synchronization of local data from a designated remote source. For example, [configuration templates](./configuration-rendering.md) defined in NetBox can source their content from text files stored in a remote git repository. This accomplished using the core [data source](../models/core/datasource.md) and [data file](../models/core/datafile.md) models.
|
||||
Several models in NetBox support the automatic synchronization of local data from a designated remote source. For example, [configuration templates](./configuration-rendering.md) defined in NetBox can source their content from text files stored in a remote git repository. This is accomplished using the core [data source](../models/core/datasource.md) and [data file](../models/core/datafile.md) models.
|
||||
|
||||
To enable remote data synchronization, the NetBox administrator first designates one or more remote data sources. NetBox currently supports the following source types:
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
NetBox is the leading solution for modeling and documenting modern networks. By combining the traditional disciplines of IP address management (IPAM) and datacenter infrastructure management (DCIM) with powerful APIs and extensions, NetBox provides the ideal "source of truth" to power network automation. Read on to discover why thousands of organizations worldwide put NetBox at the heart of their infrastructure.
|
||||
|
||||
[](./media/screenshots/netbox-ui.png)
|
||||
[](./media/screenshots/home-light.png)
|
||||
|
||||
## :material-server-network: Built for Networks
|
||||
|
||||
|
@ -106,6 +106,6 @@ Content-Type: application/x-www-form-urlencoded
|
||||
------------
|
||||
```
|
||||
|
||||
Note that `webhook_receiver` does not actually _do_ anything with the information received: It merely prints the request headers and body for inspection.
|
||||
Note that `webhook_receiver` does not actually _do_ anything with the information received: It merely prints the request headers and body for inspection. If you don't see any output, check that the `rqworker` process is running and that webhook events are being placed into the queue.
|
||||
|
||||
Now, when the NetBox webhook is triggered and processed, you should see its headers and content appear in the terminal where the webhook receiver is listening. If you don't, check that the `rqworker` process is running and that webhook events are being placed into the queue (visible under the NetBox admin UI).
|
||||
Webhook results can be found in the NetBox admin UI under the Background Tasks section. You can see any finished or failed runs, as well as the error log for failed webhooks.
|
||||
|
BIN
docs/media/development/transifex_download.png
Normal file
After Width: | Height: | Size: 54 KiB |
BIN
docs/media/misc/netbox_cloud.png
Normal file
After Width: | Height: | Size: 6.8 KiB |
BIN
docs/media/misc/reference_architecture.png
Normal file
After Width: | Height: | Size: 46 KiB |
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 22 KiB |
Before Width: | Height: | Size: 100 KiB After Width: | Height: | Size: 207 KiB |
Before Width: | Height: | Size: 173 KiB After Width: | Height: | Size: 316 KiB |
BIN
docs/media/screenshots/home-light.png
Normal file
After Width: | Height: | Size: 309 KiB |
Before Width: | Height: | Size: 171 KiB |
Before Width: | Height: | Size: 116 KiB After Width: | Height: | Size: 356 KiB |
Before Width: | Height: | Size: 81 KiB After Width: | Height: | Size: 235 KiB |
@ -1,5 +1,23 @@
|
||||
# NetBox v3.7
|
||||
|
||||
## v3.7.1 (2024-01-17)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* [#13844](https://github.com/netbox-community/netbox/issues/13844) - Use `available_at_site` filter when filtering VLANs under prefix form
|
||||
* [#14663](https://github.com/netbox-community/netbox/issues/14663) - Fix tunnel creation when setting initial termination to a VM interface
|
||||
* [#14706](https://github.com/netbox-community/netbox/issues/14706) - Relax one-to-one mapping of tunnel termination to IP address
|
||||
* [#14709](https://github.com/netbox-community/netbox/issues/14709) - Fix typo in tunnel termination type choice name
|
||||
* [#14749](https://github.com/netbox-community/netbox/issues/14749) - Remove errant translation wrapper from `installed_device` on DeviceBay
|
||||
* [#14778](https://github.com/netbox-community/netbox/issues/14778) - Custom field API serializer should accept null values for all optional fields
|
||||
* [#14791](https://github.com/netbox-community/netbox/issues/14791) - Hide available prefixes when searching within a parent prefix
|
||||
* [#14793](https://github.com/netbox-community/netbox/issues/14793) - Add missing Diffie-Hellman group 15
|
||||
* [#14816](https://github.com/netbox-community/netbox/issues/14816) - Ensure default contact assignment ordering is consistent
|
||||
* [#14817](https://github.com/netbox-community/netbox/issues/14817) - Relax required fields for IKE & IPSec models on bulk import
|
||||
* [#14827](https://github.com/netbox-community/netbox/issues/14827) - Ensure all matching event rules are processed in response to an event
|
||||
|
||||
---
|
||||
|
||||
## v3.7.0 (2023-12-29)
|
||||
|
||||
### Breaking Changes
|
||||
@ -10,6 +28,7 @@
|
||||
* The internal ConfigRevision model has moved from `extras` to `core`. Configuration history will be retained throughout the upgrade process.
|
||||
* The [L2VPN](../models/vpn/l2vpn.md) and [L2VPNTermination](../models/vpn/l2vpntermination.md) models have moved from the `ipam` app to the new `vpn` app. All object data will be retained, however please note that the relevant API endpoints have likewise moved to `/api/vpn/`.
|
||||
* The `CustomFieldsMixin`, `SavedFiltersMixin`, and `TagsMixin` classes have moved from the `extras.forms.mixins` module to `netbox.forms.mixins`.
|
||||
* The `netbox.models.features.WebhooksMixin` class has been renamed to `EventRulesMixin`.
|
||||
|
||||
### New Features
|
||||
|
||||
|
@ -286,6 +286,7 @@ nav:
|
||||
- User Preferences: 'development/user-preferences.md'
|
||||
- Web UI: 'development/web-ui.md'
|
||||
- Internationalization: 'development/internationalization.md'
|
||||
- Translations: 'development/translations.md'
|
||||
- Release Checklist: 'development/release-checklist.md'
|
||||
- git Cheat Sheet: 'development/git-cheat-sheet.md'
|
||||
- Release Notes:
|
||||
|
@ -1115,7 +1115,7 @@ class DeviceBay(ComponentModel, TrackingModelMixin):
|
||||
installed_device = models.OneToOneField(
|
||||
to='dcim.Device',
|
||||
on_delete=models.SET_NULL,
|
||||
related_name=_('parent_bay'),
|
||||
related_name='parent_bay',
|
||||
blank=True,
|
||||
null=True
|
||||
)
|
||||
|
@ -126,11 +126,15 @@ class CustomFieldSerializer(ValidatedModelSerializer):
|
||||
type = ChoiceField(choices=CustomFieldTypeChoices)
|
||||
object_type = ContentTypeField(
|
||||
queryset=ContentType.objects.all(),
|
||||
required=False
|
||||
required=False,
|
||||
allow_null=True
|
||||
)
|
||||
filter_logic = ChoiceField(choices=CustomFieldFilterLogicChoices, required=False)
|
||||
data_type = serializers.SerializerMethodField()
|
||||
choice_set = NestedCustomFieldChoiceSetSerializer(required=False)
|
||||
choice_set = NestedCustomFieldChoiceSetSerializer(
|
||||
required=False,
|
||||
allow_null=True
|
||||
)
|
||||
ui_visible = ChoiceField(choices=CustomFieldUIVisibleChoices, required=False)
|
||||
ui_editable = ChoiceField(choices=CustomFieldUIEditableChoices, required=False)
|
||||
|
||||
|
@ -81,7 +81,7 @@ def process_event_rules(event_rules, model_name, event, data, username, snapshot
|
||||
|
||||
# Evaluate event rule conditions (if any)
|
||||
if not event_rule.eval_conditions(data):
|
||||
return
|
||||
continue
|
||||
|
||||
# Webhooks
|
||||
if event_rule.action_type == EventRuleActionChoices.WEBHOOK:
|
||||
|
@ -214,7 +214,7 @@ class PrefixForm(TenancyForm, NetBoxModelForm):
|
||||
required=False,
|
||||
selector=True,
|
||||
query_params={
|
||||
'site_id': '$site',
|
||||
'available_at_site': '$site',
|
||||
},
|
||||
label=_('VLAN'),
|
||||
)
|
||||
|
@ -604,7 +604,7 @@ class PrefixIPAddressesView(generic.ObjectChildrenView):
|
||||
return parent.get_child_ips().restrict(request.user, 'view').prefetch_related('vrf', 'tenant', 'tenant__group')
|
||||
|
||||
def prep_table_data(self, request, queryset, parent):
|
||||
if not get_table_ordering(request, self.table):
|
||||
if not request.GET.get('q') and not get_table_ordering(request, self.table):
|
||||
return add_available_ipaddresses(parent.prefix, queryset, parent.is_pool)
|
||||
return queryset
|
||||
|
||||
|
@ -30,13 +30,13 @@ __all__ = (
|
||||
'CustomFieldsMixin',
|
||||
'CustomLinksMixin',
|
||||
'CustomValidationMixin',
|
||||
'EventRulesMixin',
|
||||
'ExportTemplatesMixin',
|
||||
'ImageAttachmentsMixin',
|
||||
'JobsMixin',
|
||||
'JournalingMixin',
|
||||
'SyncedDataMixin',
|
||||
'TagsMixin',
|
||||
'EventRulesMixin',
|
||||
)
|
||||
|
||||
|
||||
|
@ -28,7 +28,7 @@ from netbox.plugins import PluginConfig
|
||||
# Environment setup
|
||||
#
|
||||
|
||||
VERSION = '3.7.0'
|
||||
VERSION = '3.7.1'
|
||||
|
||||
# Hostname
|
||||
HOSTNAME = platform.node()
|
||||
|
@ -83,6 +83,6 @@ class ContactViewSet(NetBoxModelViewSet):
|
||||
|
||||
|
||||
class ContactAssignmentViewSet(NetBoxModelViewSet):
|
||||
queryset = ContactAssignment.objects.prefetch_related('object', 'contact', 'role')
|
||||
queryset = ContactAssignment.objects.prefetch_related('content_type', 'object', 'contact', 'role', 'tags')
|
||||
serializer_class = serializers.ContactAssignmentSerializer
|
||||
filterset_class = filtersets.ContactAssignmentFilterSet
|
||||
|
17
netbox/tenancy/migrations/0014_contactassignment_ordering.py
Normal file
@ -0,0 +1,17 @@
|
||||
# Generated by Django 4.2.8 on 2024-01-17 15:27
|
||||
|
||||
from django.db import migrations
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('tenancy', '0013_gfk_indexes'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterModelOptions(
|
||||
name='contactassignment',
|
||||
options={'ordering': ('contact', 'priority', 'role', 'pk')},
|
||||
),
|
||||
]
|
@ -140,7 +140,7 @@ class ContactAssignment(CustomFieldsMixin, ExportTemplatesMixin, TagsMixin, Chan
|
||||
clone_fields = ('content_type', 'object_id', 'role', 'priority')
|
||||
|
||||
class Meta:
|
||||
ordering = ('priority', 'contact')
|
||||
ordering = ('contact', 'priority', 'role', 'pk')
|
||||
indexes = (
|
||||
models.Index(fields=('content_type', 'object_id')),
|
||||
)
|
||||
|
@ -25,7 +25,7 @@ class ObjectContactsView(generic.ObjectChildrenView):
|
||||
return ContactAssignment.objects.restrict(request.user, 'view').filter(
|
||||
content_type=ContentType.objects.get_for_model(parent),
|
||||
object_id=parent.pk
|
||||
)
|
||||
).order_by('priority', 'contact', 'role')
|
||||
|
||||
def get_table(self, *args, **kwargs):
|
||||
table = super().get_table(*args, **kwargs)
|
||||
|
@ -5,6 +5,7 @@
|
||||
#
|
||||
# Translators:
|
||||
# Jeremy Stretch, 2023
|
||||
# Jonathan Senecal, 2024
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
@ -13,7 +14,7 @@ msgstr ""
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2023-12-21 17:54+0000\n"
|
||||
"PO-Revision-Date: 2023-10-30 17:48+0000\n"
|
||||
"Last-Translator: Jeremy Stretch, 2023\n"
|
||||
"Last-Translator: Jonathan Senecal, 2024\n"
|
||||
"Language-Team: French (https://app.transifex.com/netbox-community/teams/178115/fr/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@ -110,7 +111,7 @@ msgstr "Région (ID)"
|
||||
#: virtualization/filtersets.py:52 virtualization/filtersets.py:179
|
||||
#: vpn/filtersets.py:325
|
||||
msgid "Region (slug)"
|
||||
msgstr "Région (limace)"
|
||||
msgstr "Région (slug)"
|
||||
|
||||
#: circuits/filtersets.py:42 circuits/filtersets.py:195 dcim/filtersets.py:194
|
||||
#: dcim/filtersets.py:269 dcim/filtersets.py:377 dcim/filtersets.py:894
|
||||
@ -188,11 +189,11 @@ msgstr "Site"
|
||||
#: virtualization/filtersets.py:75 virtualization/filtersets.py:202
|
||||
#: vpn/filtersets.py:335
|
||||
msgid "Site (slug)"
|
||||
msgstr "Site (limace)"
|
||||
msgstr "Site (slug)"
|
||||
|
||||
#: circuits/filtersets.py:65
|
||||
msgid "ASN (ID)"
|
||||
msgstr "ASN (IDENTIFIANT)"
|
||||
msgstr "ASN (ID)"
|
||||
|
||||
#: circuits/filtersets.py:86 circuits/filtersets.py:112
|
||||
#: circuits/filtersets.py:146
|
||||
@ -210,7 +211,7 @@ msgstr "Compte fournisseur (ID)"
|
||||
|
||||
#: circuits/filtersets.py:162
|
||||
msgid "Provider network (ID)"
|
||||
msgstr "Réseau de fournisseurs (ID)"
|
||||
msgstr "Réseau fournisseur (ID)"
|
||||
|
||||
#: circuits/filtersets.py:166
|
||||
msgid "Circuit type (ID)"
|
||||
@ -256,7 +257,7 @@ msgstr "Circuit"
|
||||
|
||||
#: circuits/filtersets.py:254
|
||||
msgid "ProviderNetwork (ID)"
|
||||
msgstr "Réseau de fournisseurs (ID)"
|
||||
msgstr "Réseau fournisseur (ID)"
|
||||
|
||||
#: circuits/forms/bulk_edit.py:25 circuits/forms/filtersets.py:56
|
||||
#: circuits/forms/model_forms.py:26 circuits/tables/providers.py:33
|
||||
@ -266,7 +267,7 @@ msgstr "Réseau de fournisseurs (ID)"
|
||||
#: netbox/navigation/menu.py:160 netbox/navigation/menu.py:163
|
||||
#: templates/circuits/provider.html:24
|
||||
msgid "ASNs"
|
||||
msgstr "SAN"
|
||||
msgstr "Numéros d'AS"
|
||||
|
||||
#: circuits/forms/bulk_edit.py:29 circuits/forms/bulk_edit.py:51
|
||||
#: circuits/forms/bulk_edit.py:78 circuits/forms/bulk_edit.py:99
|
||||
@ -363,7 +364,7 @@ msgstr "SAN"
|
||||
#: vpn/forms/bulk_edit.py:277 wireless/forms/bulk_edit.py:28
|
||||
#: wireless/forms/bulk_edit.py:81 wireless/forms/bulk_edit.py:128
|
||||
msgid "Description"
|
||||
msgstr "Descriptif"
|
||||
msgstr "Description"
|
||||
|
||||
#: circuits/forms/bulk_edit.py:46 circuits/forms/bulk_edit.py:68
|
||||
#: circuits/forms/bulk_edit.py:118 circuits/forms/bulk_import.py:35
|
||||
@ -449,7 +450,7 @@ msgstr "Type"
|
||||
#: circuits/forms/bulk_edit.py:123 circuits/forms/bulk_import.py:82
|
||||
#: circuits/forms/filtersets.py:139 circuits/forms/model_forms.py:97
|
||||
msgid "Provider account"
|
||||
msgstr "Compte du fournisseur"
|
||||
msgstr "Identifiant de compte du prestataire"
|
||||
|
||||
#: circuits/forms/bulk_edit.py:131 circuits/forms/bulk_import.py:95
|
||||
#: circuits/forms/filtersets.py:150 core/forms/filtersets.py:34
|
||||
@ -504,7 +505,7 @@ msgstr "Compte du fournisseur"
|
||||
#: wireless/forms/filtersets.py:82 wireless/tables/wirelesslan.py:52
|
||||
#: wireless/tables/wirelesslink.py:19
|
||||
msgid "Status"
|
||||
msgstr "État"
|
||||
msgstr "Statut"
|
||||
|
||||
#: circuits/forms/bulk_edit.py:137 circuits/forms/bulk_import.py:100
|
||||
#: circuits/forms/filtersets.py:119 dcim/forms/bulk_edit.py:120
|
||||
@ -575,7 +576,7 @@ msgstr "Date de résiliation"
|
||||
|
||||
#: circuits/forms/bulk_edit.py:153 circuits/forms/filtersets.py:186
|
||||
msgid "Commit rate (Kbps)"
|
||||
msgstr "Taux de validation (Kbits/s)"
|
||||
msgstr "Débit engagé (Kbits/s)"
|
||||
|
||||
#: circuits/forms/bulk_edit.py:168 circuits/forms/model_forms.py:111
|
||||
msgid "Service Parameters"
|
||||
@ -597,7 +598,7 @@ msgstr "Paramètres du service"
|
||||
#: vpn/forms/model_forms.py:146 vpn/forms/model_forms.py:404
|
||||
#: wireless/forms/model_forms.py:55 wireless/forms/model_forms.py:160
|
||||
msgid "Tenancy"
|
||||
msgstr "Location"
|
||||
msgstr "Utilisateur"
|
||||
|
||||
#: circuits/forms/bulk_import.py:38 circuits/forms/bulk_import.py:53
|
||||
#: circuits/forms/bulk_import.py:79
|
||||
@ -608,11 +609,11 @@ msgstr "Prestataire assigné"
|
||||
#: dcim/forms/bulk_import.py:380 dcim/forms/bulk_import.py:1092
|
||||
#: dcim/forms/bulk_import.py:1171 extras/forms/bulk_import.py:229
|
||||
msgid "RGB color in hexadecimal. Example:"
|
||||
msgstr "Couleur RGB en hexadécimal. Exemple :"
|
||||
msgstr "Couleur RVB en hexadécimal. Exemple :"
|
||||
|
||||
#: circuits/forms/bulk_import.py:85
|
||||
msgid "Assigned provider account"
|
||||
msgstr "Compte fournisseur attribué"
|
||||
msgstr "Compte prestataire attribué"
|
||||
|
||||
#: circuits/forms/bulk_import.py:92
|
||||
msgid "Type of circuit"
|
||||
@ -1174,7 +1175,7 @@ msgstr "Courir"
|
||||
|
||||
#: core/choices.py:58 extras/choices.py:211
|
||||
msgid "Errored"
|
||||
msgstr "Errulé"
|
||||
msgstr "En erreur"
|
||||
|
||||
#: core/data_backends.py:29 templates/dcim/interface.html:224
|
||||
msgid "Local"
|
||||
@ -1188,7 +1189,7 @@ msgstr "Nom d'utilisateur"
|
||||
|
||||
#: core/data_backends.py:49 core/data_backends.py:55
|
||||
msgid "Only used for cloning with HTTP(S)"
|
||||
msgstr "Utilisé uniquement pour le clonage avec HTTP (S)"
|
||||
msgstr "Utilisé uniquement pour le clonage avec HTTP(S)"
|
||||
|
||||
#: core/data_backends.py:53 templates/account/base.html:17
|
||||
#: templates/account/password.html:11 users/forms/model_forms.py:171
|
||||
@ -1343,7 +1344,7 @@ msgstr "Paramètres du backend"
|
||||
|
||||
#: core/forms/model_forms.py:94
|
||||
msgid "File Upload"
|
||||
msgstr "Téléchargement de fichiers"
|
||||
msgstr "Téléversement de fichiers"
|
||||
|
||||
#: core/forms/model_forms.py:147 templates/core/configrevision.html:43
|
||||
#: templates/dcim/rack_elevation_list.html:6
|
||||
@ -1394,7 +1395,7 @@ msgstr "Divers"
|
||||
|
||||
#: core/forms/model_forms.py:158
|
||||
msgid "Config Revision"
|
||||
msgstr "Révision de la configuration"
|
||||
msgstr "Révision de configuration"
|
||||
|
||||
#: core/forms/model_forms.py:197
|
||||
msgid "This parameter has been defined statically and cannot be modified."
|
||||
@ -1426,7 +1427,7 @@ msgstr "données de configuration"
|
||||
|
||||
#: core/models/config.py:36
|
||||
msgid "config revision"
|
||||
msgstr "révision de la configuration"
|
||||
msgstr "révision de configuration"
|
||||
|
||||
#: core/models/config.py:37
|
||||
msgid "config revisions"
|
||||
@ -7596,7 +7597,7 @@ msgstr "Secondaire"
|
||||
|
||||
#: ipam/choices.py:91
|
||||
msgid "Anycast"
|
||||
msgstr "N'importe quel cast"
|
||||
msgstr "Anycast"
|
||||
|
||||
#: ipam/choices.py:115
|
||||
msgid "Standard"
|
||||
@ -7791,8 +7792,8 @@ msgstr "C'est une piscine"
|
||||
#: ipam/forms/bulk_edit.py:257 ipam/forms/bulk_edit.py:301
|
||||
#: ipam/models/ip.py:271 ipam/models/ip.py:538
|
||||
#, python-format
|
||||
msgid "Treat as 100% utilized"
|
||||
msgstr "Traiter comme utilisé à 100 %"
|
||||
msgid "Treat as 100%% utilized"
|
||||
msgstr "Traiter comme utilisé à 100%%"
|
||||
|
||||
#: ipam/forms/bulk_edit.py:349 ipam/models/ip.py:771
|
||||
msgid "DNS name"
|
||||
@ -8009,7 +8010,7 @@ msgstr "Famille d'adresses"
|
||||
|
||||
#: ipam/forms/filtersets.py:118 templates/ipam/asnrange.html:26
|
||||
msgid "Range"
|
||||
msgstr "Gamme"
|
||||
msgstr "Plage"
|
||||
|
||||
#: ipam/forms/filtersets.py:127
|
||||
msgid "Start"
|
||||
@ -8029,8 +8030,8 @@ msgstr "Présent en VRF"
|
||||
|
||||
#: ipam/forms/filtersets.py:243 ipam/forms/filtersets.py:282
|
||||
#, python-format
|
||||
msgid "Marked as 100% utilized"
|
||||
msgstr "Marqué comme étant utilisé à 100 %"
|
||||
msgid "Marked as 100%% utilized"
|
||||
msgstr "Marqué comme étant utilisé à 100%%"
|
||||
|
||||
#: ipam/forms/filtersets.py:297
|
||||
msgid "Device/VM"
|
||||
@ -8094,7 +8095,7 @@ msgstr "Agrégat"
|
||||
|
||||
#: ipam/forms/model_forms.py:134 templates/ipam/asnrange.html:12
|
||||
msgid "ASN Range"
|
||||
msgstr "Gamme ASN"
|
||||
msgstr "Plage ASN"
|
||||
|
||||
#: ipam/forms/model_forms.py:230
|
||||
msgid "Site/VLAN Assignment"
|
||||
@ -8102,7 +8103,7 @@ msgstr "Affectation de site/VLAN"
|
||||
|
||||
#: ipam/forms/model_forms.py:256 templates/ipam/iprange.html:11
|
||||
msgid "IP Range"
|
||||
msgstr "Gamme IP"
|
||||
msgstr "Plage IP"
|
||||
|
||||
#: ipam/forms/model_forms.py:285 ipam/forms/model_forms.py:454
|
||||
#: templates/ipam/fhrpgroup.html:19 templates/ipam/ipaddress_edit.html:52
|
||||
@ -8184,11 +8185,11 @@ msgstr "démarrer"
|
||||
|
||||
#: ipam/models/asns.py:51
|
||||
msgid "ASN range"
|
||||
msgstr "Gamme ASN"
|
||||
msgstr "Plage ASN"
|
||||
|
||||
#: ipam/models/asns.py:52
|
||||
msgid "ASN ranges"
|
||||
msgstr "Gammes ASN"
|
||||
msgstr "Plages ASN"
|
||||
|
||||
#: ipam/models/asns.py:72
|
||||
#, python-brace-format
|
||||
@ -8380,7 +8381,7 @@ msgstr "plage IP"
|
||||
|
||||
#: ipam/models/ip.py:548
|
||||
msgid "IP ranges"
|
||||
msgstr "Gammes IP"
|
||||
msgstr "Plages IP"
|
||||
|
||||
#: ipam/models/ip.py:564
|
||||
msgid "Starting and ending IP address versions must match"
|
||||
@ -8636,7 +8637,7 @@ msgstr "Utilisation"
|
||||
|
||||
#: ipam/tables/ip.py:170 netbox/navigation/menu.py:149
|
||||
msgid "IP Ranges"
|
||||
msgstr "Gammes d'adresses IP"
|
||||
msgstr "Plages d'adresses IP"
|
||||
|
||||
#: ipam/tables/ip.py:220
|
||||
msgid "Prefix (Flat)"
|
||||
@ -8706,7 +8707,7 @@ msgstr "Préfixes pour enfants"
|
||||
|
||||
#: ipam/views.py:571
|
||||
msgid "Child Ranges"
|
||||
msgstr "Gammes pour enfants"
|
||||
msgstr "Plages pour enfants"
|
||||
|
||||
#: ipam/views.py:868
|
||||
msgid "Related IPs"
|
||||
@ -9050,7 +9051,7 @@ msgstr "Préfixes et rôles VLAN"
|
||||
|
||||
#: netbox/navigation/menu.py:162
|
||||
msgid "ASN Ranges"
|
||||
msgstr "Gammes ASN"
|
||||
msgstr "Plages ASN"
|
||||
|
||||
#: netbox/navigation/menu.py:184
|
||||
msgid "VLAN Groups"
|
||||
@ -9457,7 +9458,7 @@ msgstr "Annuler"
|
||||
#: utilities/templates/helpers/applied_filters.html:16
|
||||
#: utilities/templates/helpers/table_config_form.html:40
|
||||
msgid "Save"
|
||||
msgstr "Sauver"
|
||||
msgstr "Sauvegarder"
|
||||
|
||||
#: templates/account/preferences.html:41
|
||||
msgid "Table Configurations"
|
||||
@ -9598,11 +9599,11 @@ msgid ""
|
||||
"production system"
|
||||
msgstr ""
|
||||
"Les performances peuvent être limitées. Le débogage ne doit jamais être "
|
||||
"activé sur un système de production"
|
||||
"activé sur un système en production"
|
||||
|
||||
#: templates/base/layout.html:83
|
||||
msgid "Maintenance Mode"
|
||||
msgstr "Mode de maintenance"
|
||||
msgstr "Mode Maintenance"
|
||||
|
||||
#: templates/base/layout.html:134
|
||||
msgid "Docs"
|
||||
@ -9642,16 +9643,16 @@ msgstr "Date de résiliation"
|
||||
|
||||
#: templates/circuits/circuit_terminations_swap.html:4
|
||||
msgid "Swap Circuit Terminations"
|
||||
msgstr "Terminaisons du circuit d'échange"
|
||||
msgstr "Échanger les terminaisons du circuit"
|
||||
|
||||
#: templates/circuits/circuit_terminations_swap.html:8
|
||||
#, python-format
|
||||
msgid "Swap these terminations for circuit %(circuit)s?"
|
||||
msgstr "Remplacez ces terminaisons par un circuit %(circuit)s?"
|
||||
msgstr "Échanger les terminaisons du circuit %(circuit)s?"
|
||||
|
||||
#: templates/circuits/circuit_terminations_swap.html:14
|
||||
msgid "A side"
|
||||
msgstr "Un côté"
|
||||
msgstr "Coté A"
|
||||
|
||||
#: templates/circuits/circuit_terminations_swap.html:22
|
||||
msgid "Z side"
|
||||
@ -9662,11 +9663,11 @@ msgstr "Côté Z"
|
||||
#: templates/dcim/frontport.html:128 templates/dcim/interface.html:199
|
||||
#: templates/dcim/rearport.html:118
|
||||
msgid "Circuit Termination"
|
||||
msgstr "Terminaison du circuit"
|
||||
msgstr "Terminaison de circuit"
|
||||
|
||||
#: templates/circuits/circuittermination_edit.html:41
|
||||
msgid "Termination Details"
|
||||
msgstr "Détails de résiliation"
|
||||
msgstr "Détails de terminaison"
|
||||
|
||||
#: templates/circuits/circuittype.html:10
|
||||
msgid "Add Circuit"
|
||||
|
@ -4,8 +4,8 @@
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
# Translators:
|
||||
# Renato Almeida de Oliveira, 2023
|
||||
# Jeremy Stretch, 2023
|
||||
# Renato Almeida de Oliveira, 2024
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
@ -14,7 +14,7 @@ msgstr ""
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2023-12-21 17:54+0000\n"
|
||||
"PO-Revision-Date: 2023-10-30 17:48+0000\n"
|
||||
"Last-Translator: Jeremy Stretch, 2023\n"
|
||||
"Last-Translator: Renato Almeida de Oliveira, 2024\n"
|
||||
"Language-Team: Portuguese (https://app.transifex.com/netbox-community/teams/178115/pt/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@ -30,7 +30,7 @@ msgstr "Chave"
|
||||
|
||||
#: account/tables.py:31 users/forms/filtersets.py:133
|
||||
msgid "Write Enabled"
|
||||
msgstr "Gravação ativada"
|
||||
msgstr "Escrita permitida"
|
||||
|
||||
#: account/tables.py:34 core/tables/jobs.py:29 extras/choices.py:135
|
||||
#: extras/tables/tables.py:469 templates/account/token.html:44
|
||||
@ -2041,7 +2041,7 @@ msgstr "Grupo (ID)"
|
||||
|
||||
#: dcim/filtersets.py:138
|
||||
msgid "Group (slug)"
|
||||
msgstr "Grupo (lesma)"
|
||||
msgstr "Grupo (slug)"
|
||||
|
||||
#: dcim/filtersets.py:144 dcim/filtersets.py:149
|
||||
msgid "AS (ID)"
|
||||
@ -2055,7 +2055,7 @@ msgstr "Localização (ID)"
|
||||
#: dcim/filtersets.py:224 dcim/filtersets.py:299 dcim/filtersets.py:397
|
||||
#: dcim/filtersets.py:1219 extras/filtersets.py:447
|
||||
msgid "Location (slug)"
|
||||
msgstr "Localização (lesma)"
|
||||
msgstr "Localização (slug)"
|
||||
|
||||
#: dcim/filtersets.py:313 dcim/filtersets.py:764 dcim/filtersets.py:854
|
||||
#: dcim/filtersets.py:1619 ipam/filtersets.py:347 ipam/filtersets.py:459
|
||||
@ -2068,7 +2068,7 @@ msgstr "Função (ID)"
|
||||
#: ipam/filtersets.py:465 ipam/filtersets.py:946
|
||||
#: virtualization/filtersets.py:215
|
||||
msgid "Role (slug)"
|
||||
msgstr "Papel (lesma)"
|
||||
msgstr "Papel (slug)"
|
||||
|
||||
#: dcim/filtersets.py:347 dcim/filtersets.py:922 dcim/filtersets.py:1224
|
||||
#: dcim/filtersets.py:1942
|
||||
@ -2095,7 +2095,7 @@ msgstr "Fabricante (ID)"
|
||||
#: dcim/filtersets.py:811 dcim/filtersets.py:839 dcim/filtersets.py:1122
|
||||
#: dcim/filtersets.py:1615
|
||||
msgid "Manufacturer (slug)"
|
||||
msgstr "Fabricante (lesma)"
|
||||
msgstr "Fabricante (slug)"
|
||||
|
||||
#: dcim/filtersets.py:445
|
||||
msgid "Default platform (ID)"
|
||||
@ -2180,7 +2180,7 @@ msgstr "Modelo de configuração (ID)"
|
||||
|
||||
#: dcim/filtersets.py:845
|
||||
msgid "Device type (slug)"
|
||||
msgstr "Tipo de dispositivo (lesma)"
|
||||
msgstr "Tipo de dispositivo (slug)"
|
||||
|
||||
#: dcim/filtersets.py:865
|
||||
msgid "Parent Device (ID)"
|
||||
@ -2193,7 +2193,7 @@ msgstr "Plataforma (ID)"
|
||||
#: dcim/filtersets.py:875 extras/filtersets.py:474
|
||||
#: virtualization/filtersets.py:225
|
||||
msgid "Platform (slug)"
|
||||
msgstr "Plataforma (lesma)"
|
||||
msgstr "Plataforma (slug)"
|
||||
|
||||
#: dcim/filtersets.py:911 dcim/filtersets.py:1208 dcim/filtersets.py:1703
|
||||
#: dcim/filtersets.py:1875 dcim/filtersets.py:1933
|
||||
@ -3634,7 +3634,7 @@ msgstr "Reserva"
|
||||
#: dcim/forms/model_forms.py:297 dcim/forms/model_forms.py:380
|
||||
#: utilities/forms/fields/fields.py:47
|
||||
msgid "Slug"
|
||||
msgstr "Lesma"
|
||||
msgstr "Slug"
|
||||
|
||||
#: dcim/forms/model_forms.py:304 templates/dcim/devicetype.html:12
|
||||
msgid "Chassis"
|
||||
@ -5198,7 +5198,7 @@ msgstr "Já existe uma região de nível superior com esse nome."
|
||||
|
||||
#: dcim/models/sites.py:59
|
||||
msgid "A top-level region with this slug already exists."
|
||||
msgstr "Já existe uma região de alto nível com essa lesma."
|
||||
msgstr "Já existe uma região de alto nível com essa slug."
|
||||
|
||||
#: dcim/models/sites.py:62
|
||||
msgid "region"
|
||||
@ -6029,7 +6029,7 @@ msgstr "Tipo de cluster"
|
||||
#: extras/filtersets.py:485 virtualization/filtersets.py:95
|
||||
#: virtualization/filtersets.py:146
|
||||
msgid "Cluster type (slug)"
|
||||
msgstr "Tipo de cluster (lesma)"
|
||||
msgstr "Tipo de cluster (slug)"
|
||||
|
||||
#: extras/filtersets.py:490 ipam/forms/bulk_edit.py:475
|
||||
#: ipam/forms/model_forms.py:585 virtualization/forms/filtersets.py:108
|
||||
@ -6038,7 +6038,7 @@ msgstr "Grupo de clusters"
|
||||
|
||||
#: extras/filtersets.py:496 virtualization/filtersets.py:135
|
||||
msgid "Cluster group (slug)"
|
||||
msgstr "Grupo de clusters (lesma)"
|
||||
msgstr "Grupo de clusters (slug)"
|
||||
|
||||
#: extras/filtersets.py:506 tenancy/forms/forms.py:16
|
||||
#: tenancy/forms/forms.py:39
|
||||
@ -6056,7 +6056,7 @@ msgstr "Tag"
|
||||
|
||||
#: extras/filtersets.py:534
|
||||
msgid "Tag (slug)"
|
||||
msgstr "Tag (lesma)"
|
||||
msgstr "Tag (slug)"
|
||||
|
||||
#: extras/filtersets.py:594 extras/forms/filtersets.py:438
|
||||
msgid "Has local config context data"
|
||||
@ -7630,7 +7630,7 @@ msgstr "RIR (ID)"
|
||||
|
||||
#: ipam/filtersets.py:142 ipam/filtersets.py:181 ipam/filtersets.py:204
|
||||
msgid "RIR (slug)"
|
||||
msgstr "RIR (lesma)"
|
||||
msgstr "RIR (slug)"
|
||||
|
||||
#: ipam/filtersets.py:251
|
||||
msgid "Within prefix"
|
||||
@ -12175,7 +12175,7 @@ msgstr "Função de contato (ID)"
|
||||
|
||||
#: tenancy/filtersets.py:114
|
||||
msgid "Contact role (slug)"
|
||||
msgstr "Função de contato (lesma)"
|
||||
msgstr "Função de contato (slug)"
|
||||
|
||||
#: tenancy/filtersets.py:146
|
||||
msgid "Contact group"
|
||||
@ -12191,7 +12191,7 @@ msgstr "Grupo de inquilinos (ID)"
|
||||
|
||||
#: tenancy/filtersets.py:216
|
||||
msgid "Tenant Group (slug)"
|
||||
msgstr "Grupo de inquilinos (lesma)"
|
||||
msgstr "Grupo de inquilinos (slug)"
|
||||
|
||||
#: tenancy/forms/bulk_edit.py:65
|
||||
msgid "Desciption"
|
||||
@ -13147,7 +13147,7 @@ msgstr "Grupo de túneis (ID)"
|
||||
|
||||
#: vpn/filtersets.py:47
|
||||
msgid "Tunnel group (slug)"
|
||||
msgstr "Grupo de túneis (lesma)"
|
||||
msgstr "Grupo de túneis (slug)"
|
||||
|
||||
#: vpn/filtersets.py:54
|
||||
msgid "IPSec profile (ID)"
|
||||
|
@ -38,11 +38,11 @@ class TunnelEncapsulationChoices(ChoiceSet):
|
||||
class TunnelTerminationTypeChoices(ChoiceSet):
|
||||
# For TunnelCreateForm
|
||||
TYPE_DEVICE = 'dcim.device'
|
||||
TYPE_VIRUTALMACHINE = 'virtualization.virtualmachine'
|
||||
TYPE_VIRTUALMACHINE = 'virtualization.virtualmachine'
|
||||
|
||||
CHOICES = (
|
||||
(TYPE_DEVICE, _('Device')),
|
||||
(TYPE_VIRUTALMACHINE, _('Virtual Machine')),
|
||||
(TYPE_VIRTUALMACHINE, _('Virtual Machine')),
|
||||
)
|
||||
|
||||
|
||||
@ -179,6 +179,7 @@ class DHGroupChoices(ChoiceSet):
|
||||
(GROUP_2, _('Group {n}').format(n=2)),
|
||||
(GROUP_5, _('Group {n}').format(n=5)),
|
||||
(GROUP_14, _('Group {n}').format(n=14)),
|
||||
(GROUP_15, _('Group {n}').format(n=15)),
|
||||
(GROUP_16, _('Group {n}').format(n=16)),
|
||||
(GROUP_17, _('Group {n}').format(n=17)),
|
||||
(GROUP_18, _('Group {n}').format(n=18)),
|
||||
|
@ -151,7 +151,8 @@ class IKEProposalImportForm(NetBoxModelImportForm):
|
||||
)
|
||||
authentication_algorithm = CSVChoiceField(
|
||||
label=_('Authentication algorithm'),
|
||||
choices=AuthenticationAlgorithmChoices
|
||||
choices=AuthenticationAlgorithmChoices,
|
||||
required=False
|
||||
)
|
||||
group = CSVChoiceField(
|
||||
label=_('Group'),
|
||||
@ -191,11 +192,13 @@ class IKEPolicyImportForm(NetBoxModelImportForm):
|
||||
class IPSecProposalImportForm(NetBoxModelImportForm):
|
||||
encryption_algorithm = CSVChoiceField(
|
||||
label=_('Encryption algorithm'),
|
||||
choices=EncryptionAlgorithmChoices
|
||||
choices=EncryptionAlgorithmChoices,
|
||||
required=False
|
||||
)
|
||||
authentication_algorithm = CSVChoiceField(
|
||||
label=_('Authentication algorithm'),
|
||||
choices=AuthenticationAlgorithmChoices
|
||||
choices=AuthenticationAlgorithmChoices,
|
||||
required=False
|
||||
)
|
||||
|
||||
class Meta:
|
||||
@ -209,7 +212,8 @@ class IPSecProposalImportForm(NetBoxModelImportForm):
|
||||
class IPSecPolicyImportForm(NetBoxModelImportForm):
|
||||
pfs_group = CSVChoiceField(
|
||||
label=_('Diffie-Hellman group for Perfect Forward Secrecy'),
|
||||
choices=DHGroupChoices
|
||||
choices=DHGroupChoices,
|
||||
required=False
|
||||
)
|
||||
proposals = CSVModelMultipleChoiceField(
|
||||
queryset=IPSecProposal.objects.all(),
|
||||
|
@ -7,7 +7,7 @@ from ipam.models import IPAddress, RouteTarget, VLAN
|
||||
from netbox.forms import NetBoxModelForm
|
||||
from tenancy.forms import TenancyForm
|
||||
from utilities.forms.fields import CommentField, DynamicModelChoiceField, DynamicModelMultipleChoiceField, SlugField
|
||||
from utilities.forms.utils import add_blank_choice
|
||||
from utilities.forms.utils import add_blank_choice, get_field_value
|
||||
from utilities.forms.widgets import HTMXSelect
|
||||
from virtualization.models import VirtualMachine, VMInterface
|
||||
from vpn.choices import *
|
||||
@ -157,7 +157,7 @@ class TunnelCreateForm(TunnelForm):
|
||||
def __init__(self, *args, initial=None, **kwargs):
|
||||
super().__init__(*args, initial=initial, **kwargs)
|
||||
|
||||
if initial and initial.get('termination1_type') == TunnelTerminationTypeChoices.TYPE_VIRUTALMACHINE:
|
||||
if get_field_value(self, 'termination1_type') == TunnelTerminationTypeChoices.TYPE_VIRTUALMACHINE:
|
||||
self.fields['termination1_parent'].label = _('Virtual Machine')
|
||||
self.fields['termination1_parent'].queryset = VirtualMachine.objects.all()
|
||||
self.fields['termination1_termination'].queryset = VMInterface.objects.all()
|
||||
@ -168,7 +168,7 @@ class TunnelCreateForm(TunnelForm):
|
||||
'virtual_machine_id': '$termination1_parent',
|
||||
})
|
||||
|
||||
if initial and initial.get('termination2_type') == TunnelTerminationTypeChoices.TYPE_VIRUTALMACHINE:
|
||||
if get_field_value(self, 'termination2_type') == TunnelTerminationTypeChoices.TYPE_VIRTUALMACHINE:
|
||||
self.fields['termination2_parent'].label = _('Virtual Machine')
|
||||
self.fields['termination2_parent'].queryset = VirtualMachine.objects.all()
|
||||
self.fields['termination2_termination'].queryset = VMInterface.objects.all()
|
||||
@ -265,7 +265,7 @@ class TunnelTerminationForm(NetBoxModelForm):
|
||||
def __init__(self, *args, initial=None, **kwargs):
|
||||
super().__init__(*args, initial=initial, **kwargs)
|
||||
|
||||
if initial and initial.get('type') == TunnelTerminationTypeChoices.TYPE_VIRUTALMACHINE:
|
||||
if initial and initial.get('type') == TunnelTerminationTypeChoices.TYPE_VIRTUALMACHINE:
|
||||
self.fields['parent'].label = _('Virtual Machine')
|
||||
self.fields['parent'].queryset = VirtualMachine.objects.all()
|
||||
self.fields['termination'].queryset = VMInterface.objects.all()
|
||||
|
@ -0,0 +1,20 @@
|
||||
# Generated by Django 4.2.8 on 2024-01-05 19:31
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('ipam', '0069_gfk_indexes'),
|
||||
('vpn', '0002_move_l2vpn'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='tunneltermination',
|
||||
name='outside_ip',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='tunnel_terminations', to='ipam.ipaddress'),
|
||||
),
|
||||
]
|
@ -129,10 +129,10 @@ class TunnelTermination(CustomFieldsMixin, CustomLinksMixin, TagsMixin, ChangeLo
|
||||
ct_field='termination_type',
|
||||
fk_field='termination_id'
|
||||
)
|
||||
outside_ip = models.OneToOneField(
|
||||
outside_ip = models.ForeignKey(
|
||||
to='ipam.IPAddress',
|
||||
on_delete=models.PROTECT,
|
||||
related_name='tunnel_termination',
|
||||
related_name='tunnel_terminations',
|
||||
blank=True,
|
||||
null=True
|
||||
)
|
||||
|
@ -1,5 +1,5 @@
|
||||
bleach==6.1.0
|
||||
Django==4.2.8
|
||||
Django==4.2.9
|
||||
django-cors-headers==4.3.1
|
||||
django-debug-toolbar==4.2.0
|
||||
django-filter==23.5
|
||||
@ -15,21 +15,21 @@ django-tables2==2.7.0
|
||||
django-timezone-field==6.1.0
|
||||
djangorestframework==3.14.0
|
||||
drf-spectacular==0.27.0
|
||||
drf-spectacular-sidecar==2023.12.1
|
||||
drf-spectacular-sidecar==2024.1.1
|
||||
feedparser==6.0.11
|
||||
graphene-django==3.0.0
|
||||
gunicorn==21.2.0
|
||||
Jinja2==3.1.2
|
||||
Markdown==3.5.1
|
||||
mkdocs-material==9.5.3
|
||||
Jinja2==3.1.3
|
||||
Markdown==3.5.2
|
||||
mkdocs-material==9.5.4
|
||||
mkdocstrings[python-legacy]==0.24.0
|
||||
netaddr==0.9.0
|
||||
Pillow==10.1.0
|
||||
psycopg[binary,pool]==3.1.16
|
||||
netaddr==0.10.1
|
||||
Pillow==10.2.0
|
||||
psycopg[binary,pool]==3.1.17
|
||||
PyYAML==6.0.1
|
||||
requests==2.31.0
|
||||
social-auth-app-django==5.4.0
|
||||
social-auth-core[openidconnect]==4.5.1
|
||||
svgwrite==1.4.3
|
||||
tablib==3.5.0
|
||||
tzdata==2023.3
|
||||
tzdata==2023.4
|
||||
|