Add script to replace a device
Used for instance to upgrade or replace classroom PCs.
This commit is contained in:
parent
80f2a9f8d7
commit
edb570b63d
62
devices.py
Normal file
62
devices.py
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
from dcim.models import Device
|
||||||
|
from extras.scripts import Script, ObjectVar
|
||||||
|
|
||||||
|
class ReplaceDevice(Script):
|
||||||
|
'''
|
||||||
|
Replace a device with another. Used for instance to upgrade classroom PCs.
|
||||||
|
This renames the new device, switches existing primary IPs from the old device to it and sets it active.
|
||||||
|
The old device is unnamed and set as inventory.
|
||||||
|
'''
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
name = 'Replace device'
|
||||||
|
description = 'Replace a device with another, preserving the name and primary IPs'
|
||||||
|
commit_default = False
|
||||||
|
scheduling_enabled = False
|
||||||
|
|
||||||
|
old = ObjectVar(model=Device, label='Old device')
|
||||||
|
new = ObjectVar(model=Device, label='New device')
|
||||||
|
|
||||||
|
def run(self, data, commit):
|
||||||
|
old = data['old']
|
||||||
|
new = data['new']
|
||||||
|
|
||||||
|
new.name = old.name
|
||||||
|
new.status = 'active'
|
||||||
|
|
||||||
|
old.name = None
|
||||||
|
if old.status == 'active': # could be failed
|
||||||
|
old.status = 'inventory'
|
||||||
|
|
||||||
|
if ip4 := old.primary_ip4:
|
||||||
|
old.primary_ip4 = None
|
||||||
|
old.full_clean()
|
||||||
|
old.save()
|
||||||
|
|
||||||
|
old_iface = ip4.interface.get()
|
||||||
|
new_iface = new.interfaces.get(name=old_iface.name)
|
||||||
|
ip4.assigned_object = new_iface
|
||||||
|
ip4.full_clean()
|
||||||
|
ip4.save()
|
||||||
|
|
||||||
|
new.primary_ip4 = ip4
|
||||||
|
self.log_info(f'set {ip4} as primary IP for new {new.name} ({new.asset_tag})')
|
||||||
|
|
||||||
|
if ip6 := old.primary_ip6:
|
||||||
|
old.primary_ip6 = None
|
||||||
|
old.full_clean()
|
||||||
|
old.save()
|
||||||
|
|
||||||
|
old_iface = ip6.interface.get()
|
||||||
|
new_iface = new.interfaces.get(name=old_iface.name)
|
||||||
|
ip6.assigned_object = new_iface
|
||||||
|
ip6.full_clean()
|
||||||
|
ip6.save()
|
||||||
|
|
||||||
|
new.primary_ip6 = ip6
|
||||||
|
self.log_info(f'set {ip6} as primary IP for new {new.name} ({new.asset_tag})')
|
||||||
|
|
||||||
|
new.full_clean()
|
||||||
|
new.save()
|
||||||
|
|
||||||
|
self.log_success(f'replaced device {new.name}: {old.asset_tag} → {new.asset_tag}')
|
Loading…
Reference in a new issue