Child pages
  • Записки новичка: полезные мелочи
Skip to end of metadata
Go to start of metadata

При изучении различных дискавери, у меня поднакопилось объектов с самыми разнообразными Object_Profiles.

Ну неужели заходить в каждый и править профиль?

Справимся так:

./noc shell
from noc.sa.models import *
default = ManagedObjectProfile.objects.get(name='default')
full_discovery = ManagedObjectProfile.objects.get(name='full-discovery')
mo = ManagedObject.objects.filter(object_profile=full_discovery)
for m in mo:
  m.object_profile = default
  m.save()


quit()

 

Меняем профиль  'full-discovery' на 'default'

 

 

 

19 Comments

  1. Unknown User (lexus)

    Базовая вещь, часто приходится что-то править таким способом, если нужна массовость. Аналогично можно и AuthProfile навесить, например. Достаточно полазить по описаниям соответствующих моделей и посмотреть, что нужно импортировать и как называются поля.

  2. Unknown User (tsergey)

    Ага, а тут назначим всем MO "VC Domain" = 'default'

     

    ./noc shell
    from noc.sa.models import *
    from noc.vc.models import *
    vc_domain = VCDomain.objects.get(name='default')
    mo = ManagedObject.objects.filter()
    for m in mo:
      m.vc_domain = vc_domain
      m.save()
    quit()
  3. Unknown User (sptsh)

    Это содержание обычного исполняемого файла, я правильно понял?

  4. Unknown User (tsergey)

    я не уверен, что это можно запускать файлом (smile)

    1. запускаем "шелл нока"
      cd /opt/noc
      /noc shell
      >>
    2. сюда код, Ентер
      код питона, все по честному, с правильным количеством пробелов во вложенном коде (для меня было не очевидно),
      например
      from noc.sa.models import * 
      mo = ManagedObject.objects.filter(name='SAE')
          print mo.address
      Enter
    3. получаем ответ
      >>0.0.0.0
    4. выходим из "шелла"
      >>quit()

     

  5. Unknown User (inoyat.kayumov)

    А как быть в случае, если объекты надо выбирать по шаблону по имени?

    mo = ManagedObject.objects.filter(name='???')

    1. в общем случае https://docs.djangoproject.com/en/dev/ref/models/querysets/

      в конкретно твоем mo = ManagedObject.objects.filter(name_icontains='switch')

      1. Unknown User (inoyat.kayumov)

        mo = ManagedObject.objects.filter(name_icontains='switch')  

        Traceback (most recent call last):

          File "<console>", line 1, in <module>

          File "/opt/noc/lib/python2.7/site-packages/django/db/models/manager.py", line 143, in filter

            return self.get_query_set().filter(*args, **kwargs)

          File "/opt/noc/lib/python2.7/site-packages/django/db/models/query.py", line 624, in filter

            return self._filter_or_exclude(False, *args, **kwargs)

          File "/opt/noc/lib/python2.7/site-packages/django/db/models/query.py", line 642, in _filter_or_exclude

            clone.query.add_q(Q(*args, **kwargs))

          File "/opt/noc/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1250, in add_q

            can_reuse=used_aliases, force_having=force_having)

          File "/opt/noc/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1122, in add_filter

            process_extras=process_extras)

          File "/opt/noc/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1316, in setup_joins

            "Choices are: %s" % (name, ", ".join(names)))

        FieldError: Cannot resolve keyword 'name_icontains' into field. Choices are: activator, address, address_set, administrative_domain, auth_profile, collector, config_diff_filter_rule, config_filter_rule, config_validation_rule, description, id, is_managed, managedobjectattribute, maptask, max_scripts, name, object_profile, password, port, profile_name, remote_path, scheme, service_terminator, shape, snmp_ro, snmp_rw, super_password, tags, termination_group, trap_community, trap_source_ip, user, vc_domain, vrf

        1. прошу прощения нижних подчеркиваний надо два mo = ManagedObject.objects.filter(name__icontains='switch')

  6. Unknown User (tsergey)

    в фильтр шаблон не получится, насколько знаю, но можно так:

    from noc.sa.models import * 

    mo = ManagedObject.objects.filter()
    for m in mo:
        if 's2' in m.name: # s2 — часть имени объекта
            print m.name

     

  7. Unknown User (inoyat.kayumov)

    >>> from noc.sa.models import *

    >>> default = ManagedObjectProfile.objects.get(name='ping-only')

    >>> mo = ManagedObject.objects.filter()

    >>> for m in mo:

    ...      if 'agg-' in m.name:

    ...      print m.name

      File "<console>", line 3

        print m.name

            ^

    IndentationError: expected an indented block

  8. Unknown User (tsergey)

    пробелы?

    "код питона, все по честному, с правильным количеством пробелов во вложенном коде (для меня было не очевидно),"

  9. Unknown User (inoyat.kayumov)

    Похоже не в них дело - прошу прощения, коряво вставил.

    Ругань была на слово print

  10. Unknown User (tsergey)

    >>> from noc.sa.models import *
    >>> mo = ManagedObject.objects.filter()
    >>> for m in mo:
    ... if '02' in m.name: # s2 — часть имени объекта
    ... print m.name
    ...
    s102-1-1.intt
    s202-1-1.intt
    s202-2-1.intt
    s302-1-1.intt
    s402-1-1.intt
    s502-1-1.intt
    s502-2-1.intt
    s602-1-1.intt

  11. Unknown User (tsergey)

    я уверен почти на 100% 

    (smile)

     

    for m in mo:
    ____if '02' in m.name: # s2 — часть имени объекта

     ________print m.name

     

     

  12. Unknown User (inoyat.kayumov)

    Да - спасибо огромное!

  13. Unknown User (e_zombie)

    Когда надо быстро найти какие где стоит на та версия прошивки.

    dd


    from noc.sa.models import *
    from noc.sa.models.managedobject import ManagedObject
    from noc.sa.models.managedobject import AdministrativeDomain
    from noc.sa.models.managedobjectprofile import *

    mo = ManagedObject.objects.filter()
    for m in mo:
        print m
        tag = []
        m.tags = tag
        m.save()
        if m.get_attr("version") != "ROS_4.15.1189.ISCOM2100-1.002.20160620" and m.get_attr("platform") != "ISCOM2128EA-MA-AC":
             print m.address, m.name , m.get_attr("platform"), m.get_attr("version")

  14. Unknown User (e_zombie)

    Когда надо удалить все линки между оборудованием.

     

    from noc.sa.models import *
    from noc.inv.models.interface import Interface
    from noc.sa.models.managedobject import ManagedObject
    mo = ManagedObject.objects.filter()
    for m in mo:
        if m.x is not None or m.y is not None:
            print m.name, m.x , m.y
        for i in Interface.objects.filter(managed_object=m):
            if i is not None and i.link is not None:
                print i, i.link
                print "unlink", i, i.link
                i.link.delete()

  15. Unknown User (e_zombie)

    Задача: Поймать ситуацию когда кто то вырезал кабель между домовыми стояками. При такой ситуации падает большое количество клиентских портов, а вот аплинки остаются на месте. Может быть ещё при массовом отключении электроэнергии.

    Решение: Раз в минуту смотреть на события link UP\DOWN и считать сколько их было:

     

    # -*- coding: utf-8 -*-
    ##----------------------------------------------------------------------
    ## check physical cut cable on network
    ##----------------------------------------------------------------------
    ## Copyright (C) 2007-2016 The NOC Project
    ## See LICENSE for details
    ##----------------------------------------------------------------------

    import datetime
    from noc.fm.models import *
    from noc.fm.models.eventclass import EventClass
    from noc.fm.models.activeevent import ActiveEvent

    from noc.inv.models.interface import Interface

    from noc.sa.models import *
    from noc.sa.models.managedobject import ManagedObject

    from noc.main.models.notificationgroup import NotificationGroup


    # список МО которые надо проверять
    mo = []
    # тело сообщения
    bodymessage = ''

    #host = 'fsw-2-navashina-34-64-sar'
    #mo = ManagedObject.objects.filter(name=host)

    ed=EventClass.objects.get(name='Network | Link | Link Down')
    eu=EventClass.objects.get(name='Network | Link | Link Up')
    border_r = datetime.datetime.now() - datetime.timedelta(seconds=0)
    # border_l = datetime.datetime.now() - datetime.timedelta(days=1)
    border_l = datetime.datetime.now() - datetime.timedelta(seconds=60)
    # print border_l, border_r
    #dc = ActiveEvent.objects.filter(managed_object=host, event_class=ec, timestamp__gt=border).count()
    #print dc

    events = ActiveEvent.objects.filter(event_class=ed, timestamp__gte=border_l, timestamp__lte=border_r)
    #events = ActiveEvent.objects.filter(managed_object=host, timestamp__lte=border_r)

    # проверяем сколько для каждого из них есть падений портов    
    # https://www.ibm.com/developerworks/ru/library/l-python_part_3/
    #print list(set(mo))
    # удаляем дубли
    # d.volodin
    mo = set(e.managed_object for e in events)

    # print "=========="

    for m in mo:
    #    print m.name, "Down: ", ActiveEvent.objects.filter(managed_object=m, event_class=ec, timestamp__gt=border).count() , " Up: ",  ActiveEvent.objects.filter(managed_object=m, event_class=eu, timestamp__gt=border).count()
        down = ActiveEvent.objects.filter(managed_object=m, event_class=ed, timestamp__gte=border_l, timestamp__lte=border_r ).count()
        up = ActiveEvent.objects.filter(managed_object=m, event_class=eu, timestamp__gte=border_l, timestamp__lte=border_r ).count()
        print down, up
        
        # если упало больше чем поднялось.
        # ТУТ НАСТРАИВАЕТСЯ НАСКОЛЬКО БОЛЬШЕ УПАЛО ЧЕМ ПОДНЯЛОСЬ
        if (down - up) > 3:
        print m.name
        
        # добавляем в тело письма имя хоста
        bodymessage = bodymessage + "\n" + m.name + "   " + m.address + "\n"
        
        ev = ActiveEvent.objects.filter(managed_object=m, event_class__in=[ed,eu], timestamp__gte=border_l, timestamp__lte=border_r )
        for e in ev:
            print e.raw_vars["message"] #  ,e.vars['body']# , e.vars["description"]# , #e.vars['message']
            bodymessage = bodymessage + "    " + e.raw_vars["message"] + "\n"

    # если тело письма не пустое - отправляем уведомление.
    if bodymessage:
        gname='1' #
        g = NotificationGroup.get_by_id(gname) # где get_by_id(x) номер Notification Group
        print g.notify("Подозрение на воровство кабеля", bodymessage )

     

  16. Unknown User (e_zombie)


    Если необходимо получить номера Vlan с тегами и без тегов для объекта



    from noc.sa.models import *
    from noc.inv.models.interface import Interface
    from noc.inv.models.subinterface import SubInterface
    from noc.sa.models.managedobject import ManagedObject
    mo = ManagedObject.objects.filter()
    #mo = ManagedObject.objects.filter(name='fsw-1-1ogorodntup-18-96-sar')
    print (mo)
    for m in mo:
        print m
        for i in Interface.objects.filter(managed_object=m):
           #print i
           if i:
               for y in SubInterface.objects.filter(managed_object=m, interface = i):
                   print m, i, y.untagged_vlan, y.tagged_vlans