def fetch_voice_vlan_for_netbox(request, factory, config=None): """Fetch the voice vlan for this netbox There may be multiple voice vlans configured. Pick the one that exists on this netbox. If multiple vlans exist, we cannot know which one to use. """ if config is None: config = read_config() voice_vlans = fetch_voice_vlans(config) if not voice_vlans: return voice_vlans_on_netbox = list( set(voice_vlans) & set(factory.get_available_vlans())) if not voice_vlans_on_netbox: # Should this be reported? At the moment I do not think so. return if len(voice_vlans_on_netbox) > 1: messages.error(request, 'Multiple voice vlans configured on this ' 'netbox') return return voice_vlans_on_netbox[0]
def set_vlan(account, fac, interface, request): """Set vlan on netbox if it is requested""" if 'vlan' in request.POST: vlan = int(request.POST.get('vlan')) try: if is_cisco(interface.netbox): # If Cisco and trunk voice vlan (not Cisco voice vlan), # we have to set native vlan instead of access vlan config = read_config() voice_activated = request.POST.get('voice_activated', False) if not is_cisco_voice_enabled(config) and voice_activated: fac.set_native_vlan(interface, vlan) else: fac.set_vlan(interface, vlan) else: fac.set_vlan(interface, vlan) interface.vlan = vlan LogEntry.add_log_entry( account, u'set-vlan', u'{actor}: {object} - vlan set to "%s"' % vlan, subsystem=u'portadmin', object=interface, ) _logger.info('%s: %s:%s - vlan set to %s', account.login, interface.netbox.get_short_sysname(), interface.ifname, vlan) except (SnmpError, TypeError) as error: _logger.error('Error setting vlan: %s', error) messages.error(request, "Error setting vlan: %s" % error)
def get_factory(netbox): """Get a SNMP factory instance""" config = read_config() timeout = get_config_value(config, 'general', 'timeout', fallback=3) retries = get_config_value(config, 'general', 'retries', fallback=3) try: return SNMPFactory.get_instance(netbox, timeout=timeout, retries=retries) except SnmpError as error: _logger.error('Error getting snmpfactory instance %s: %s', netbox, error)
def set_voice_vlan(fac, interface, request): """Set voicevlan on interface A voice vlan is a normal vlan that is defined by the user of NAV as a vlan that is used only for ip telephone traffic. To set a voice vlan we have to make sure the interface is configured to tag both the voicevlan and the "access-vlan". """ if 'voicevlan' in request.POST: cdp_changed = False config = read_config() voice_vlan = fetch_voice_vlan_for_netbox(request, fac, config) use_cisco_voice_vlan = (is_cisco_voice_enabled(config) and is_cisco(interface.netbox)) enable_cdp_for_cisco_voice_port = is_cisco_voice_cdp_enabled(config) # Either the voicevlan is turned off or turned on turn_on_voice_vlan = request.POST.get('voicevlan') == 'true' account = get_account(request) try: if turn_on_voice_vlan: if use_cisco_voice_vlan: fac.set_cisco_voice_vlan(interface, voice_vlan) if enable_cdp_for_cisco_voice_port: fac.enable_cisco_cdp(interface) cdp_changed = True else: fac.set_voice_vlan(interface, voice_vlan) _logger.info('%s: %s:%s - %s%s', account.login, interface.netbox.get_short_sysname(), interface.ifname, 'voice vlan enabled', ', CDP enabled' if cdp_changed else '') else: if use_cisco_voice_vlan: fac.disable_cisco_voice_vlan(interface) if enable_cdp_for_cisco_voice_port: fac.disable_cisco_cdp(interface) cdp_changed = True else: fac.set_access(interface, interface.vlan) _logger.info('%s: %s:%s - %s%s', account.login, interface.netbox.get_short_sysname(), interface.ifname, 'voice vlan disabled', ', CDP disabled' if cdp_changed else '') except (SnmpError, ValueError, NotImplementedError) as error: messages.error(request, "Error setting voicevlan: %s" % error)
def render_trunk_edit(request, interfaceid): """Controller for rendering trunk edit view""" config = read_config() interface = Interface.objects.get(pk=interfaceid) agent = get_factory(interface.netbox) if request.method == 'POST': try: handle_trunk_edit(request, agent, interface) except SnmpError as error: messages.error(request, 'Error editing trunk: %s' % error) else: messages.success(request, 'Trunk edit successful') account = request.account netbox = interface.netbox check_read_write(netbox, request) try: vlans = agent.get_netbox_vlans() # All vlans on this netbox native_vlan, trunked_vlans = agent.get_native_and_trunked_vlans( interface) except SnmpError: vlans = native_vlan = trunked_vlans = allowed_vlans = None messages.error(request, 'Error getting trunk information') else: if should_check_access_rights(account): allowed_vlans = find_allowed_vlans_for_user_on_netbox( account, interface.netbox, agent) else: allowed_vlans = vlans extra_path = [(netbox.sysname, reverse('portadmin-sysname', kwargs={'sysname': netbox.sysname})), ("Trunk %s" % interface, )] context = get_base_context(extra_path) context.update({ 'interface': interface, 'available_vlans': vlans, 'native_vlan': native_vlan, 'trunked_vlans': trunked_vlans, 'allowed_vlans': allowed_vlans, 'trunk_edit': get_trunk_edit(config) }) return render_to_response('portadmin/trunk_edit.html', context, RequestContext(request))
def populate_infodict(request, netbox, interfaces): """Populate a dictionary used in every http response""" allowed_vlans = [] voice_vlan = None readonly = False config = read_config() try: fac = get_and_populate_livedata(netbox, interfaces) allowed_vlans = find_and_populate_allowed_vlans( request.account, netbox, interfaces, fac) voice_vlan = fetch_voice_vlan_for_netbox(request, fac, config) if voice_vlan: if is_cisco_voice_enabled(config) and is_cisco(netbox): set_voice_vlan_attribute_cisco(voice_vlan, interfaces, fac) else: set_voice_vlan_attribute(voice_vlan, interfaces) mark_detained_interfaces(interfaces) if is_dot1x_enabled(config): add_dot1x_info(interfaces, fac) except TimeOutException: readonly = True messages.error( request, "Timeout when contacting %s. Values displayed " "are from database" % netbox.sysname) if not netbox.read_only: messages.error(request, "Read only community not set") except SnmpError: readonly = True messages.error( request, "SNMP error when contacting %s. Values " "displayed are from database" % netbox.sysname) if check_read_write(netbox, request): readonly = True ifaliasformat = get_ifaliasformat(config) aliastemplate = '' if ifaliasformat: tmpl = get_aliastemplate() aliastemplate = tmpl.render({'ifaliasformat': ifaliasformat}) save_to_database(interfaces) auditlog_api_parameters = { 'object_model': 'interface', 'object_pks': ','.join([str(i.pk) for i in interfaces]), 'subsystem': 'portadmin' } info_dict = get_base_context([(netbox.sysname, )], form=get_form(request)) info_dict.update({ 'interfaces': interfaces, 'netbox': netbox, 'voice_vlan': voice_vlan, 'allowed_vlans': allowed_vlans, 'readonly': readonly, 'aliastemplate': aliastemplate, 'trunk_edit': get_trunk_edit(config), 'auditlog_api_parameters': json.dumps(auditlog_api_parameters) }) return info_dict