Skip to content

Instantly share code, notes, and snippets.

@candlerb
Last active March 30, 2025 12:37
Show Gist options
  • Save candlerb/195ecd0fcc6aca6f7218d6e312dd0ee1 to your computer and use it in GitHub Desktop.
Save candlerb/195ecd0fcc6aca6f7218d6e312dd0ee1 to your computer and use it in GitHub Desktop.
Netbox script to add missing components from Device Type to all instances of Device
#!/opt/netbox/venv/bin/python
import django
import os
import sys
sys.path.append('/opt/netbox/netbox')
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'netbox.settings')
django.setup()
from dcim.models import Device, ConsolePort, ConsoleServerPort, PowerPort, PowerOutlet, Interface, RearPort, FrontPort, DeviceBay
from django.db import transaction
transaction.set_autocommit(False)
for device in Device.objects.all():
# Based on Device.save()
ConsolePort.objects.bulk_create(
[ConsolePort(device=device, name=template.name) for template in
device.device_type.consoleporttemplates.all()
if template.name not in {i.name for i in device.consoleports.all()}]
)
ConsoleServerPort.objects.bulk_create(
[ConsoleServerPort(device=device, name=template.name) for template in
device.device_type.consoleserverporttemplates.all()
if template.name not in {i.name for i in device.consoleserverports.all()}]
)
PowerPort.objects.bulk_create(
[PowerPort(device=device, name=template.name) for template in
device.device_type.powerporttemplates.all()
if template.name not in {i.name for i in device.powerports.all()}]
)
PowerOutlet.objects.bulk_create(
[PowerOutlet(device=device, name=template.name) for template in
device.device_type.poweroutlettemplates.all()
if template.name not in {i.name for i in device.poweroutlets.all()}]
)
Interface.objects.bulk_create(
[Interface(device=device, name=template.name, type=template.type,
mgmt_only=template.mgmt_only) for template in device.device_type.interfacetemplates.all()
if template.name not in {i.name for i in device.interfaces.all()}]
)
RearPort.objects.bulk_create([
RearPort(
device=device,
name=template.name,
type=template.type,
positions=template.positions
) for template in device.device_type.rearporttemplates.all()
if template.name not in {i.name for i in device.rearports.all()}
])
FrontPort.objects.bulk_create([
FrontPort(
device=device,
name=template.name,
type=template.type,
rear_port=RearPort.objects.get(device=device, name=template.rear_port.name),
rear_port_position=template.rear_port_position,
) for template in device.device_type.frontporttemplates.all()
if template.name not in {i.name for i in device.frontports.all()}
])
DeviceBay.objects.bulk_create(
[DeviceBay(device=device, name=template.name) for template in
device.device_type.devicebaytemplates.all()
if template.name not in {i.name for i in device.devicebays.all()}]
)
#transaction.rollback()
transaction.commit()
@candlerb
Copy link
Author

It should handle power ports and console ports from the device type. Are you using the latest version of this script?

The latest version is in git:
https://github.com/netbox-community/customizations/blob/master/scripts/add_device_type_components.py
But there is an outstanding pull request which hasn't been applied:
netbox-community/customizations#101

@CelticWebSolutions
Copy link

Yes, using latest version from there. There are no errors, it just doesn't add the ports for some reason. No debug error, so I can't say why it's not doing it unfortunately. Just added your updated save part instead of the bulk code, same thing, doesn't add the console or the power ports unfortunately. admittedly I'm more interested in the network interfaces, so I'm over the moon that that's worked, I can't see why the other ports don't add though.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment