Last active
March 30, 2025 12:37
-
-
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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() |
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
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