Esempio n. 1
0
File: f5.py Progetto: jonozzz/iRack
def populate_licenses(asset, user, opt, log):
    log.info("populate_licenses: started.")
    
    # fromtimestamp shortcut.
    ft = datetime.datetime.fromtimestamp

    # Need to reraise this kind of exception because pickle chokes on it.
    pc = Icontrol(**opt) #IGNORE:W0142

    #licenses = []

    lic_status = pc.Management.LicenseAdministration.\
        get_license_activation_status()
    slot = Slot.objects.filter(disk__asset = asset, is_active=True)
    if lic_status == 'STATE_ENABLED':
        regkey_list = pc.Management.LicenseAdministration.\
            get_registration_keys()
        license_blob = pc.Management.LicenseAdministration.\
            get_license_file()
        eval_state = pc.Management.LicenseAdministration.\
            get_evaluation_license_expiration()
    else:
        log.warning("unlicensed")
    
    assert slot, "No active slot?!"
    active_slot = slot[0]

    with reversion.revision:
        defaults = {}
        if lic_status == 'STATE_ENABLED':
            defaults['is_activated'] = True
            defaults['reg_key'] = unicode(regkey_list[0])
            defaults['blob'] = unicode(license_blob, encoding='latin-1')
            defaults['current_time'] = ft(eval_state['current_system_time'])
            defaults['eval_start'] = ft(eval_state['evaluation_start'])
            defaults['eval_end'] = ft(eval_state['evaluation_expire'])
            defaults['is_expired'] = defaults['current_time'] > \
                                     defaults['eval_end']
        else:
            defaults['is_activated'] = False

        defaults['slot'] = active_slot

        try:
            lic = active_slot.license
            created = False
        except License.DoesNotExist: #@UndefinedVariable
            lic = License.objects.create(**defaults)
            created = True
        
        if defaults.get('current_time'):
            defaults.pop('current_time')
        
        update_if_changed((lic, created), defaults)
        
        reversion.revision.user = user
        
    log.info("populate_licenses: done.")
    return True
Esempio n. 2
0
File: f5.py Progetto: jonozzz/iRack
def populate_blades(asset, user, opt, log):

    log.info("populate_blades: started.")
    
    try:
        pc = Icontrol(**opt) #IGNORE:W0142
        is_clustered = pc.System.Cluster.is_clustered_environment()
    except IControlFault:
        is_clustered = False

    primary_blade = None
    if is_clustered:
        cluster_list = pc.System.Cluster.get_list() # [default]
        blade_matrix = pc.System.Cluster.get_slot_id(cluster_names=cluster_list) # [[1,2,3,4]]
        primary_blade = pc.System.Cluster.get_current_primary_slot(cluster_names=cluster_list)[0]
        me_list = pc.System.Cluster.get_member_enabled_state(cluster_names=cluster_list, slot_ids=blade_matrix)[0]
        mh_list = pc.System.Cluster.get_member_ha_state(cluster_names=cluster_list, slot_ids=blade_matrix)[0]
        pr_list = pc.System.Cluster.get_member_priming_state(cluster_names=cluster_list, slot_ids=blade_matrix)[0]

    blades = []

    with reversion.revision:
        if is_clustered:
            for i in xrange(len(blade_matrix[0])):
                defaults = {}
                defaults['member'] = int(blade_matrix[0][i])
                defaults['primary'] = primary_blade == defaults['member']
                
                if pr_list[i] == 'STATE_ENABLED':
                    defaults['priming'] = True
                else:
                    defaults['priming'] = False
    
                if me_list[i] == 'STATE_ENABLED':
                    defaults['enabled'] = True
                else:
                    defaults['enabled'] = False
                defaults['ha_state'] = unicode(mh_list[i])
                
                check_for = {
                    'member': defaults['member'],
                }
                pair = asset.blade_set.get_or_create(defaults = defaults, 
                                                       **check_for)
                update_if_changed(pair, defaults)
                
                blades.append(pair[0])

        ids = [x.id for x in blades]
        for x in asset.blade_set.all():
            if x.id not in ids:
                x.delete()
        
        reversion.revision.user = user
        
    log.info("populate_blades: done.")
    return True
Esempio n. 3
0
File: f5.py Progetto: jonozzz/iRack
def populate_ports(asset, user, opt, log):

    log.info("populate_ports: started.")

    # Need to reraise this kind of exception because pickle chokes on it.
    pc = Icontrol(**opt) #IGNORE:W0142

    ports = []
    port_list = pc.Networking.Interfaces.get_list()
    if port_list:
        mac_list = pc.Networking.Interfaces.get_mac_address(interfaces=port_list)
        enable_list = pc.Networking.Interfaces.get_enabled_state(interfaces=port_list)
        status_list = pc.Networking.Interfaces.get_media_status(interfaces=port_list)
        speed_list = pc.Networking.Interfaces.get_media_speed(interfaces=port_list)
        media_list = pc.Networking.Interfaces.get_active_media(interfaces=port_list)

    trunk_list = pc.Networking.Trunk.get_list()
    if trunk_list:
        tr_status_list = pc.Networking.Trunk.get_media_status(trunks=trunk_list)
        tr_speed_list = pc.Networking.Trunk.get_media_speed(trunks=trunk_list)

    with reversion.revision:
        for i in xrange(len(port_list)):
            defaults = {}
            defaultsf5 = {}
            # On clustered systems the interface name is like: 1/1.1
            defaults['name'] = unicode(port_list[i])
            defaults['type'] = const.PORT_NETWORK
            bits = port_list[i].split('/')
            if len(bits) == 2:
                defaultsf5['blade'] = int(bits[0])
            defaultsf5['mac'] = unicode(mac_list[i])
            if enable_list[i] == 'STATE_DISABLED':
                defaultsf5['enabled'] = False
            else:
                defaultsf5['enabled'] = True
            defaultsf5['status'] = unicode(status_list[i])
            defaultsf5['speed'] = speed_list[i]
            defaultsf5['media'] = unicode(media_list[i])

            check_for = {
                'name': defaults['name'],
                'type': defaults['type']
            }
            port, created = asset.port_set.get_or_create(defaults = defaults, 
                                                         **check_for)
            
            try:
                port = port.morph()
            except F5Port.DoesNotExist:
                created = True
            
            defaults.update(defaultsf5)
            if created:
                F5Port.objects.create(id=port.id, asset=port.asset, 
                                      **defaults)
            port = port.morph()

            update_if_changed((port, created), defaults)
            
            ports.append(port)

        for i in xrange(len(trunk_list)):
            defaults = {}
            defaultsf5 = {}
            defaults['name'] = unicode(trunk_list[i])
            defaults['type'] = const.PORT_NETWORK
            defaultsf5['status'] = unicode(tr_status_list[i])
            defaultsf5['speed'] = tr_speed_list[i]
            defaultsf5['is_trunk'] = True

            check_for = {
                'name': defaults['name'],
                'type': defaults['type']
            }
            
            port, created = asset.port_set.get_or_create(defaults = defaults, 
                                                         **check_for)

            defaults.update(defaultsf5)
            try:
                port = port.morph()
            except F5Port.DoesNotExist:
                created = True

            if created:
                F5Port.objects.create(id=port.id, asset=port.asset, 
                                      **defaults)
            port = port.morph()

            update_if_changed((port, created), defaults)

            ports.append(port)

        ids = [x.id for x in ports]
        for x in asset.port_set.filter(type= const.PORT_NETWORK):
            if x.id not in ids:
                x.delete()
        
        reversion.revision.user = user
        
    log.info("populate_ports: done.")
    return True
Esempio n. 4
0
File: f5.py Progetto: jonozzz/iRack
def populate_disks(asset, user, opt, log):

    log.info("populate_disks: started.")
    
    # Need to reraise this kind of exception because pickle chokes on it.
    pc = Icontrol(**opt) #IGNORE:W0142
    
    audit_str = pc.System.SoftwareManagement.get_boot_image_information(save_active_config=0)
    res = audit_parse(audit_str)
    hfinfo = pc.System.SoftwareManagement.get_hotfix_information()
    edition = pc.Management.DBVariable.query(variables=['version.edition'])[0]['value']
    try:
        partitions = pc.Management.Partition.get_partition_list()
    except IControlFault:
        partitions = None

    # Do some quick sanity check.
    if not (res.get('Disk') and res.get('Slot') and res.get('Installation')):
        raise InvalidAuditData(res)
            
    assert asset, 'Missing the F5Asset instance'

    with reversion.revision:
        disks = []
        slots = {}
        populated_slots = []
        
        # Process Disks.
        for audit in res['Disk']['audit_disks']:
            defaults = {}
            for field in get_real_fields(Disk):
                if audit.get(field):
                    defaults[field] = audit[field]

            check_for = {
                'name': audit['name'],
            }
            
            # Each disk is uniquely identified by the name field.
            pair = asset.disk_set.get_or_create(defaults = defaults, 
                                                  **check_for)
            update_if_changed(pair, defaults)
            disks.append(pair[0])

        # Delete orphan disks.
        disk_ids = [x.id for x in disks]
        for x in asset.disk_set.all():
            if x.id not in disk_ids:
                x.delete()
        
        # Process Slots.
        for audit in res['Slot']['audit_slots']:
            defaults = {}
            for field in get_real_fields(Slot):
                sf = const.SLOT_FIELD_MAP.get(field)
                if sf is None:
                    continue
                if field in ['is_active', 'is_cf']:
                    defaults[field] = bool(audit.get(sf))
                else:
                    if audit.get(sf):
                        defaults[field] = audit[sf]
            #isa = defaults.get('is_active', False)
            
            if defaults['is_active'] and partitions:
                defaults['partition_count'] = len(partitions)

            assert audit.get('slot_key'), "No slot_key found: %s" % audit
            #disk = filter(lambda d: audit['slot_key'].startswith(d.name), 
            #              disks)[0]
            disk = [d for d in disks if audit['slot_key'].startswith(d.name)][0]
            defaults['disk'] = disk
            
            check_for = {
                'slot_key': audit['slot_key'],
                'disk': disk,
            }
            
            # Each slot is uniquely identified by the slot_key field.
            pair = Slot.objects.get_or_create(defaults = defaults, **check_for)
            if not pair[1]:
                update_if_changed(pair, defaults)

            slots[defaults['visible_name']] = pair[0]
            
        # Delete orphan slots. (e.g LVM volumes can be removed)
        slot_ids = [x.id for x in slots.values()]
        for x in Slot.objects.filter(disk__asset = asset):
            if x.id not in slot_ids:
                x.delete()
        
        for audit in res['Installation']['audit_installations']:
            defaults = {}
            for field in get_real_fields(Installation):
                if audit.get(field):
                    defaults[field] = audit[field]

            assert audit.get('slot_key'), "No slot_key found: %s, res: %s" % \
                                          (audit, res)
            slot = [s for s in slots.values() if audit['slot_key'] == 
                    s.slot_key][0]
            defaults['slot'] = slot
            populated_slots.append(slot)
            
            if slot.is_active:
                if len(hfinfo) > 0 or \
                   defaults.get('basebuild') and \
                   build(defaults['build']) > build(defaults['basebuild']):
                    defaults['is_hf'] = True
                else:
                    defaults['is_hf'] = False

                # If edition is "Final" don't store anything in DB.
                if edition != 'Final':
                    defaults['edition'] = unicode(edition)
                else:
                    defaults['edition'] = ''

            try:
                installation = slot.installation
                created = False
            except Installation.DoesNotExist: #@UndefinedVariable
                installation = Installation.objects.create(**defaults)
                created = True

            update_if_changed((installation, created), defaults)
            
        # Delete orphan installations.
        Installation.objects.filter(slot__disk__asset = asset) \
                            .exclude(slot__in = populated_slots) \
                            .delete()

        reversion.revision.user = user
        
    log.info("populate_disks: done.")
    return True
