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
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
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
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
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
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
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.")
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
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