Blog from November, 2014

Записки новичка: консервируем МО

У нас нередко коммутатор получает "вторую жизнь".

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

Для NOC`а, однако, это не совсем новый объект, некоторые его свойства он помнит для его предыдущей реинкарнации.

Я правлю это так:

./noc shell
from noc.inv.models.discoveryid import DiscoveryID
from noc.inv.models import *
from noc.sa.models import *
MO = {'MO1', 'MO2'}
for m in MO:
    id = ManagedObject.objects.get(name = m).id
    try:
        chassis = DiscoveryID.objects.get(object = id)
        print "chassis:", chassis.object, chassis.chassis_mac, chassis.id         
        # delete chassis 
        chassis.delete()
        chassis.save()
    except:
        print "chassis not found:", m
    for i in Interface.objects.filter(managed_object = id):
        if i.link:
            try:
                l = Link.objects.get(interfaces = i)
                print "link:", i.link
                # delete link
                l.delete()
                l.save()
            except:
                print "link not found:", i
        # delete interface
        i.delete()
        i.save()
quit()

Для добавления железок используются ип адреса из address space managment-assignet addresses. Там же нужно проставить tag. Вот сам скрипт

 

from noc.sa.models import *
from noc.inv.models import *
from noc.ip.models import *
from noc.main.models import SystemNotification
import string
import commands
for i in range(1,10):                          #задаем диапазон сеток
  prf=Prefix.objects.filter(prefix='10.10.'+str(i)+'.0/24',vrf='1') #делим диапазон на сети /24 (10.10.1.0/24 по 10.10.10.0/24)
  for p in prf:
    if p.tags:
      tags1= ','.join(str(v) for v in p.tags)     #ищем тег сетки 
      adrs=p.nested_address_set                   #поиск найденных адресов
      print tags1
      for a in adrs:
        addpr=False
        mo=ManagedObject.objects.filter(address=a.address)  #проверка на наличие mo
        if mo:
           for o in mo:
            print o.name
            addpr=False
        else:
           print a.address
           ring="ring"+str(int(str(a.address).split('.')[3])//20)                          #доп тег
           cmd="snmpget -v 2c -c public " + str(a.address) + " 1.3.6.1.2.1.1.2.0 -O Uvqn"  #вендор
           cmd2="snmpget -v 2c -c public " + str(a.address) + " 1.3.6.1.2.1.1.5.0 -O Uvqn" #hostname - будущее имя mo
           x=str(commands.getoutput(cmd))
           name=commands.getoutput(cmd2).replace('"', '')
           if x == ".1.3.6.1.4.1.2011.2.23.92":               #различные вендоры
            type1="Huawei.VRP"#s2326
            type2="s2300"
            addpr=True
           if x == ".1.3.6.1.4.1.259.6.10.94":
            type1="EdgeCore.ES"
            type2="edge"
            addpr=True
           if x == ".1.3.6.1.4.1.2011.2.23.96":            #железку не добавляем
            type1="Huawei.VRP"
            addpr=False
            continue
           if x == ".1.3.6.1.4.1.2011.2.23.229":
            type1="Huawei.VRP" #s2328
            type2="s2300"
            addpr=True
           if x.startswith("Timeout"):
            addpr=False
            continue
           if addpr:
            tags2 = [tags1,ring,type2]
            print tags2
            print addpr
            print name
            m = ManagedObject(name=name.format(a.address),is_managed=True,administrative_domain=AdministrativeDomain.objects.get(name="default"),activator = Activator.objects.get(name='default'),profile_name = type1, tags = tags2, snmp_ro = 'public', object_profile = ManagedObjectProfile.objects.get(name='test1'), scheme = 0, address = a.address, user = 'user', password = 'pass')
            m.save()                           #запись нового mo
            a.managed_object = m  

Работает через ./noc shell. На выходе куча железок в sa-mo, в которых проставлены вендоры, теги и тд, те сразу начинается сбор статистики.

Код далек от идеала. Например, выдет ошибку, если у мо 2 ип (это поправимо).

  1. Как запихнуть этот код в пируль?
  2. При переносе железки с изменением ип, хотелось бы старый мо удалить и создать новый.
  3. Как применить несколько snmp community?