При изучении различных дискавери, у меня поднакопилось объектов с самыми разнообразными 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
Unknown User (lexus)
Базовая вещь, часто приходится что-то править таким способом, если нужна массовость. Аналогично можно и AuthProfile навесить, например. Достаточно полазить по описаниям соответствующих моделей и посмотреть, что нужно импортировать и как называются поля.
Unknown User (tsergey)
Ага, а тут назначим всем MO "VC Domain" = 'default'
Unknown User (sptsh)
Это содержание обычного исполняемого файла, я правильно понял?
Unknown User (tsergey)
я не уверен, что это можно запускать файлом
cd /opt/noc
/noc shell
>>
код питона, все по честному, с правильным количеством пробелов во вложенном коде (для меня было не очевидно),
например
from noc.sa.models import *
mo = ManagedObject.objects.filter(name='SAE')
print mo.address
Enter
>>0.0.0.0
>>quit()
Unknown User (inoyat.kayumov)
А как быть в случае, если объекты надо выбирать по шаблону по имени?
mo = ManagedObject.objects.filter(name='???')
Алексей Широких
в общем случае https://docs.djangoproject.com/en/dev/ref/models/querysets/
в конкретно твоем
mo = ManagedObject.objects.filter(name_icontains='switch')
Unknown User (inoyat.kayumov)
Алексей Широких
прошу прощения нижних подчеркиваний надо два
mo = ManagedObject.objects.filter(name__icontains='switch')
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
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
Unknown User (tsergey)
пробелы?
"код питона, все по честному, с правильным количеством пробелов во вложенном коде (для меня было не очевидно),"
Unknown User (inoyat.kayumov)
Похоже не в них дело - прошу прощения, коряво вставил.
Ругань была на слово print
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
Unknown User (tsergey)
я уверен почти на 100%
for m in mo:
____if '02' in m.name: # s2 — часть имени объекта
________print m.name
Unknown User (inoyat.kayumov)
Да - спасибо огромное!
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")
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()
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 )
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