Esempio n. 5
0
File: f5.py Progetto: jonozzz/iRack
def populate_addresses(asset, user, opt, log):
    
    log.info("populate_addresses: started.")

    # Need to reraise this kind of exception because pickle chokes on it.
    pc = Icontrol(**opt) #IGNORE:W0142
    is_clustered = asset.is_clustered()
    
    if is_clustered:
        pc = Icontrol(**opt) #IGNORE:W0142

    old_partition = set_partition(opt, log, '[All]')
    
    addresses = []
    try:
        selfip_list = pc.Networking.SelfIP.get_list()
        if selfip_list:
            selfip_nm_list = pc.Networking.SelfIP.get_netmask(self_ips=selfip_list)
            selfip_fs_list = pc.Networking.SelfIP.get_floating_state(self_ips=selfip_list)
        
        adminip_list = pc.Networking.AdminIP.get_list()
        if adminip_list:
            adminip_nm_list = pc.Networking.AdminIP.get_netmask(admin_ips=adminip_list)
        peerip_list = pc.System.Failover.get_peer_address()
    
        mgmtrt_list = pc.Networking.RouteTable.get_management_route()
        if mgmtrt_list:
            mgmt_gw_list = pc.Networking.RouteTable. \
                                        get_management_route_gateway(routes=mgmtrt_list)
    
        if is_clustered:
            cluster_list = pc.System.Cluster.get_list() # [default]
            if cluster_list:
                blade_list = pc.System.Cluster.get_slot_id(cluster_names=cluster_list) # [[1,2,3,4]]
                cluster_adminip_list = pc.Networking.AdminIP. \
                                                    get_cluster_list(cluster_names=cluster_list)
                # get_cluster_netmask(): NotImplemented
                cluster_adminip_nm_list = pc.Networking. \
                        AdminIP.get_cluster_netmask(cluster_names=cluster_list, cluster_ips=cluster_adminip_list)
    finally:
        set_partition(opt, log, old_partition)

    slot = Slot.objects.filter(disk__asset = asset, is_active=True)
    assert slot, "No active slot?!"
    active_slot = slot[0]

    with reversion.revision:
        for i in xrange(len(selfip_list)):
            defaults = {}
            defaults['type'] = const.ADDR_SELF
            defaults['address'] = IP(selfip_list[i])
            defaults['netmask'] = IP(selfip_nm_list[i])
            if selfip_fs_list[i] == 'STATE_ENABLED':
                defaults['floating'] = True
            else:
                defaults['floating'] = False
            
            check_for = defaults
            pair = active_slot.address_set.get_or_create(defaults = defaults, 
                                                     **check_for)
            update_if_changed(pair, defaults)
            addresses.append(pair[0])

        for i in xrange(len(adminip_list)):
            defaults = {}
            defaults['type'] = const.ADDR_MGMT
            defaults['address'] = IP(adminip_list[i])
            defaults['netmask'] = IP(adminip_nm_list[i])
            try:
                defaults['blade'] = asset.blade_set.get(primary=True)
            except Blade.DoesNotExist: #@UndefinedVariable
                defaults['blade'] = None

            check_for = defaults

            pair = active_slot.address_set.get_or_create(defaults = defaults, 
                                                     **check_for)
            update_if_changed(pair, defaults)
            addresses.append(pair[0])

        for i in xrange(len(mgmtrt_list)):
            defaults = {}
            defaults['type'] = const.ADDR_GATEWAY
            defaults['address'] = IP(mgmt_gw_list[i])
            defaults['netmask'] = IP(mgmtrt_list[i]['netmask'])
            check_for = defaults

            pair = active_slot.address_set.get_or_create(defaults = defaults, 
                                                         **check_for)
            update_if_changed(pair, defaults)
            addresses.append(pair[0])

        for i in xrange(len(peerip_list)):
            defaults = {}
            assert i < 2, "Shouldn't be more than a primary and secondary peers"
            if peerip_list[i] and i == 0:
                defaults['type'] = const.ADDR_PEER
                defaults['primary'] = True
                defaults['address'] = IP(peerip_list[i])
            elif peerip_list[i] and i == 1:
                defaults['type'] = const.ADDR_PEER
                defaults['primary'] = False
                defaults['address'] = IP(peerip_list[i])
            else:
                continue
            
            check_for = defaults
            
            pair = active_slot.address_set.get_or_create(defaults = defaults, 
                                                     **check_for)
            update_if_changed(pair, defaults)
            addresses.append(pair[0])

        if is_clustered:
            for i in xrange(len(blade_list)):
                defaults = {}
                defaults['type'] = const.ADDR_MGMT
                defaults['address'] = IP(cluster_adminip_list[0][i])
                defaults['netmask'] = IP(cluster_adminip_nm_list[0][i])
                defaults['blade'] = None
                
                check_for = defaults
                
                pair = active_slot. \
                    address_set.get_or_create(defaults = defaults, **check_for)
                update_if_changed(pair, defaults)
                addresses.append(pair[0])
            
        ids = [x.id for x in addresses]
        for x in active_slot.address_set.all():
            if x.id not in ids:
                x.delete()
        
        reversion.revision.user = user
        
    log.info("populate_addresses: done.")
    return True
