Last active
June 24, 2023 14:38
-
-
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 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() |
Correct, this has not been modified to be a Netbox "custom script" which can be directly integrated into the web UI.
OK. Great script tho. Saved me from a lot of hassle.
Do you plan to write one for UI? Would be great.
Yes, this is done, and contributed to the public "reports" repository. See:
- https://github.com/netbox-community/reports/blob/master/scripts/add_device_type_components.py
- https://github.com/netbox-community/reports/blob/master/reports/dcim-reports/missing_device_type_components.py
(for safety the update script asks you to select the device(s) to update, rather than blindly updating all devices)
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Correct, this has not been modified to be a Netbox "custom script" which can be directly integrated into the web UI.