Exemple #1
0
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]
Exemple #2
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)
Exemple #3
0
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)
Exemple #4
0
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)
Exemple #5
0
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))
Exemple #6
0
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