Esempio n. 6
0
File: f5.py Progetto: jonozzz/iRack
def populate_vlans(asset, user, opt, log):

    log.info("populate_vlans: started.")

    # Need to reraise this kind of exception because pickle chokes on it.
    pc = Icontrol(**opt) #IGNORE:W0142

    old_partition = set_partition(opt, log, '[All]')

    vlans = {}
    try:
        vlan_list = pc.Networking.VLAN.get_list()
        if vlan_list:
            vlan_member_list = pc.Networking.VLAN.get_member(vlans=vlan_list)
            t_m_list = pc.Networking.VLAN.get_true_mac_address(vlans=vlan_list)
            m_m_list = pc.Networking.VLAN.get_mac_masquerade_address(vlans=vlan_list)
            tags_list = pc.Networking.VLAN.get_vlan_id(vlans=vlan_list)
        
        ip_list = pc.Networking.SelfIP.get_list()
        if ip_list:
            ip_vlan_list = pc.Networking.SelfIP.get_vlan(self_ips=ip_list)
    finally:
        set_partition(opt, log, old_partition)
    
    slot = Slot.objects.filter(disk__asset = asset, is_active=True)
    assert slot, "No active slot?!"
    active_slot = slot[0]

    with reversion.revision:
        for i in xrange(len(vlan_list)):
            defaults = {}
            members = vlan_member_list[i]
            defaults['name'] = unicode(vlan_list[i])
            defaults['tag'] = tags_list[i]
            defaults['true_mac'] = unicode(t_m_list[i])
            defaults['mac_masq'] = unicode(m_m_list[i])

            check_for = {
                'name': defaults['name'],
            }

            pair = active_slot.vlan_set.get_or_create(defaults = defaults, 
                                                      **check_for)
            update_if_changed(pair, defaults)
            vlan = pair[0]
            vlans[vlan.name] = vlan

            for j in xrange(len(members)):
                vpa_defaults = {}
                tagged = False
                member = members[j]
                if member['tag_state'] == "MEMBER_TAGGED":
                    tagged = True
                else:
                    tagged = False
                port_name = member['member_name']
                
                try:
                    vpa_defaults['is_tagged'] = tagged
                    port = asset.port_set.get(name=port_name)
                    vlan_2_port = VLANPortAssociation.objects.get_or_create(
                                     vlan=vlan, port=port, 
                                     defaults = vpa_defaults)
                    update_if_changed(vlan_2_port, vpa_defaults)
                except Port.DoesNotExist: #@UndefinedVariable
                    log.warning("port %s not found" % port_name)

        for i in xrange(len(ip_list)):
            ip = ip_list[i]
            try:
                addr = active_slot.address_set.get(type=const.ADDR_SELF, 
                                                   address=ip)
            except Address.DoesNotExist: #@UndefinedVariable
                log.warning("address %s not found" % ip)
                addr = None

            if not vlans.get(ip_vlan_list[i]):
                log.warning("vlan %s not found" % ip_vlan_list[i])
            else:
                if addr and addr.vlan != vlans[ip_vlan_list[i]]:
                    addr.vlan = vlans[ip_vlan_list[i]]
                    addr.save()

        ids = [x.id for x in vlans.values()]
        for x in active_slot.vlan_set.all():
            if x.id not in ids:
                x.delete()
        
        reversion.revision.user = user
    
    log.info("populate_vlans: done.")
    return True
