Example #1
0
 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
Example #2
0
    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)
Example #3
0
    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)
Example #4
0
 def save(self, *args, **kwargs):
     """ automatically set Interface.type to bridge """
     self.type = INTERFACE_TYPES.get("bridge")
     super(Bridge, self).save(*args, **kwargs)
Example #5
0
 def save(self, *args, **kwargs):
     """ automatically set Interface.type to bridge """
     self.type = INTERFACE_TYPES.get('bridge')
     super(Bridge, self).save(*args, **kwargs)
Example #6
0
    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)
        )
Example #7
0
 def save(self, *args, **kwargs):
     """ automatically set Interface.type to ethernet """
     self.type = INTERFACE_TYPES.get('ethernet')
     super(Ethernet, self).save(*args, **kwargs)
Example #8
0
 def save(self, *args, **kwargs):
     """ automatically set Interface.type to wireless """
     self.type = INTERFACE_TYPES.get('wireless')
     super(Wireless, self).save(*args, **kwargs)
Example #9
0
 def save(self, *args, **kwargs):
     """ automatically set Interface.type to virtual """
     self.type = INTERFACE_TYPES.get('virtual')
     super(Vlan, self).save(*args, **kwargs)
Example #10
0
 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
Example #12
0
 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
Example #13
0
 def save(self, *args, **kwargs):
     """ automatically set Interface.type to virtual """
     self.type = INTERFACE_TYPES.get('virtual')
     super(Vlan, self).save(*args, **kwargs)
Example #14
0
 def save(self, *args, **kwargs):
     """ automatically set Interface.type to ethernet """
     self.type = INTERFACE_TYPES.get('ethernet')
     super(Ethernet, self).save(*args, **kwargs)
Example #15
0
    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))
Example #16
0
    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
Example #17
0
    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
Example #18
0
 def save(self, *args, **kwargs):
     """ automatically set Interface.type to wireless """
     self.type = INTERFACE_TYPES.get('wireless')
     super(Wireless, self).save(*args, **kwargs)