Skip to end of metadata
Go to start of metadata

По мотивам крайне полезного пируля, чуть его доработал:

# -*- coding: utf-8 -*-
##----------------------------------------------------------------------
## set interfaces profile
##----------------------------------------------------------------------
## INTERFACE: IPeriodicTask
##----------------------------------------------------------------------
## DESCRIPTION:
## set NNI or UNI inventory\interfaces profile
##----------------------------------------------------------------------
## Copyright (C) 2007-2014 The NOC Project
## See LICENSE for details
##----------------------------------------------------------------------
## http://kb.nocproject.org/pages/viewpage.action?pageId=11108392
import logging
from noc.inv.models import *
@pyrule
def set_interface_profile(timeout = None):
    current_profile_name = "default"
    new_profile_name = "default"
    interface = Interface.objects.filter(type="physical")
    for i in interface:
        current_profile_name = i.profile.name
        new_profile_name = current_profile_name
        untagged_vlan = SubInterface.objects.get(interface=i).untagged_vlan
        if i.link:
            new_profile_name = "NNI"
        else:
           if not i.description:
               new_profile_name = "default"
           elif i.profile.name == InterfaceProfile.objects.get(name="default").name:
               new_profile_name = "UNI"
        if untagged_vlan == 1:
               new_profile_name = "NNI" 
        if new_profile_name != current_profile_name:
            i.profile = InterfaceProfile.objects.get(name=new_profile_name).id
            i.save()
            logging.info("[pyrule.set_interfaces_profile] set interface.profile %s '%s'->'%s'" % (i, current_profile_name, new_profile_name))
    return True 

 

В лог noc-scheduler.log попадают записи об изменении профиля порта, примерно так

2014-03-07 09:13:57,080 [pyrule.set_interfaces_profile] set interface.profile s558.intt: 1:9 'default'->'NNI'

 

 

 

6 Comments

  1. Unknown User (tsergey) AUTHOR

    похоже нашел ошибку, переделал кусок

    untagged_vlan = SubInterface.objects.get(interface=i).untagged_vlan

    в

     

    subinterface = SubInterface.objects.filter(interface=i)
        if subinterface is not None: 
            for s in subinterface:
                 if s.untagged_vlan is not None:
                      untagged_vlan = s.untagged_vlan




     

  2. Unknown User (mindgames)

    Сергей, привет! К сожалению, не захотел твой пируль работать. У меня установка тестовая с нуля. Там добавлено всего 5 устройств, роутеры и коммутаторы. Все циско. Так вот, он пометил как NNI только те порты, на которых антаггед 1й вилан (и только он, если там есть еще тегированные вилан - то он пропускает этот порт). Ну а все остальные так и остались default.

    Скрипт, который первый (на базе которого ты сделал свой) отрабатывает нормально. Но у него есть недостаток, который, судя по всему, ты и хотел устранить - он транковые порты тоже помечает как UNI, если не видит за ним соседа (нет линка). Ну линк может и не создаться, но транк по-любому крайне редко бывает клиентским портом и его надо мониторить, так что профиль UNI не годится. К сожалению, я не разбираюсь в коде и не могу найти, где именно у тебя ошибка. Кажется, с условием где-то косяк. Можешь проверить?

  3. Unknown User (tsergey) AUTHOR

    Привет, Максим!

    Тут и проверять нечего (smile)

    Логика такая:

    1. есть линк — профиль NNI
    2. нет линка, на порту нет описания (description) — профиль default
    3. нет линка, профиль default и есть описание — профиль UNI
    4. есть untaged_vlan == 1 — профиль NNI

    Ошибок в этой логике не видел, а какой работы ты ожидал? 

    Вот например ты пишешь "но транк по-любому крайне редко бывает клиентским портом и его надо мониторить" — как ты определяешь что порт транковый?

     

  4. Unknown User (mindgames)

    ну, то, что порт транковый - это определяется по наличию tagged vlan. Кстати, почему если порт имеет untagged vlan = 1, то он NNI?

    и я просто хотел обратить внимание на то, что твой скрипт не отрабатывает. где именно ошибка - я не нашел. Но он не перевел ни один порт в UNI. И только пару портов перевел в NNI те, где был только один нетегированный вилан под номером 1

  5. Unknown User (tsergey) AUTHOR

    В моей сети управляющий влан — 1, наличие его в антаге на порту однозначно говорит, что это транковый порт.

    Кроме того, если NOC нашел линк, это тоже однозначно транк, ну просто по логике, оба объекта есть в ноке).

    С клиентскими все неоднозначно.

    Ты считаешь, что если на порту есть tagged vlan, то он NNI. А как бы ты описал правило для UNI портов?

    Пиши, я поправлю пируль.

     

  6. После очередного обновления перестал работать пируль. Для восстановления, заменил

    import logging
    from noc.inv.models import*
    на
    import logging
    import re
    from noc.inv.models.interfaceprofile import *
    from noc.inv.models.interface import *
    заработало