Esempio n. 7
0
File: f5.py Progetto: jonozzz/iRack
    slot = Slot.objects.filter(disk__asset = asset, is_active=True)
    assert slot, "No active slot?!"
    active_slot = slot[0]

    with reversion.revision:
        for i in xrange(len(module_list)):
            defaults = {}
            defaults['module'] = unicode(module_list[i])
            defaults['level'] = unicode(level_list[i])
            
            check_for = {
                'module': defaults['module'],
            }
            pair = active_slot.provision_set.get_or_create(defaults = defaults, 
                                                           **check_for)
            update_if_changed(pair, defaults)
            provisions.append(pair[0])

        ids = [x.id for x in provisions]
        for x in active_slot.provision_set.all():
            if x.id not in ids:
                x.delete()

        reversion.revision.user = user
        
    log.info("populate_provisions: done.")
    return True

def populate_licenses(asset, user, opt, log):
    log.info("populate_licenses: started.")
    
Esempio n. 8
0
def populate_ttyusb(asset, user, log, options=None):
    from labinventory.asset.constants import TTYUSB_CONF, TTYUSB_BAUD
    if options is None:
        options = {}

    log.info("Started ttyUSB HUB populator")
    try:
        bag = asset.get_static_bag()
        mgmtip = bag.address_set.get(access=True)
    # Bail if no mgmt addresses are found.
    except ObjectDoesNotExist:
        raise ValueError("No mgmt addresses found.")

    ##
    for cred in bag.credential_set.filter(type=const.CT_SSH):
        ssh = ssh_process(unicode(mgmtip.address), cred.username,
                          cred.password, timeout=conf.SSH_CONNECT_TIMEOUT)
        break
    
    (rc, stdout, stderr) = ssh_exec(ssh, 'grep {0} {1}'.format(TTYUSB_BAUD, 
                                                               TTYUSB_CONF))
    port_list = []
    if not rc:
        # line::
        # 3101:on:/dev/ttyUSB1-1:B19200 CLOCAL IGNBRK CRTSCTS CS8 CREAD;
        for line in stdout.strip().splitlines():
            if line:
                port_list.append(line.split(':'))
    else:
        log.error(stderr)

    ##
    
    any_changes = False
    with reversion.revision:
        for i in xrange(len(port_list)):
            defaults = {}
            defaultsextra = {}
            defaults['name'] = unicode(port_list[i][2].split('/dev/ttyUSB')[1])
            defaults['type'] = const.PORT_SERIAL
            
            defaultsextra['label'] = unicode(port_list[i][2])
            
            # port_props::
            # B19200 CLOCAL IGNBRK CRTSCTS CS8 CREAD;
            port_props = port_list[i][3][:-1].split()
            defaultsextra['telnet_port'] = int(port_list[i][0])
            defaultsextra['serial_baud'] = int(port_props[0][1:])

            check_for = {
                'name': defaults['name'],
                'type': defaults['type']
            }
            
            port, created = asset.port_set.get_or_create(defaults = defaults,
                                                         **check_for)

            try:
                port = port.morph()
            except TtyUsbPort.DoesNotExist:
                created = True

            defaults.update(defaultsextra)
            if created:
                TtyUsbPort.objects.create(id=port.id, asset=port.asset,
                                          **defaults)
            port = port.morph()

            any_changes |= update_if_changed((port, created), defaults)

        reversion.revision.user = user
    
    log.info("Done")
    #return any_changes
    return True
