def import_links(self): self.verbose('retrieving links from old mysql DB...') self.old_links = list(OldLink.objects.all()) self.message('retrieved %d links' % len(self.old_links)) saved_links = [] for old_link in self.old_links: skip = False try: interface_a = Interface.objects.get(pk=old_link.from_interface_id) if interface_a.type != INTERFACE_TYPES.get('wireless'): interface_a.type = INTERFACE_TYPES.get('wireless') interface_a.save() except Interface.DoesNotExist: self.message('Interface #%s does not exist, probably link #%s is orphan!' % (old_link.from_interface_id, old_link.id)) skip = True try: interface_b = Interface.objects.get(pk=old_link.to_interface_id) if interface_b.type != INTERFACE_TYPES.get('wireless'): interface_b.type = INTERFACE_TYPES.get('wireless') interface_b.save() except Interface.DoesNotExist: self.message('Interface #%s does not exist, probably link #%s is orphan!' % (old_link.to_interface_id, old_link.id)) skip = True if skip: self.verbose('Skipping to next cycle') continue old_bandwidth = [old_link.sync_tx, old_link.sync_rx] link = Link(**{ "id": old_link.id, "interface_a": interface_a, "interface_b": interface_b, "status": LINK_STATUS.get('active'), "type": LINK_TYPES.get('radio'), "metric_type": 'etx', "metric_value": old_link.etx, "dbm": old_link.dbm, "min_rate": min(old_bandwidth), "max_rate": max(old_bandwidth), }) if old_link.hide: link.access_level = 3 try: link.full_clean() link.save() saved_links.append(link) self.verbose('Saved link %s' % link) except Exception as e: self.message('Could not save link %s, got exception: %s' % (old_link.id, e)) self.message('saved %d links into local DB' % len(saved_links)) self.saved_links = saved_links
def save(self, *args, **kwargs): """ Custom save does the following: * determine link type if not specified * automatically fill 'node_a' and 'node_b' fields if necessary * draw line between two nodes * fill shortcut properties node_a_name and node_b_name """ if not self.type: if self.interface_a.type == INTERFACE_TYPES.get('wireless'): self.type = LINK_TYPES.get('radio') elif self.interface_a.type == INTERFACE_TYPES.get('ethernet'): self.type = LINK_TYPES.get('ethernet') else: self.type = LINK_TYPES.get('virtual') if self.interface_a_id: self.interface_a = Interface.objects.get(pk=self.interface_a_id) if self.interface_b_id: self.interface_b = Interface.objects.get(pk=self.interface_b_id) # fill in node_a and node_b if self.node_a is None and self.interface_a is not None: self.node_a = self.interface_a.node if self.node_b is None and self.interface_b is not None: self.node_b = self.interface_b.node # fill layer from node_a if self.layer is None: self.layer = self.node_a.layer # draw linestring if not self.line: self.line = LineString(self.node_a.point, self.node_b.point) # fill properties if self.data is None or self.data.get('node_a_name', None) is None: self.data = self.data or {} # in case is None init empty dict self.data['node_a_name'] = self.node_a.name self.data['node_b_name'] = self.node_b.name if self.data.get('node_a_slug', None) is None or self.data.get( 'node_b_slug', None) is None: self.data['node_a_slug'] = self.node_a.slug self.data['node_b_slug'] = self.node_b.slug if self.data.get('interface_a_mac', None) is None or self.data.get( 'interface_b_mac', None) is None: self.data['interface_a_mac'] = self.interface_a.mac self.data['interface_b_mac'] = self.interface_b.mac if self.data.get('layer_slug') != self.layer.slug: self.data['layer_slug'] = self.layer.slug super(Link, self).save(*args, **kwargs)
def save(self, *args, **kwargs): """ Custom save does the following: * determine link type if not specified * automatically fill 'node_a' and 'node_b' fields if necessary * draw line between two nodes * fill shortcut properties node_a_name and node_b_name """ if not self.type: if self.interface_a.type == INTERFACE_TYPES.get('wireless'): self.type = LINK_TYPES.get('radio') elif self.interface_a.type == INTERFACE_TYPES.get('ethernet'): self.type = LINK_TYPES.get('ethernet') else: self.type = LINK_TYPES.get('virtual') if self.interface_a_id: self.interface_a = Interface.objects.get(pk=self.interface_a_id) if self.interface_b_id: self.interface_b = Interface.objects.get(pk=self.interface_b_id) # fill in node_a and node_b if self.node_a is None and self.interface_a is not None: self.node_a = self.interface_a.node if self.node_b is None and self.interface_b is not None: self.node_b = self.interface_b.node # fill layer from node_a if self.layer is None: self.layer = self.node_a.layer # draw linestring if not self.line: self.line = LineString(self.node_a.point, self.node_b.point) # fill properties if self.data.get('node_a_name', None) is None: self.data['node_a_name'] = self.node_a.name self.data['node_b_name'] = self.node_b.name if self.data.get('node_a_slug', None) is None or self.data.get('node_b_slug', None) is None: self.data['node_a_slug'] = self.node_a.slug self.data['node_b_slug'] = self.node_b.slug if self.interface_a and self.data.get('interface_a_mac', None) is None: self.data['interface_a_mac'] = self.interface_a.mac if self.interface_b and self.data.get('interface_b_mac', None) is None: self.data['interface_b_mac'] = self.interface_b.mac if self.data.get('layer_slug') != self.layer.slug: self.data['layer_slug'] = self.layer.slug super(Link, self).save(*args, **kwargs)
def save(self, *args, **kwargs): """ automatically set Interface.type to bridge """ self.type = INTERFACE_TYPES.get("bridge") super(Bridge, self).save(*args, **kwargs)
def save(self, *args, **kwargs): """ automatically set Interface.type to bridge """ self.type = INTERFACE_TYPES.get('bridge') super(Bridge, self).save(*args, **kwargs)
def save_interfaces(self): added_interfaces = [] deleted_interfaces = [] cnml_interfaces = self.cnml.getInterfaces() current_interfaces = Interface.objects.filter(data__contains=['cnml_id'], device__node__layer=self.layer) total_n = len(cnml_interfaces) for n, cnml_interface in enumerate(cnml_interfaces, 1): self.verbose('[%d/%d] parsing interface "%s" (%s)' % (n, total_n, cnml_interface.id, cnml_interface.ipv4)) if hasattr(cnml_interface.parentRadio, 'parentDevice'): Model = Wireless else: Model = Ethernet try: interface = Model.objects.get(data={'cnml_id': cnml_interface.id}) added = False except Model.DoesNotExist: interface = Model() added = True if Model is Wireless: parent = cnml_interface.parentRadio.parentDevice.id else: parent = cnml_interface.parentRadio.id interface.duplex = 'full' interface.standard = 'fast' device = Device.objects.get(data={'cnml_id': parent}) interface.type = INTERFACE_TYPES.get(Model.__name__.lower()) interface.device = device interface.data['cnml_id'] = cnml_interface.id interface.full_clean() interface.save() if cnml_interface.ipv4: # in CNML interfaces have always only 1 IP try: ip = Ip.objects.get(address=cnml_interface.ipv4) except Ip.DoesNotExist: ip = Ip() ip.interface = interface ip.address = cnml_interface.ipv4 ip.netmask = cnml_interface.mask ip.full_clean() ip.save() if added: added_interfaces.append(interface) # delete interfaces that are not in CNML anymore total_n = len(current_interfaces) for n, current_interface in enumerate(current_interfaces, 1): self.verbose('[%d/%d] deleting old interfaces' % (n, total_n)) try: self.cnml.getInterface(int(current_interface.data['cnml_id'])) except KeyError: deleted_interfaces.append(current_interface) current_interface.delete() self.message += """ %s interfaces added %s interfaces deleted """ % ( len(added_interfaces), len(deleted_interfaces) )
def save(self, *args, **kwargs): """ automatically set Interface.type to ethernet """ self.type = INTERFACE_TYPES.get('ethernet') super(Ethernet, self).save(*args, **kwargs)
def save(self, *args, **kwargs): """ automatically set Interface.type to wireless """ self.type = INTERFACE_TYPES.get('wireless') super(Wireless, self).save(*args, **kwargs)
def save(self, *args, **kwargs): """ automatically set Interface.type to virtual """ self.type = INTERFACE_TYPES.get('virtual') super(Vlan, self).save(*args, **kwargs)
def save(self, *args, **kwargs): """ automatically set Interface.type to tunnel """ self.type = INTERFACE_TYPES.get('tunnel') super(Tunnel, self).save(*args, **kwargs)
def import_interfaces(self): self.verbose('retrieving interfaces from old mysql DB...') self.old_interfaces = list(OldInterface.objects.all()) self.message('retrieved %d interfaces' % len(self.old_interfaces)) saved_interfaces = [] saved_vaps = [] saved_ipv4 = [] saved_ipv6 = [] for old_interface in self.old_interfaces: interface_dict = { "id": old_interface.id, "device_id": int(old_interface.device_id), "mac": old_interface.mac_address, "name": old_interface.cname[0:10], "added": old_interface.added, "updated": old_interface.updated, "data": {} } vap = None ipv4 = None ipv6 = None # determine interface type and specific fields if old_interface.type == 'eth': interface_dict['standard'] = 'fast' interface_dict['duplex'] = 'full' InterfaceModel = Ethernet elif old_interface.type == 'wifi': interface_dict['mode'] = old_interface.wireless_mode interface_dict['channel'] = old_interface.wireless_channel InterfaceModel = Wireless # determine ssid if old_interface.essid or old_interface.bssid: vap = Vap(**{ "interface_id": old_interface.id, "essid": old_interface.essid, "bssid": old_interface.bssid }) # if vap already exists flag it for UPDATE instead of INSERT try: v = Vap.objects.get( Q(interface_id=old_interface.id) & ( Q(essid=old_interface.essid) | Q(bssid=old_interface.bssid) ) ) # trick to make django do an update query instead of an insert # working on django 1.6 vap.id = v.id vap._state.adding = False except Vap.DoesNotExist: pass if old_interface.essid: interface_dict['data']['essid'] = old_interface.essid if old_interface.bssid: interface_dict['data']['bssid'] = old_interface.bssid elif old_interface.type == 'bridge': InterfaceModel = Bridge elif old_interface.type == 'vpn': InterfaceModel = Tunnel else: interface_dict['type'] = INTERFACE_TYPES.get('virtual') interface_dict['data']['old_nodeshot_interface_type'] = old_interface.get_type_display() InterfaceModel = Interface interface = InterfaceModel(**interface_dict) # if interface already exists flag it for UPDATE instead of INSERT try: InterfaceModel.objects.get(pk=old_interface.id) interface._state.adding = False except InterfaceModel.DoesNotExist: pass if old_interface.ipv4_address: old_interface.ipv4_address = old_interface.ipv4_address.strip() # stupid django bug ipv4 = Ip(**{ "interface_id": old_interface.id, "address": old_interface.ipv4_address }) # if ip already exists flag it for UPDATE instead of INSERT try: ipv4.id = Ip.objects.get(address=old_interface.ipv4_address).id ipv4._state.adding = False except Ip.DoesNotExist: pass # ensure ipv4 is valid try: ip.IPAddress(old_interface.ipv4_address) except (ip.AddrFormatError, ValueError): self.message('Invalid IPv4 address %s' % (old_interface.ipv4_address)) ipv4 = None if old_interface.ipv6_address: old_interface.ipv6_address = old_interface.ipv6_address.strip() # stupid django bug ipv6 = Ip(**{ "interface_id": old_interface.id, "address": old_interface.ipv6_address }) # if ip already exists flag it for UPDATE instead of INSERT try: ipv6.id = Ip.objects.get(address=old_interface.ipv6_address).id ipv6._state.adding = False except Ip.DoesNotExist: pass # ensure ipv6 is valid try: ip.IPAddress(old_interface.ipv6_address) except (ip.AddrFormatError, ValueError): self.message('Invalid IPv6 address %s' % (old_interface.ipv6_address)) ipv6 = None try: interface.full_clean() interface.save(auto_update=False) saved_interfaces.append(interface) self.verbose('Saved interface %s' % interface.name) except Exception: tb = traceback.format_exc() self.message('Could not save interface %s, got exception:\n\n%s' % (interface.mac, tb)) continue if vap: try: vap.full_clean() vap.save() saved_vaps.append(vap) self.verbose('Saved vap %s' % vap.essid or vap.bssid) except Exception: tb = traceback.format_exc() self.message('Could not save vap %s, got exception:\n\n%s' % (vap.essid or vap.bssid, tb)) if ipv4: try: ipv4.full_clean() ipv4.save() saved_ipv4.append(ipv4) self.verbose('Saved ipv4 %s' % ipv4.address) except Exception: tb = traceback.format_exc() self.message('Could not save ipv4 %s, got exception:\n\n%s' % (ipv4.address, tb)) if ipv6: try: ipv6.full_clean() ipv6.save() saved_ipv6.append(ipv6) self.verbose('Saved ipv6 %s' % ipv6.address) except Exception: tb = traceback.format_exc() self.message('Could not save ipv6 %s, got exception:\n\n%s' % (ipv6.address, tb)) self.message('saved %d interfaces into local DB' % len(saved_interfaces)) self.message('saved %d vaps into local DB' % len(saved_vaps)) self.message('saved %d ipv4 addresses into local DB' % len(saved_ipv4)) self.message('saved %d ipv6 addresses into local DB' % len(saved_ipv6)) self.saved_interfaces = saved_interfaces self.saved_vaps = saved_vaps self.saved_ipv4 = saved_ipv4 self.saved_ipv6 = saved_ipv6
def import_interfaces(self): self.verbose('retrieving interfaces from old mysql DB...') self.old_interfaces = list(OldInterface.objects.all()) self.message('retrieved %d interfaces' % len(self.old_interfaces)) saved_interfaces = [] saved_vaps = [] saved_ipv4 = [] saved_ipv6 = [] for old_interface in self.old_interfaces: interface_dict = { "id": old_interface.id, "device_id": int(old_interface.device_id), "mac": old_interface.mac_address, "name": old_interface.cname[0:10], "added": old_interface.added, "updated": old_interface.updated, "data": {} } vap = None ipv4 = None ipv6 = None # determine interface type and specific fields if old_interface.type == 'eth': interface_dict['standard'] = 'fast' interface_dict['duplex'] = 'full' InterfaceModel = Ethernet elif old_interface.type == 'wifi': interface_dict['mode'] = old_interface.wireless_mode interface_dict['channel'] = old_interface.wireless_channel InterfaceModel = Wireless # determine ssid if old_interface.essid or old_interface.bssid: vap = Vap(**{ "interface_id": old_interface.id, "essid": old_interface.essid, "bssid": old_interface.essid }) if old_interface.essid: interface_dict['data']['essid'] = old_interface.essid if old_interface.bssid: interface_dict['data']['bssid'] = old_interface.bssid elif old_interface.type == 'bridge': InterfaceModel = Bridge elif old_interface.type == 'vpn': InterfaceModel = Tunnel else: interface_dict['type'] = INTERFACE_TYPES.get('virtual') interface_dict['data']['old_nodeshot_interface_type'] = old_interface.get_type_display() InterfaceModel = Interface interface = InterfaceModel(**interface_dict) if old_interface.ipv4_address: old_interface.ipv4_address = old_interface.ipv4_address.strip() # stupid django bug ipv4 = Ip(**{ "interface_id": old_interface.id, "address": old_interface.ipv4_address }) # ensure ipv4 is valid try: ip.IPAddress(old_interface.ipv4_address) except (ip.AddrFormatError, ValueError): self.message('Invalid IPv4 address %s' % (old_interface.ipv4_address)) ipv4 = None if old_interface.ipv6_address: old_interface.ipv6_address = old_interface.ipv6_address.strip() # stupid django bug ipv6 = Ip(**{ "interface_id": old_interface.id, "address": old_interface.ipv6_address }) # ensure ipv6 is valid try: ip.IPAddress(old_interface.ipv6_address) except (ip.AddrFormatError, ValueError): self.message('Invalid IPv6 address %s' % (old_interface.ipv6_address)) ipv6 = None try: interface.full_clean() interface.save(auto_update=False) saved_interfaces.append(interface) self.verbose('Saved interface %s' % interface.name) except Exception as e: self.message('Could not save interface %s, got exception: %s' % (interface.mac, e)) continue if vap: try: vap.full_clean() vap.save() saved_vaps.append(vap) self.verbose('Saved vap %s' % vap.essid or vap.bssid) except Exception as e: self.message('Could not save vap %s, got exception: %s' % (vap.essid or vap.bssid, e)) if ipv4: try: ipv4.full_clean() ipv4.save() saved_ipv4.append(ipv4) self.verbose('Saved ipv4 %s' % ipv4.address) except Exception as e: self.message('Could not save ipv4 %s, got exception: %s' % (ipv4.address, e)) if ipv6: try: ipv6.full_clean() ipv6.save() saved_ipv6.append(ipv6) self.verbose('Saved ipv6 %s' % ipv6.address) except Exception as e: self.message('Could not save ipv6 %s, got exception: %s' % (ipv6.address, e)) self.message('saved %d interfaces into local DB' % len(saved_interfaces)) self.message('saved %d vaps into local DB' % len(saved_vaps)) self.message('saved %d ipv4 addresses into local DB' % len(saved_ipv4)) self.message('saved %d ipv6 addresses into local DB' % len(saved_ipv6)) self.saved_interfaces = saved_interfaces self.saved_vaps = saved_vaps self.saved_ipv4 = saved_ipv4 self.saved_ipv6 = saved_ipv6
def save_interfaces(self): added_interfaces = [] deleted_interfaces = [] cnml_interfaces = self.cnml.getInterfaces() current_interfaces = Interface.objects.filter( data__contains=['cnml_id'], device__node__layer=self.layer) total_n = len(cnml_interfaces) for n, cnml_interface in enumerate(cnml_interfaces, 1): self.verbose('[%d/%d] parsing interface "%s" (%s)' % (n, total_n, cnml_interface.id, cnml_interface.ipv4)) if hasattr(cnml_interface.parentRadio, 'parentDevice'): Model = Wireless else: Model = Ethernet try: interface = Model.objects.get( data={'cnml_id': cnml_interface.id}) added = False except Model.DoesNotExist: interface = Model() added = True if Model is Wireless: parent = cnml_interface.parentRadio.parentDevice.id else: parent = cnml_interface.parentRadio.id interface.duplex = 'full' interface.standard = 'fast' device = Device.objects.get(data={'cnml_id': parent}) interface.type = INTERFACE_TYPES.get(Model.__name__.lower()) interface.device = device interface.data['cnml_id'] = cnml_interface.id interface.full_clean() interface.save() if cnml_interface.ipv4: # in CNML interfaces have always only 1 IP try: ip = Ip.objects.get(address=cnml_interface.ipv4) except Ip.DoesNotExist: ip = Ip() ip.interface = interface ip.address = cnml_interface.ipv4 ip.netmask = cnml_interface.mask ip.full_clean() ip.save() if added: added_interfaces.append(interface) # delete interfaces that are not in CNML anymore total_n = len(current_interfaces) for n, current_interface in enumerate(current_interfaces, 1): self.verbose('[%d/%d] deleting old interfaces' % (n, total_n)) try: self.cnml.getInterface(int(current_interface.data['cnml_id'])) except KeyError: deleted_interfaces.append(current_interface) current_interface.delete() self.message += """ %s interfaces added %s interfaces deleted """ % (len(added_interfaces), len(deleted_interfaces))
def import_links(self): if not IMPORT_LINKS: self.message('skpped import_links because NODESHOT_OLDIMPORTER_IMPORT_LINKS is set to False') return self.verbose('retrieving links from old mysql DB...') self.old_links = list(OldLink.objects.all()) self.message('retrieved %d links' % len(self.old_links)) saved_links = [] for old_link in self.old_links: skip = False try: interface_a = Interface.objects.get(pk=old_link.from_interface_id) if interface_a.type != INTERFACE_TYPES.get('wireless'): interface_a.type = INTERFACE_TYPES.get('wireless') interface_a.save() except Interface.DoesNotExist: self.message('Interface #%s does not exist, probably link #%s is orphan!' % (old_link.from_interface_id, old_link.id)) skip = True try: interface_b = Interface.objects.get(pk=old_link.to_interface_id) if interface_b.type != INTERFACE_TYPES.get('wireless'): interface_b.type = INTERFACE_TYPES.get('wireless') interface_b.save() except Interface.DoesNotExist: self.message('Interface #%s does not exist, probably link #%s is orphan!' % (old_link.to_interface_id, old_link.id)) skip = True if skip: self.verbose('Skipping to next cycle') continue old_bandwidth = [old_link.sync_tx, old_link.sync_rx] link = Link(**{ "id": old_link.id, "interface_a": interface_a, "interface_b": interface_b, "status": LINK_STATUS.get('active'), "type": LINK_TYPES.get('radio'), "metric_type": 'etx', "metric_value": old_link.etx, "dbm": old_link.dbm, "min_rate": min(old_bandwidth), "max_rate": max(old_bandwidth), "data": { "imported": "true" } }) # if link already exists flag it for UPDATE instead of INSERT try: Link.objects.get(pk=old_link.id) link._state.adding = False except Link.DoesNotExist: pass if old_link.hide: link.access_level = 3 try: link.full_clean() link.save() saved_links.append(link) self.verbose('Saved link %s' % link) except Exception: tb = traceback.format_exc() self.message('Could not save link %s, got exception:\n\n%s' % (old_link.id, tb)) self.message('saved %d links into local DB' % len(saved_links)) self.saved_links = saved_links
def import_interfaces(self): self.verbose('retrieving interfaces from old mysql DB...') self.old_interfaces = list(OldInterface.objects.all()) self.message('retrieved %d interfaces' % len(self.old_interfaces)) saved_interfaces = [] saved_vaps = [] saved_ipv4 = [] saved_ipv6 = [] for old_interface in self.old_interfaces: interface_dict = { "id": old_interface.id, "device_id": int(old_interface.device_id), "mac": old_interface.mac_address, "name": old_interface.cname[0:10], "added": old_interface.added, "updated": old_interface.updated, "data": {} } vap = None ipv4 = None ipv6 = None # determine interface type and specific fields if old_interface.type == 'eth': interface_dict['standard'] = 'fast' interface_dict['duplex'] = 'full' InterfaceModel = Ethernet elif old_interface.type == 'wifi': interface_dict['mode'] = old_interface.wireless_mode interface_dict['channel'] = old_interface.wireless_channel InterfaceModel = Wireless # determine ssid if old_interface.essid or old_interface.bssid: vap = Vap( **{ "interface_id": old_interface.id, "essid": old_interface.essid, "bssid": old_interface.bssid }) # if vap already exists flag it for UPDATE instead of INSERT try: v = Vap.objects.get( Q(interface_id=old_interface.id) & (Q(essid=old_interface.essid) | Q(bssid=old_interface.bssid))) # trick to make django do an update query instead of an insert # working on django 1.6 vap.id = v.id vap._state.adding = False except Vap.DoesNotExist: pass if old_interface.essid: interface_dict['data']['essid'] = old_interface.essid if old_interface.bssid: interface_dict['data']['bssid'] = old_interface.bssid elif old_interface.type == 'bridge': InterfaceModel = Bridge elif old_interface.type == 'vpn': InterfaceModel = Tunnel else: interface_dict['type'] = INTERFACE_TYPES.get('virtual') interface_dict['data'][ 'old_nodeshot_interface_type'] = old_interface.get_type_display( ) InterfaceModel = Interface interface = InterfaceModel(**interface_dict) # if interface already exists flag it for UPDATE instead of INSERT try: InterfaceModel.objects.get(pk=old_interface.id) interface._state.adding = False except InterfaceModel.DoesNotExist: pass if old_interface.ipv4_address: old_interface.ipv4_address = old_interface.ipv4_address.strip( ) # stupid django bug ipv4 = Ip( **{ "interface_id": old_interface.id, "address": old_interface.ipv4_address }) # if ip already exists flag it for UPDATE instead of INSERT try: ipv4.id = Ip.objects.get( address=old_interface.ipv4_address).id ipv4._state.adding = False except Ip.DoesNotExist: pass # ensure ipv4 is valid try: ip.IPAddress(old_interface.ipv4_address) except (ip.AddrFormatError, ValueError): self.message('Invalid IPv4 address %s' % (old_interface.ipv4_address)) ipv4 = None if old_interface.ipv6_address: old_interface.ipv6_address = old_interface.ipv6_address.strip( ) # stupid django bug ipv6 = Ip( **{ "interface_id": old_interface.id, "address": old_interface.ipv6_address }) # if ip already exists flag it for UPDATE instead of INSERT try: ipv6.id = Ip.objects.get( address=old_interface.ipv6_address).id ipv6._state.adding = False except Ip.DoesNotExist: pass # ensure ipv6 is valid try: ip.IPAddress(old_interface.ipv6_address) except (ip.AddrFormatError, ValueError): self.message('Invalid IPv6 address %s' % (old_interface.ipv6_address)) ipv6 = None try: interface.full_clean() interface.save(auto_update=False) saved_interfaces.append(interface) self.verbose('Saved interface %s' % interface.name) except Exception: tb = traceback.format_exc() self.message( 'Could not save interface %s, got exception:\n\n%s' % (interface.mac, tb)) continue if vap: try: vap.full_clean() vap.save() saved_vaps.append(vap) self.verbose('Saved vap %s' % vap.essid or vap.bssid) except Exception: tb = traceback.format_exc() self.message( 'Could not save vap %s, got exception:\n\n%s' % (vap.essid or vap.bssid, tb)) if ipv4: try: ipv4.full_clean() ipv4.save() saved_ipv4.append(ipv4) self.verbose('Saved ipv4 %s' % ipv4.address) except Exception: tb = traceback.format_exc() self.message( 'Could not save ipv4 %s, got exception:\n\n%s' % (ipv4.address, tb)) if ipv6: try: ipv6.full_clean() ipv6.save() saved_ipv6.append(ipv6) self.verbose('Saved ipv6 %s' % ipv6.address) except Exception: tb = traceback.format_exc() self.message( 'Could not save ipv6 %s, got exception:\n\n%s' % (ipv6.address, tb)) self.message('saved %d interfaces into local DB' % len(saved_interfaces)) self.message('saved %d vaps into local DB' % len(saved_vaps)) self.message('saved %d ipv4 addresses into local DB' % len(saved_ipv4)) self.message('saved %d ipv6 addresses into local DB' % len(saved_ipv6)) self.saved_interfaces = saved_interfaces self.saved_vaps = saved_vaps self.saved_ipv4 = saved_ipv4 self.saved_ipv6 = saved_ipv6