mirror of
https://github.com/netbox-community/netbox.git
synced 2024-05-10 07:54:54 +00:00
Fixes #7392: Fix "help" links for custom fields, other models
This commit is contained in:
@ -1,85 +1,4 @@
|
|||||||
# Webhooks
|
{!models/extras/webhook.md!}
|
||||||
|
|
||||||
A webhook is a mechanism for conveying to some external system a change that took place in NetBox. For example, you may want to notify a monitoring system whenever the status of a device is updated in NetBox. This can be done by creating a webhook for the device model in NetBox and identifying the webhook receiver. When NetBox detects a change to a device, an HTTP request containing the details of the change and who made it be sent to the specified receiver. Webhooks are managed under Logging > Webhooks.
|
|
||||||
|
|
||||||
!!! warning
|
|
||||||
Webhooks support the inclusion of user-submitted code to generate custom headers and payloads, which may pose security risks under certain conditions. Only grant permission to create or modify webhooks to trusted users.
|
|
||||||
|
|
||||||
## Configuration
|
|
||||||
|
|
||||||
* **Name** - A unique name for the webhook. The name is not included with outbound messages.
|
|
||||||
* **Object type(s)** - The type or types of NetBox object that will trigger the webhook.
|
|
||||||
* **Enabled** - If unchecked, the webhook will be inactive.
|
|
||||||
* **Events** - A webhook may trigger on any combination of create, update, and delete events. At least one event type must be selected.
|
|
||||||
* **HTTP method** - The type of HTTP request to send. Options include `GET`, `POST`, `PUT`, `PATCH`, and `DELETE`.
|
|
||||||
* **URL** - The fuly-qualified URL of the request to be sent. This may specify a destination port number if needed.
|
|
||||||
* **HTTP content type** - The value of the request's `Content-Type` header. (Defaults to `application/json`)
|
|
||||||
* **Additional headers** - Any additional headers to include with the request (optional). Add one header per line in the format `Name: Value`. Jinja2 templating is supported for this field (see below).
|
|
||||||
* **Body template** - The content of the request being sent (optional). Jinja2 templating is supported for this field (see below). If blank, NetBox will populate the request body with a raw dump of the webhook context. (If the HTTP cotent type is set to `application/json`, this will be formatted as a JSON object.)
|
|
||||||
* **Secret** - A secret string used to prove authenticity of the request (optional). This will append a `X-Hook-Signature` header to the request, consisting of a HMAC (SHA-512) hex digest of the request body using the secret as the key.
|
|
||||||
* **SSL verification** - Uncheck this option to disable validation of the receiver's SSL certificate. (Disable with caution!)
|
|
||||||
* **CA file path** - The file path to a particular certificate authority (CA) file to use when validating the receiver's SSL certificate (optional).
|
|
||||||
|
|
||||||
## Jinja2 Template Support
|
|
||||||
|
|
||||||
[Jinja2 templating](https://jinja.palletsprojects.com/) is supported for the `additional_headers` and `body_template` fields. This enables the user to convey object data in the request headers as well as to craft a customized request body. Request content can be crafted to enable the direct interaction with external systems by ensuring the outgoing message is in a format the receiver expects and understands.
|
|
||||||
|
|
||||||
For example, you might create a NetBox webhook to [trigger a Slack message](https://api.slack.com/messaging/webhooks) any time an IP address is created. You can accomplish this using the following configuration:
|
|
||||||
|
|
||||||
* Object type: IPAM > IP address
|
|
||||||
* HTTP method: `POST`
|
|
||||||
* URL: Slack incoming webhook URL
|
|
||||||
* HTTP content type: `application/json`
|
|
||||||
* Body template: `{"text": "IP address {{ data['address'] }} was created by {{ username }}!"}`
|
|
||||||
|
|
||||||
### Available Context
|
|
||||||
|
|
||||||
The following data is available as context for Jinja2 templates:
|
|
||||||
|
|
||||||
* `event` - The type of event which triggered the webhook: created, updated, or deleted.
|
|
||||||
* `model` - The NetBox model which triggered the change.
|
|
||||||
* `timestamp` - The time at which the event occurred (in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format).
|
|
||||||
* `username` - The name of the user account associated with the change.
|
|
||||||
* `request_id` - The unique request ID. This may be used to correlate multiple changes associated with a single request.
|
|
||||||
* `data` - A detailed representation of the object in its current state. This is typically equivalent to the model's representation in NetBox's REST API.
|
|
||||||
* `snapshots` - Minimal "snapshots" of the object state both before and after the change was made; provided ass a dictionary with keys named `prechange` and `postchange`. These are not as extensive as the fully serialized representation, but contain enough information to convey what has changed.
|
|
||||||
|
|
||||||
### Default Request Body
|
|
||||||
|
|
||||||
If no body template is specified, the request body will be populated with a JSON object containing the context data. For example, a newly created site might appear as follows:
|
|
||||||
|
|
||||||
```no-highlight
|
|
||||||
{
|
|
||||||
"event": "created",
|
|
||||||
"timestamp": "2021-03-09 17:55:33.968016+00:00",
|
|
||||||
"model": "site",
|
|
||||||
"username": "jstretch",
|
|
||||||
"request_id": "fdbca812-3142-4783-b364-2e2bd5c16c6a",
|
|
||||||
"data": {
|
|
||||||
"id": 19,
|
|
||||||
"name": "Site 1",
|
|
||||||
"slug": "site-1",
|
|
||||||
"status":
|
|
||||||
"value": "active",
|
|
||||||
"label": "Active",
|
|
||||||
"id": 1
|
|
||||||
},
|
|
||||||
"region": null,
|
|
||||||
...
|
|
||||||
},
|
|
||||||
"snapshots": {
|
|
||||||
"prechange": null,
|
|
||||||
"postchange": {
|
|
||||||
"created": "2021-03-09",
|
|
||||||
"last_updated": "2021-03-09T17:55:33.851Z",
|
|
||||||
"name": "Site 1",
|
|
||||||
"slug": "site-1",
|
|
||||||
"status": "active",
|
|
||||||
...
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## Webhook Processing
|
## Webhook Processing
|
||||||
|
|
||||||
|
@ -1,44 +1,4 @@
|
|||||||
# Custom Fields
|
{!models/extras/customfield.md!}
|
||||||
|
|
||||||
Each model in NetBox is represented in the database as a discrete table, and each attribute of a model exists as a column within its table. For example, sites are stored in the `dcim_site` table, which has columns named `name`, `facility`, `physical_address`, and so on. As new attributes are added to objects throughout the development of NetBox, tables are expanded to include new rows.
|
|
||||||
|
|
||||||
However, some users might want to store additional object attributes that are somewhat esoteric in nature, and that would not make sense to include in the core NetBox database schema. For instance, suppose your organization needs to associate each device with a ticket number correlating it with an internal support system record. This is certainly a legitimate use for NetBox, but it's not a common enough need to warrant including a field for _every_ NetBox installation. Instead, you can create a custom field to hold this data.
|
|
||||||
|
|
||||||
Within the database, custom fields are stored as JSON data directly alongside each object. This alleviates the need for complex queries when retrieving objects.
|
|
||||||
|
|
||||||
## Creating Custom Fields
|
|
||||||
|
|
||||||
Custom fields may be created by navigating to Customization > Custom Fields. NetBox supports six types of custom field:
|
|
||||||
|
|
||||||
* Text: Free-form text (up to 255 characters)
|
|
||||||
* Integer: A whole number (positive or negative)
|
|
||||||
* Boolean: True or false
|
|
||||||
* Date: A date in ISO 8601 format (YYYY-MM-DD)
|
|
||||||
* URL: This will be presented as a link in the web UI
|
|
||||||
* Selection: A selection of one of several pre-defined custom choices
|
|
||||||
* Multiple selection: A selection field which supports the assignment of multiple values
|
|
||||||
|
|
||||||
Each custom field must have a name; this should be a simple database-friendly string, e.g. `tps_report`. You may also assign a corresponding human-friendly label (e.g. "TPS report"); the label will be displayed on web forms. A weight is also required: Higher-weight fields will be ordered lower within a form. (The default weight is 100.) If a description is provided, it will appear beneath the field in a form.
|
|
||||||
|
|
||||||
Marking a field as required will force the user to provide a value for the field when creating a new object or when saving an existing object. A default value for the field may also be provided. Use "true" or "false" for boolean fields, or the exact value of a choice for selection fields.
|
|
||||||
|
|
||||||
The filter logic controls how values are matched when filtering objects by the custom field. Loose filtering (the default) matches on a partial value, whereas exact matching requires a complete match of the given string to a field's value. For example, exact filtering with the string "red" will only match the exact value "red", whereas loose filtering will match on the values "red", "red-orange", or "bored". Setting the filter logic to "disabled" disables filtering by the field entirely.
|
|
||||||
|
|
||||||
A custom field must be assigned to one or more object types, or models, in NetBox. Once created, custom fields will automatically appear as part of these models in the web UI and REST API. Note that not all models support custom fields.
|
|
||||||
|
|
||||||
### Custom Field Validation
|
|
||||||
|
|
||||||
NetBox supports limited custom validation for custom field values. Following are the types of validation enforced for each field type:
|
|
||||||
|
|
||||||
* Text: Regular expression (optional)
|
|
||||||
* Integer: Minimum and/or maximum value (optional)
|
|
||||||
* Selection: Must exactly match one of the prescribed choices
|
|
||||||
|
|
||||||
### Custom Selection Fields
|
|
||||||
|
|
||||||
Each custom selection field must have at least two choices. These are specified as a comma-separated list. Choices appear in forms in the order they are listed. Note that choice values are saved exactly as they appear, so it's best to avoid superfluous punctuation or symbols where possible.
|
|
||||||
|
|
||||||
If a default value is specified for a selection field, it must exactly match one of the provided choices. The value of a multiple selection field will always return a list, even if only one value is selected.
|
|
||||||
|
|
||||||
## Custom Fields in Templates
|
## Custom Fields in Templates
|
||||||
|
|
||||||
|
@ -1,57 +1 @@
|
|||||||
# Custom Links
|
{!models/extras/customlink.md!}
|
||||||
|
|
||||||
Custom links allow users to display arbitrary hyperlinks to external content within NetBox object views. These are helpful for cross-referencing related records in systems outside NetBox. For example, you might create a custom link on the device view which links to the current device in a network monitoring system.
|
|
||||||
|
|
||||||
Custom links are created by navigating to Customization > Custom Links. Each link is associated with a particular NetBox object type (site, device, prefix, etc.) and will be displayed on relevant views. Each link is assigned text and a URL, both of which support Jinja2 templating. The text and URL are rendered with the context variable `obj` representing the current object.
|
|
||||||
|
|
||||||
For example, you might define a link like this:
|
|
||||||
|
|
||||||
* Text: `View NMS`
|
|
||||||
* URL: `https://nms.example.com/nodes/?name={{ obj.name }}`
|
|
||||||
|
|
||||||
When viewing a device named Router4, this link would render as:
|
|
||||||
|
|
||||||
```no-highlight
|
|
||||||
<a href="https://nms.example.com/nodes/?name=Router4">View NMS</a>
|
|
||||||
```
|
|
||||||
|
|
||||||
Custom links appear as buttons in the top right corner of the page. Numeric weighting can be used to influence the ordering of links.
|
|
||||||
|
|
||||||
!!! warning
|
|
||||||
Custom links rely on user-created code to generate arbitrary HTML output, which may be dangerous. Only grant permission to create or modify custom links to trusted users.
|
|
||||||
|
|
||||||
## Context Data
|
|
||||||
|
|
||||||
The following context data is available within the template when rendering a custom link's text or URL.
|
|
||||||
|
|
||||||
| Variable | Description |
|
|
||||||
|----------|-------------|
|
|
||||||
| `obj` | The NetBox object being displayed |
|
|
||||||
| `debug` | A boolean indicating whether debugging is enabled |
|
|
||||||
| `request` | The current WSGI request |
|
|
||||||
| `user` | The current user (if authenticated) |
|
|
||||||
| `perms` | The [permissions](https://docs.djangoproject.com/en/stable/topics/auth/default/#permissions) assigned to the user |
|
|
||||||
|
|
||||||
## Conditional Rendering
|
|
||||||
|
|
||||||
Only links which render with non-empty text are included on the page. You can employ conditional Jinja2 logic to control the conditions under which a link gets rendered.
|
|
||||||
|
|
||||||
For example, if you only want to display a link for active devices, you could set the link text to
|
|
||||||
|
|
||||||
```jinja2
|
|
||||||
{% if obj.status == 'active' %}View NMS{% endif %}
|
|
||||||
```
|
|
||||||
|
|
||||||
The link will not appear when viewing a device with any status other than "active."
|
|
||||||
|
|
||||||
As another example, if you wanted to show only devices belonging to a certain manufacturer, you could do something like this:
|
|
||||||
|
|
||||||
```jinja2
|
|
||||||
{% if obj.device_type.manufacturer.name == 'Cisco' %}View NMS{% endif %}
|
|
||||||
```
|
|
||||||
|
|
||||||
The link will only appear when viewing a device with a manufacturer name of "Cisco."
|
|
||||||
|
|
||||||
## Link Groups
|
|
||||||
|
|
||||||
Group names can be specified to organize links into groups. Links with the same group name will render as a dropdown menu beneath a single button bearing the name of the group.
|
|
||||||
|
@ -1,40 +1,4 @@
|
|||||||
# Export Templates
|
{!models/extras/exporttemplate.md!}
|
||||||
|
|
||||||
NetBox allows users to define custom templates that can be used when exporting objects. To create an export template, navigate to Customization > Export Templates.
|
|
||||||
|
|
||||||
Each export template is associated with a certain type of object. For instance, if you create an export template for VLANs, your custom template will appear under the "Export" button on the VLANs list. Each export template must have a name, and may optionally designate a specific export [MIME type](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types) and/or file extension.
|
|
||||||
|
|
||||||
Export templates must be written in [Jinja2](https://jinja.palletsprojects.com/).
|
|
||||||
|
|
||||||
!!! note
|
|
||||||
The name `table` is reserved for internal use.
|
|
||||||
|
|
||||||
!!! warning
|
|
||||||
Export templates are rendered using user-submitted code, which may pose security risks under certain conditions. Only grant permission to create or modify export templates to trusted users.
|
|
||||||
|
|
||||||
The list of objects returned from the database when rendering an export template is stored in the `queryset` variable, which you'll typically want to iterate through using a `for` loop. Object properties can be access by name. For example:
|
|
||||||
|
|
||||||
```jinja2
|
|
||||||
{% for rack in queryset %}
|
|
||||||
Rack: {{ rack.name }}
|
|
||||||
Site: {{ rack.site.name }}
|
|
||||||
Height: {{ rack.u_height }}U
|
|
||||||
{% endfor %}
|
|
||||||
```
|
|
||||||
|
|
||||||
To access custom fields of an object within a template, use the `cf` attribute. For example, `{{ obj.cf.color }}` will return the value (if any) for a custom field named `color` on `obj`.
|
|
||||||
|
|
||||||
If you need to use the config context data in an export template, you'll should use the function `get_config_context` to get all the config context data. For example:
|
|
||||||
```
|
|
||||||
{% for server in queryset %}
|
|
||||||
{% set data = server.get_config_context() %}
|
|
||||||
{{ data.syslog }}
|
|
||||||
{% endfor %}
|
|
||||||
```
|
|
||||||
|
|
||||||
The `as_attachment` attribute of an export template controls its behavior when rendered. If true, the rendered content will be returned to the user as a downloadable file. If false, it will be displayed within the browser. (This may be handy e.g. for generating HTML content.)
|
|
||||||
|
|
||||||
A MIME type and file extension can optionally be defined for each export template. The default MIME type is `text/plain`.
|
|
||||||
|
|
||||||
## REST API Integration
|
## REST API Integration
|
||||||
|
|
||||||
|
41
docs/models/extras/customfield.md
Normal file
41
docs/models/extras/customfield.md
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
# Custom Fields
|
||||||
|
|
||||||
|
Each model in NetBox is represented in the database as a discrete table, and each attribute of a model exists as a column within its table. For example, sites are stored in the `dcim_site` table, which has columns named `name`, `facility`, `physical_address`, and so on. As new attributes are added to objects throughout the development of NetBox, tables are expanded to include new rows.
|
||||||
|
|
||||||
|
However, some users might want to store additional object attributes that are somewhat esoteric in nature, and that would not make sense to include in the core NetBox database schema. For instance, suppose your organization needs to associate each device with a ticket number correlating it with an internal support system record. This is certainly a legitimate use for NetBox, but it's not a common enough need to warrant including a field for _every_ NetBox installation. Instead, you can create a custom field to hold this data.
|
||||||
|
|
||||||
|
Within the database, custom fields are stored as JSON data directly alongside each object. This alleviates the need for complex queries when retrieving objects.
|
||||||
|
|
||||||
|
## Creating Custom Fields
|
||||||
|
|
||||||
|
Custom fields may be created by navigating to Customization > Custom Fields. NetBox supports six types of custom field:
|
||||||
|
|
||||||
|
* Text: Free-form text (up to 255 characters)
|
||||||
|
* Integer: A whole number (positive or negative)
|
||||||
|
* Boolean: True or false
|
||||||
|
* Date: A date in ISO 8601 format (YYYY-MM-DD)
|
||||||
|
* URL: This will be presented as a link in the web UI
|
||||||
|
* Selection: A selection of one of several pre-defined custom choices
|
||||||
|
* Multiple selection: A selection field which supports the assignment of multiple values
|
||||||
|
|
||||||
|
Each custom field must have a name; this should be a simple database-friendly string, e.g. `tps_report`. You may also assign a corresponding human-friendly label (e.g. "TPS report"); the label will be displayed on web forms. A weight is also required: Higher-weight fields will be ordered lower within a form. (The default weight is 100.) If a description is provided, it will appear beneath the field in a form.
|
||||||
|
|
||||||
|
Marking a field as required will force the user to provide a value for the field when creating a new object or when saving an existing object. A default value for the field may also be provided. Use "true" or "false" for boolean fields, or the exact value of a choice for selection fields.
|
||||||
|
|
||||||
|
The filter logic controls how values are matched when filtering objects by the custom field. Loose filtering (the default) matches on a partial value, whereas exact matching requires a complete match of the given string to a field's value. For example, exact filtering with the string "red" will only match the exact value "red", whereas loose filtering will match on the values "red", "red-orange", or "bored". Setting the filter logic to "disabled" disables filtering by the field entirely.
|
||||||
|
|
||||||
|
A custom field must be assigned to one or more object types, or models, in NetBox. Once created, custom fields will automatically appear as part of these models in the web UI and REST API. Note that not all models support custom fields.
|
||||||
|
|
||||||
|
### Custom Field Validation
|
||||||
|
|
||||||
|
NetBox supports limited custom validation for custom field values. Following are the types of validation enforced for each field type:
|
||||||
|
|
||||||
|
* Text: Regular expression (optional)
|
||||||
|
* Integer: Minimum and/or maximum value (optional)
|
||||||
|
* Selection: Must exactly match one of the prescribed choices
|
||||||
|
|
||||||
|
### Custom Selection Fields
|
||||||
|
|
||||||
|
Each custom selection field must have at least two choices. These are specified as a comma-separated list. Choices appear in forms in the order they are listed. Note that choice values are saved exactly as they appear, so it's best to avoid superfluous punctuation or symbols where possible.
|
||||||
|
|
||||||
|
If a default value is specified for a selection field, it must exactly match one of the provided choices. The value of a multiple selection field will always return a list, even if only one value is selected.
|
57
docs/models/extras/customlink.md
Normal file
57
docs/models/extras/customlink.md
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
# Custom Links
|
||||||
|
|
||||||
|
Custom links allow users to display arbitrary hyperlinks to external content within NetBox object views. These are helpful for cross-referencing related records in systems outside NetBox. For example, you might create a custom link on the device view which links to the current device in a network monitoring system.
|
||||||
|
|
||||||
|
Custom links are created by navigating to Customization > Custom Links. Each link is associated with a particular NetBox object type (site, device, prefix, etc.) and will be displayed on relevant views. Each link is assigned text and a URL, both of which support Jinja2 templating. The text and URL are rendered with the context variable `obj` representing the current object.
|
||||||
|
|
||||||
|
For example, you might define a link like this:
|
||||||
|
|
||||||
|
* Text: `View NMS`
|
||||||
|
* URL: `https://nms.example.com/nodes/?name={{ obj.name }}`
|
||||||
|
|
||||||
|
When viewing a device named Router4, this link would render as:
|
||||||
|
|
||||||
|
```no-highlight
|
||||||
|
<a href="https://nms.example.com/nodes/?name=Router4">View NMS</a>
|
||||||
|
```
|
||||||
|
|
||||||
|
Custom links appear as buttons in the top right corner of the page. Numeric weighting can be used to influence the ordering of links.
|
||||||
|
|
||||||
|
!!! warning
|
||||||
|
Custom links rely on user-created code to generate arbitrary HTML output, which may be dangerous. Only grant permission to create or modify custom links to trusted users.
|
||||||
|
|
||||||
|
## Context Data
|
||||||
|
|
||||||
|
The following context data is available within the template when rendering a custom link's text or URL.
|
||||||
|
|
||||||
|
| Variable | Description |
|
||||||
|
|----------|-------------|
|
||||||
|
| `obj` | The NetBox object being displayed |
|
||||||
|
| `debug` | A boolean indicating whether debugging is enabled |
|
||||||
|
| `request` | The current WSGI request |
|
||||||
|
| `user` | The current user (if authenticated) |
|
||||||
|
| `perms` | The [permissions](https://docs.djangoproject.com/en/stable/topics/auth/default/#permissions) assigned to the user |
|
||||||
|
|
||||||
|
## Conditional Rendering
|
||||||
|
|
||||||
|
Only links which render with non-empty text are included on the page. You can employ conditional Jinja2 logic to control the conditions under which a link gets rendered.
|
||||||
|
|
||||||
|
For example, if you only want to display a link for active devices, you could set the link text to
|
||||||
|
|
||||||
|
```jinja2
|
||||||
|
{% if obj.status == 'active' %}View NMS{% endif %}
|
||||||
|
```
|
||||||
|
|
||||||
|
The link will not appear when viewing a device with any status other than "active."
|
||||||
|
|
||||||
|
As another example, if you wanted to show only devices belonging to a certain manufacturer, you could do something like this:
|
||||||
|
|
||||||
|
```jinja2
|
||||||
|
{% if obj.device_type.manufacturer.name == 'Cisco' %}View NMS{% endif %}
|
||||||
|
```
|
||||||
|
|
||||||
|
The link will only appear when viewing a device with a manufacturer name of "Cisco."
|
||||||
|
|
||||||
|
## Link Groups
|
||||||
|
|
||||||
|
Group names can be specified to organize links into groups. Links with the same group name will render as a dropdown menu beneath a single button bearing the name of the group.
|
37
docs/models/extras/exporttemplate.md
Normal file
37
docs/models/extras/exporttemplate.md
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
# Export Templates
|
||||||
|
|
||||||
|
NetBox allows users to define custom templates that can be used when exporting objects. To create an export template, navigate to Customization > Export Templates.
|
||||||
|
|
||||||
|
Each export template is associated with a certain type of object. For instance, if you create an export template for VLANs, your custom template will appear under the "Export" button on the VLANs list. Each export template must have a name, and may optionally designate a specific export [MIME type](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types) and/or file extension.
|
||||||
|
|
||||||
|
Export templates must be written in [Jinja2](https://jinja.palletsprojects.com/).
|
||||||
|
|
||||||
|
!!! note
|
||||||
|
The name `table` is reserved for internal use.
|
||||||
|
|
||||||
|
!!! warning
|
||||||
|
Export templates are rendered using user-submitted code, which may pose security risks under certain conditions. Only grant permission to create or modify export templates to trusted users.
|
||||||
|
|
||||||
|
The list of objects returned from the database when rendering an export template is stored in the `queryset` variable, which you'll typically want to iterate through using a `for` loop. Object properties can be access by name. For example:
|
||||||
|
|
||||||
|
```jinja2
|
||||||
|
{% for rack in queryset %}
|
||||||
|
Rack: {{ rack.name }}
|
||||||
|
Site: {{ rack.site.name }}
|
||||||
|
Height: {{ rack.u_height }}U
|
||||||
|
{% endfor %}
|
||||||
|
```
|
||||||
|
|
||||||
|
To access custom fields of an object within a template, use the `cf` attribute. For example, `{{ obj.cf.color }}` will return the value (if any) for a custom field named `color` on `obj`.
|
||||||
|
|
||||||
|
If you need to use the config context data in an export template, you'll should use the function `get_config_context` to get all the config context data. For example:
|
||||||
|
```
|
||||||
|
{% for server in queryset %}
|
||||||
|
{% set data = server.get_config_context() %}
|
||||||
|
{{ data.syslog }}
|
||||||
|
{% endfor %}
|
||||||
|
```
|
||||||
|
|
||||||
|
The `as_attachment` attribute of an export template controls its behavior when rendered. If true, the rendered content will be returned to the user as a downloadable file. If false, it will be displayed within the browser. (This may be handy e.g. for generating HTML content.)
|
||||||
|
|
||||||
|
A MIME type and file extension can optionally be defined for each export template. The default MIME type is `text/plain`.
|
82
docs/models/extras/webhook.md
Normal file
82
docs/models/extras/webhook.md
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
# Webhooks
|
||||||
|
|
||||||
|
A webhook is a mechanism for conveying to some external system a change that took place in NetBox. For example, you may want to notify a monitoring system whenever the status of a device is updated in NetBox. This can be done by creating a webhook for the device model in NetBox and identifying the webhook receiver. When NetBox detects a change to a device, an HTTP request containing the details of the change and who made it be sent to the specified receiver. Webhooks are managed under Logging > Webhooks.
|
||||||
|
|
||||||
|
!!! warning
|
||||||
|
Webhooks support the inclusion of user-submitted code to generate custom headers and payloads, which may pose security risks under certain conditions. Only grant permission to create or modify webhooks to trusted users.
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
* **Name** - A unique name for the webhook. The name is not included with outbound messages.
|
||||||
|
* **Object type(s)** - The type or types of NetBox object that will trigger the webhook.
|
||||||
|
* **Enabled** - If unchecked, the webhook will be inactive.
|
||||||
|
* **Events** - A webhook may trigger on any combination of create, update, and delete events. At least one event type must be selected.
|
||||||
|
* **HTTP method** - The type of HTTP request to send. Options include `GET`, `POST`, `PUT`, `PATCH`, and `DELETE`.
|
||||||
|
* **URL** - The fuly-qualified URL of the request to be sent. This may specify a destination port number if needed.
|
||||||
|
* **HTTP content type** - The value of the request's `Content-Type` header. (Defaults to `application/json`)
|
||||||
|
* **Additional headers** - Any additional headers to include with the request (optional). Add one header per line in the format `Name: Value`. Jinja2 templating is supported for this field (see below).
|
||||||
|
* **Body template** - The content of the request being sent (optional). Jinja2 templating is supported for this field (see below). If blank, NetBox will populate the request body with a raw dump of the webhook context. (If the HTTP cotent type is set to `application/json`, this will be formatted as a JSON object.)
|
||||||
|
* **Secret** - A secret string used to prove authenticity of the request (optional). This will append a `X-Hook-Signature` header to the request, consisting of a HMAC (SHA-512) hex digest of the request body using the secret as the key.
|
||||||
|
* **SSL verification** - Uncheck this option to disable validation of the receiver's SSL certificate. (Disable with caution!)
|
||||||
|
* **CA file path** - The file path to a particular certificate authority (CA) file to use when validating the receiver's SSL certificate (optional).
|
||||||
|
|
||||||
|
## Jinja2 Template Support
|
||||||
|
|
||||||
|
[Jinja2 templating](https://jinja.palletsprojects.com/) is supported for the `additional_headers` and `body_template` fields. This enables the user to convey object data in the request headers as well as to craft a customized request body. Request content can be crafted to enable the direct interaction with external systems by ensuring the outgoing message is in a format the receiver expects and understands.
|
||||||
|
|
||||||
|
For example, you might create a NetBox webhook to [trigger a Slack message](https://api.slack.com/messaging/webhooks) any time an IP address is created. You can accomplish this using the following configuration:
|
||||||
|
|
||||||
|
* Object type: IPAM > IP address
|
||||||
|
* HTTP method: `POST`
|
||||||
|
* URL: Slack incoming webhook URL
|
||||||
|
* HTTP content type: `application/json`
|
||||||
|
* Body template: `{"text": "IP address {{ data['address'] }} was created by {{ username }}!"}`
|
||||||
|
|
||||||
|
### Available Context
|
||||||
|
|
||||||
|
The following data is available as context for Jinja2 templates:
|
||||||
|
|
||||||
|
* `event` - The type of event which triggered the webhook: created, updated, or deleted.
|
||||||
|
* `model` - The NetBox model which triggered the change.
|
||||||
|
* `timestamp` - The time at which the event occurred (in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format).
|
||||||
|
* `username` - The name of the user account associated with the change.
|
||||||
|
* `request_id` - The unique request ID. This may be used to correlate multiple changes associated with a single request.
|
||||||
|
* `data` - A detailed representation of the object in its current state. This is typically equivalent to the model's representation in NetBox's REST API.
|
||||||
|
* `snapshots` - Minimal "snapshots" of the object state both before and after the change was made; provided ass a dictionary with keys named `prechange` and `postchange`. These are not as extensive as the fully serialized representation, but contain enough information to convey what has changed.
|
||||||
|
|
||||||
|
### Default Request Body
|
||||||
|
|
||||||
|
If no body template is specified, the request body will be populated with a JSON object containing the context data. For example, a newly created site might appear as follows:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"event": "created",
|
||||||
|
"timestamp": "2021-03-09 17:55:33.968016+00:00",
|
||||||
|
"model": "site",
|
||||||
|
"username": "jstretch",
|
||||||
|
"request_id": "fdbca812-3142-4783-b364-2e2bd5c16c6a",
|
||||||
|
"data": {
|
||||||
|
"id": 19,
|
||||||
|
"name": "Site 1",
|
||||||
|
"slug": "site-1",
|
||||||
|
"status":
|
||||||
|
"value": "active",
|
||||||
|
"label": "Active",
|
||||||
|
"id": 1
|
||||||
|
},
|
||||||
|
"region": null,
|
||||||
|
...
|
||||||
|
},
|
||||||
|
"snapshots": {
|
||||||
|
"prechange": null,
|
||||||
|
"postchange": {
|
||||||
|
"created": "2021-03-09",
|
||||||
|
"last_updated": "2021-03-09T17:55:33.851Z",
|
||||||
|
"name": "Site 1",
|
||||||
|
"slug": "site-1",
|
||||||
|
"status": "active",
|
||||||
|
...
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
@ -28,6 +28,7 @@
|
|||||||
* [#7360](https://github.com/netbox-community/netbox/issues/7360) - Correct redirection URL after removing child device from device bay
|
* [#7360](https://github.com/netbox-community/netbox/issues/7360) - Correct redirection URL after removing child device from device bay
|
||||||
* [#7365](https://github.com/netbox-community/netbox/issues/7365) - Optimize performance when calculating prefix utilization
|
* [#7365](https://github.com/netbox-community/netbox/issues/7365) - Optimize performance when calculating prefix utilization
|
||||||
* [#7374](https://github.com/netbox-community/netbox/issues/7374) - Add missing `face` parameter to API elevations request when editing device
|
* [#7374](https://github.com/netbox-community/netbox/issues/7374) - Add missing `face` parameter to API elevations request when editing device
|
||||||
|
* [#7392](https://github.com/netbox-community/netbox/issues/7392) - Fix "help" links for custom fields, other models
|
||||||
|
|
||||||
## v3.0.3 (2021-09-20)
|
## v3.0.3 (2021-09-20)
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user