Esempio n. 9
0
def populate_lantronix_slc(asset, user, log, options=None):
    from labinventory.asset.constants import SLC_PORT_COUNT, SLC_PORT_ID, \
            SLC_PORT_NAME, SLC_TELNET_ENABLE, SLC_TELNET_PORT, \
            SLC_SSH_ENABLE, SLC_SSH_PORT, SLC_TCP_ENABLE, SLC_TCP_PORT, \
            SLC_BAUD, SLC_DATA_BIT, SLC_STOP_BIT, SLC_PARITY
    if options is None:
        options = {}

    log.info("Started Lantronix SLC populator")
    try:
        bag = asset.get_static_bag()
        mgmtip = bag.address_set.get(access=True)
    # Bail if no mgmt addresses are found.
    except ObjectDoesNotExist:
        raise ValueError("No mgmt addresses found.")

    snmp = SNMPWrap(mgmtip.address)
    ret = snmp(0, 1, SLC_PORT_COUNT)
    port_count = int(ret[0][0].value)
    port_list = snmp(1, port_count+1, SLC_PORT_ID, SLC_PORT_NAME, 
                     SLC_TELNET_ENABLE, SLC_TELNET_PORT, SLC_SSH_ENABLE, 
                     SLC_SSH_PORT, SLC_TCP_ENABLE, SLC_TCP_PORT, SLC_BAUD, 
                     SLC_DATA_BIT, SLC_STOP_BIT, SLC_PARITY)

    any_changes = False
    with reversion.revision:
        #update = {'manufacturer': 'Lantronix'}
        for i in xrange(len(port_list)):
            defaults = {}
            defaultsextra = {}
            defaults['name'] = unicode(port_list[i][0].value)
            defaults['type'] = const.PORT_NETWORK
            
            defaultsextra['label'] = unicode(port_list[i][1].value)
            # 1 == disabled, 2 == enabled
            defaultsextra['telnet_enabled'] = port_list[i][2].value == 2
            defaultsextra['ssh_enabled'] = port_list[i][4].value == 2
            defaultsextra['tcp_enabled'] = port_list[i][6].value == 2
            
            defaultsextra['telnet_port'] = int(port_list[i][3].value)
            defaultsextra['ssh_port'] = int(port_list[i][5].value)
            defaultsextra['tcp_port'] = int(port_list[i][7].value)

            defaultsextra['serial_baud'] = int(port_list[i][8].value)
            defaultsextra['serial_db'] = int(port_list[i][9].value)
            defaultsextra['serial_sb'] = int(port_list[i][10].value)
            defaultsextra['serial_pt'] = int(port_list[i][11].value)

            check_for = {
                'name': defaults['name'],
                'type': defaults['type']
            }
            
            port, created = asset.port_set.get_or_create(defaults = defaults,
                                                         **check_for)

            try:
                port = port.morph()
            except LantronixPort.DoesNotExist:
                created = True

            defaults.update(defaultsextra)
            if created:
                LantronixPort.objects.create(id=port.id, asset=port.asset,
                                             **defaults)
            port = port.morph()

            any_changes |= update_if_changed((port, created), defaults)

        reversion.revision.user = user
    
    log.info("Done")
    #return any_changes
    return True