-
-
Save candlerb/195ecd0fcc6aca6f7218d6e312dd0ee1 to your computer and use it in GitHub Desktop.
#!/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() |
@theAmberLion: can you show the full backtrace? In configuration.py either set EMAIL and ADMINS (in which case it will be emailed to you) or set DEBUG=True and copy-paste from the screen (as text).
I can't see how device
can be undefined anywhere inside the for loop.
Also, try running it like this:
PYTHONPATH=/opt/netbox/netbox /opt/netbox/venv/bin/python add-device-ports.py
(it might be that the wrong version of python3 has been picked up)
EDIT: I've adjusted the script so it can be run directly with chmod +x add-device-ports.py
then ./add-device-ports.py
Ah, i see...
So you run the script from CLI, ok.
From the CLI -the script is running and gets the job done.
But i can't place it in /scripts folder, can I?
Because when i do so, when i press Scripts in the GUI, the script is instantly executed (i checked twice), and yet after that GUI shows "No script found".
This script is not indented to be used from GUI, am i right?
Correct, this has not been modified to be a Netbox "custom script" which can be directly integrated into the web UI.
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)
Super-helpful script, thank you!