Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
26139cbb1c | ||
|
|
4ea315d4b2 | ||
|
|
40ae715eb5 | ||
|
|
204098a143 | ||
|
|
9b606643ea | ||
|
|
f184bdf2f3 | ||
|
|
370eff6b67 | ||
|
|
6d28ce2da4 | ||
|
|
8a97923bb2 | ||
|
|
7f0dcd97f7 | ||
|
|
0d7052d83d | ||
|
|
e50945f8b5 | ||
|
|
987aab772f |
@@ -1,7 +1,8 @@
|
|||||||
# Netbox Topology Views Plugin
|
# Netbox Topology Views Plugin
|
||||||
|
|
||||||
Create topology views/maps from your devices in netbox.
|
Create topology views/maps from your devices in netbox.
|
||||||
Support to filter on name, site and device role.
|
The connections are based on the cables you created in netbox.
|
||||||
|
Support to filter on name, site, tag and device role.
|
||||||
|
|
||||||
## Preview
|
## Preview
|
||||||
|
|
||||||
@@ -44,7 +45,7 @@ PLUGINS_CONFIG = {
|
|||||||
| allow_coordinates_saving | False | (bool) Set to true if you use the custom coordinates fields and want to save the coordinates |
|
| allow_coordinates_saving | False | (bool) Set to true if you use the custom coordinates fields and want to save the coordinates |
|
||||||
| ignore_cable_type | 'power outlet,power port' | The cable types that you want to ignore in the views |
|
| ignore_cable_type | 'power outlet,power port' | The cable types that you want to ignore in the views |
|
||||||
| preselected_tags | '' | The name of tags you want to preload |
|
| preselected_tags | '' | The name of tags you want to preload |
|
||||||
|
| enable_circuit_terminations | False | (bool) Set to true if you want to see circuit terminations in the topology |
|
||||||
|
|
||||||
### Custom Images
|
### Custom Images
|
||||||
|
|
||||||
@@ -62,4 +63,4 @@ Run `pip install netbox-topology-views --upgrade` in your venv.
|
|||||||
|
|
||||||
Run `python3 manage.py collectstatic --no-input`
|
Run `python3 manage.py collectstatic --no-input`
|
||||||
|
|
||||||
Clear you browser cache.
|
Clear your browser cache.
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ class TopologyViewsConfig(PluginConfig):
|
|||||||
name = 'netbox_topology_views'
|
name = 'netbox_topology_views'
|
||||||
verbose_name = 'Topology views'
|
verbose_name = 'Topology views'
|
||||||
description = 'An plugin to render toplogoy maps'
|
description = 'An plugin to render toplogoy maps'
|
||||||
version = '0.4.4'
|
version = '0.4.8'
|
||||||
author = 'Mattijs Vanhaverbeke'
|
author = 'Mattijs Vanhaverbeke'
|
||||||
author_email = 'author@example.com'
|
author_email = 'author@example.com'
|
||||||
base_url = 'topology-views'
|
base_url = 'topology-views'
|
||||||
@@ -14,7 +14,8 @@ class TopologyViewsConfig(PluginConfig):
|
|||||||
'ignore_cable_type': 'power outlet,power port',
|
'ignore_cable_type': 'power outlet,power port',
|
||||||
'device_img': 'access-switch,core-switch,firewall,router,distribution-switch,backup,storage,wan-network,wireless-ap,server,internal-switch,isp-cpe-material,non-racked-devices,power-units',
|
'device_img': 'access-switch,core-switch,firewall,router,distribution-switch,backup,storage,wan-network,wireless-ap,server,internal-switch,isp-cpe-material,non-racked-devices,power-units',
|
||||||
'allow_coordinates_saving': False,
|
'allow_coordinates_saving': False,
|
||||||
'preselected_tags' : ''
|
'preselected_tags' : '',
|
||||||
|
'enable_circuit_terminations': False
|
||||||
}
|
}
|
||||||
|
|
||||||
config = TopologyViewsConfig
|
config = TopologyViewsConfig
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ from django.conf import settings
|
|||||||
from utilities.api import IsAuthenticatedOrLoginNotRequired
|
from utilities.api import IsAuthenticatedOrLoginNotRequired
|
||||||
|
|
||||||
from dcim.models import DeviceRole, Device, Cable
|
from dcim.models import DeviceRole, Device, Cable
|
||||||
|
from circuits.models import Circuit
|
||||||
from extras.models import Tag, CustomField, CustomFieldValue
|
from extras.models import Tag, CustomField, CustomFieldValue
|
||||||
|
|
||||||
ignore_cable_type_raw = settings.PLUGINS_CONFIG["netbox_topology_views"]["ignore_cable_type"]
|
ignore_cable_type_raw = settings.PLUGINS_CONFIG["netbox_topology_views"]["ignore_cable_type"]
|
||||||
@@ -120,6 +121,7 @@ class SearchViewSet(GenericViewSet):
|
|||||||
edges = []
|
edges = []
|
||||||
edge_ids = 0
|
edge_ids = 0
|
||||||
cable_ids = []
|
cable_ids = []
|
||||||
|
circuit_ids = []
|
||||||
for device in devices:
|
for device in devices:
|
||||||
cables = device.get_cables()
|
cables = device.get_cables()
|
||||||
for cable in cables:
|
for cable in cables:
|
||||||
@@ -146,30 +148,98 @@ class SearchViewSet(GenericViewSet):
|
|||||||
edge["id"] = edge_ids
|
edge["id"] = edge_ids
|
||||||
edge["from"] = cable.termination_a.device.id
|
edge["from"] = cable.termination_a.device.id
|
||||||
edge["to"] = cable.termination_b.device.id
|
edge["to"] = cable.termination_b.device.id
|
||||||
edge["title"] = "Connection between <br> " + cable_a_dev_name + " [" + cable_a_name + "]<br>" + cable_b_dev_name + " [" + cable_b_name + "]"
|
edge["title"] = "Cable between <br> " + cable_a_dev_name + " [" + cable_a_name + "]<br>" + cable_b_dev_name + " [" + cable_b_name + "]"
|
||||||
|
if cable.color != "":
|
||||||
|
edge["color"] = "#" + cable.color
|
||||||
edges.append(edge)
|
edges.append(edge)
|
||||||
else:
|
else:
|
||||||
pass
|
if cable.termination_a_type.name == "circuit termination":
|
||||||
#circuittermination not supported for now
|
if settings.PLUGINS_CONFIG["netbox_topology_views"]["enable_circuit_terminations"]:
|
||||||
|
if cable.termination_a.circuit.id not in circuit_ids:
|
||||||
|
circuit_ids.append(cable.termination_a.circuit.id)
|
||||||
|
edge_ids += 1
|
||||||
|
|
||||||
|
cable_b_dev_name = cable.termination_b.device.name
|
||||||
|
if cable_b_dev_name is None:
|
||||||
|
cable_b_dev_name = "device B name unknown"
|
||||||
|
cable_b_name = cable.termination_b.name
|
||||||
|
if cable_b_name is None:
|
||||||
|
cable_b_name = "cable B name unknown"
|
||||||
|
|
||||||
|
edge = {}
|
||||||
|
edge["id"] = edge_ids
|
||||||
|
edge["to"] = cable.termination_b.device.id
|
||||||
|
edge["dashes"] = True
|
||||||
|
title = ""
|
||||||
|
|
||||||
|
title += "Circuit provider: " + cable.termination_a.circuit.provider.name + "<br>"
|
||||||
|
title += "Termination between <br>"
|
||||||
|
title += cable_b_dev_name + " [" + cable_b_name + "]<br>"
|
||||||
|
# To Many if's
|
||||||
|
if cable.termination_a.circuit.termination_a is not None:
|
||||||
|
if cable.termination_a.circuit.termination_a.cable is not None:
|
||||||
|
if cable.termination_a.circuit.termination_a.cable.id != cable.id:
|
||||||
|
if cable.termination_a.circuit.termination_a.cable.termination_b is not None:
|
||||||
|
if cable.termination_a.circuit.termination_a.cable.termination_b.device is not None:
|
||||||
|
edge["from"] = cable.termination_a.circuit.termination_a.cable.termination_b.device.id
|
||||||
|
|
||||||
|
cable_a_dev_name = cable.termination_a.circuit.termination_a.cable.termination_b.device.name
|
||||||
|
if cable_a_dev_name is None:
|
||||||
|
cable_a_dev_name = "device B name unknown"
|
||||||
|
cable_b_name = cable.termination_a.circuit.termination_a.cable.termination_b.name
|
||||||
|
if cable_a_name is None:
|
||||||
|
cable_a_name = "cable B name unknown"
|
||||||
|
title += cable_a_dev_name + " [" + cable_a_name + "]<br>"
|
||||||
|
edge["title"] = title
|
||||||
|
edges.append(edge)
|
||||||
|
# To Many if's
|
||||||
|
if cable.termination_a.circuit.termination_z is not None:
|
||||||
|
if cable.termination_a.circuit.termination_z.cable is not None:
|
||||||
|
if cable.termination_a.circuit.termination_z.cable.id != cable.id:
|
||||||
|
if cable.termination_a.circuit.termination_z.cable.termination_b is not None:
|
||||||
|
if cable.termination_a.circuit.termination_z.cable.termination_b.device is not None:
|
||||||
|
edge["from"] = cable.termination_a.circuit.termination_z.cable.termination_b.device.id
|
||||||
|
|
||||||
|
cable_a_dev_name = cable.termination_a.circuit.termination_z.cable.termination_b.device.name
|
||||||
|
if cable_a_dev_name is None:
|
||||||
|
cable_a_dev_name = "device B name unknown"
|
||||||
|
cable_a_name = cable.termination_a.circuit.termination_z.cable.termination_b.name
|
||||||
|
if cable_a_name is None:
|
||||||
|
cable_a_name = "cable B name unknown"
|
||||||
|
title += cable_a_dev_name + " [" + cable_a_name + "]<br>"
|
||||||
|
edge["title"] = title
|
||||||
|
edges.append(edge)
|
||||||
dev_name = device.name
|
dev_name = device.name
|
||||||
if dev_name is None:
|
if dev_name is None:
|
||||||
dev_name = "device name unknown"
|
dev_name = "device name unknown"
|
||||||
|
|
||||||
cable_role_name = device.device_type.display_name
|
node_content = ""
|
||||||
if cable_role_name is None:
|
|
||||||
cable_role_name = "device role name unknown"
|
if device.device_type.display_name is not None:
|
||||||
|
node_content += "<tr><th>Type: </th><td>" + device.device_type.display_name + "</td></tr>"
|
||||||
|
if device.device_role.name is not None:
|
||||||
|
node_content += "<tr><th>Role: </th><td>" + device.device_role.name + "</td></tr>"
|
||||||
|
if device.serial != "":
|
||||||
|
node_content += "<tr><th>Serial: </th><td>" + device.serial + "</td></tr>"
|
||||||
|
if device.primary_ip is not None:
|
||||||
|
node_content += "<tr><th>IP Address: </th><td>" + str(device.primary_ip.address) + "</td></tr>"
|
||||||
|
|
||||||
|
dev_title = "<table> %s </table>" % (node_content)
|
||||||
|
|
||||||
node = {}
|
node = {}
|
||||||
node["id"] = device.id
|
node["id"] = device.id
|
||||||
node["name"] = dev_name
|
node["name"] = dev_name
|
||||||
node["label"] = dev_name + " {" + cable_role_name + "}"
|
node["label"] = dev_name
|
||||||
|
node["title"] = dev_title
|
||||||
node["shape"] = 'image'
|
node["shape"] = 'image'
|
||||||
if device.device_role.slug in settings.PLUGINS_CONFIG["netbox_topology_views"]["device_img"]:
|
if device.device_role.slug in settings.PLUGINS_CONFIG["netbox_topology_views"]["device_img"]:
|
||||||
node["image"] = '../../static/netbox_topology_views/img/' + device.device_role.slug + ".png"
|
node["image"] = '../../static/netbox_topology_views/img/' + device.device_role.slug + ".png"
|
||||||
else:
|
else:
|
||||||
node["image"] = "../../static/netbox_topology_views/img/role-unknown.png"
|
node["image"] = "../../static/netbox_topology_views/img/role-unknown.png"
|
||||||
|
|
||||||
|
if device.device_role.color != "":
|
||||||
|
node["color.border"] = "#" + device.device_role.color
|
||||||
|
|
||||||
for device_custom_field in device.custom_field_values.all():
|
for device_custom_field in device.custom_field_values.all():
|
||||||
if device_custom_field.field.name == "coordinates":
|
if device_custom_field.field.name == "coordinates":
|
||||||
cords = device_custom_field.serialized_value.split(";")
|
cords = device_custom_field.serialized_value.split(";")
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"private": true,
|
"private": true,
|
||||||
"name": "netbox_topology_views",
|
"name": "netbox_topology_views",
|
||||||
"version": "0.4.4",
|
"version": "0.4.8",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"resources": "gulp build",
|
"resources": "gulp build",
|
||||||
"resources_dev": "gulp build_dev"
|
"resources_dev": "gulp build_dev"
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ from setuptools import setup, find_packages
|
|||||||
|
|
||||||
setup(
|
setup(
|
||||||
name='netbox-topology-views',
|
name='netbox-topology-views',
|
||||||
version='0.4.4',
|
version='0.4.8',
|
||||||
description='An NetBox plugin to create Topology maps',
|
description='An NetBox plugin to create Topology maps',
|
||||||
url='https://github.com/mattieserver/netbox-topology-views',
|
url='https://github.com/mattieserver/netbox-topology-views',
|
||||||
author='Mattijs Vanhaverbeke',
|
author='Mattijs Vanhaverbeke',
|
||||||
|
|||||||
Reference in New Issue
Block a user