Child pages
  • Автоматическая отверка базы IPAM и настроек на железе
Skip to end of metadata
Go to start of metadata

Скрипт номер раз. Он платформо зависим и такие скрипты есть под каждую необходимую архитектуру.

/opt/noc/sa/profiles/Alcatel/TIMOS/get_plgeneral.py
# -*- coding: utf-8 -*-
##----------------------------------------------------------------------
## Alcatel.TIMOS.get_plgeneral
##----------------------------------------------------------------------
## Copyright (C) 2007-2011 The NOC Project
## See LICENSE for details
##----------------------------------------------------------------------
"""
"""
## NOC modules
from noc.sa.script import Script as NOCScript
from noc.sa.interfaces import IGetList
import re

class Script(NOCScript):
    TIMEOUT = 60
    name = "Alcatel.TIMOS.get_plgeneral"
    implements = [IGetList]

    def execute(self):
        pref=re.compile("prefix (?P<prefix>.*?) exact")
        prefixes=[]

        result=self.cli('show router policy prefix-list "PL-GENERAL"')
        result+=self.cli('show router policy prefix-list "PL-GENERAL-VOIP"')
        for l in result.splitlines():
            p=pref.match(l)
            prefixes.append(p.group("prefix"))
            
        return prefixes

отдает данные в виде списка префиксов, просто списком.

забирает их вот такой монстрик

pl-general-check
# -*- coding: utf-8 -*-
def plg_reduce(task):
    return [{
        "bsr-name": mt.managed_object.name,
        "city": mt.managed_object.administrative_domain.magic_octet,
        "status": mt.status == "C",
        "result": mt.script_result
    } for mt in task.maptask_set.all()]

@pyrule
def pl_general_check(timeout=180):
    from time import sleep
    from django.core.exceptions import ObjectDoesNotExist
    from noc.sa.models import ReduceTask, ManagedObjectSelector
    from noc.ip.models import Prefix
    from noc.main.models import NotificationGroup, CustomField
    CustomField.install_fields()

    mos = ManagedObjectSelector.objects.get(name='Alcatel')
    task = ReduceTask.create_task(object_selector=mos,
                                  map_script="get_plgeneral",
                                  map_script_params={},
                                  reduce_script=plg_reduce,
                                  reduce_script_params={},
                                  timeout=120)

    while not task.complete:
        sleep(0.3)
    result = task.get_result()

    resp = []
    brases_with_bad_status = []

    full_check = True

    for stat in result:
        if not stat['status']:
            full_check = False
            brases_with_bad_status.append(stat['bsr-name'])
    if brases_with_bad_status:    
      resp.append("Full check was not done because of bad result from %s",  brases_with_bad_status)

    not_exist = []
    wrong_city = []
    city_not_set = []
    stype_not_set = []
    wrong_stype = []
    missed_in_pl_general = []
    have_in_ipam = []

    for bras in result:
        for net in bras['result']:
            try:
                prefix = Prefix.objects.get(prefix=net, vrf_id=1)
            except ObjectDoesNotExist:
                not_exist.append(net)
            finally:
                if not prefix.city:
                    city_not_set.append(net)
                elif prefix.city != bras['city']:
                    wrong_city.append([{'prefix': net, 
                                      'seen_on': bras['city'],
                                      'ipam_thinks': prefix.city }])
                if not prefix.stype:
                    stype_not_set.append(net)
                elif prefix.stype != 'a01':
                    wrong_stype.append([{'prefix': net,
                                       'seen_in_ipam': prefix.stype}])

    if full_check:
        pl_general_nets = set(net for res in result for net in res['result'])
        ipam_net = set(
            net.prefix for net in Prefix.objects.filter(stype='a01',
                                                        vrf_id=1,
                                                        afi=4))
    if not_exist:
        resp.append("Prefix does not exists\n%s" % ("\n".join(set(not_exist))))
    if wrong_city:
        resp.append("Prefix in wrong city\n%s" % wrong_city)
    if city_not_set:
        resp.append("Prefix has empty city\n%s" % ("\n".join(set(city_not_set))))
    if stype_not_set:
        resp.append("Prefix stype not set\n%s" % stype_not_set)
    if wrong_stype:
        resp.append("Prefix has bad stype\n%s" % ("\n".join(set(wrong_stype))))
    if pl_general_nets - ipam_net:
        resp.append("Prefix exist in pl general but lost in IPAM\n%s, yes again\n" % ("\n".join((pl_general_nets - ipam_net))))
    ipam_net = set(
            net.prefix for net in Prefix.objects.filter(stype='a01',
                                                        vrf_id=1,
                                                        ertnet=False,
                                                        afi=4))        
    if ipam_net - pl_general_nets:
        resp.append("Prefix exist in IPAM with type a01 but not found in pl-general\n%s" % ("\n".join((ipam_net - pl_general_nets))))
    if resp:
        g = NotificationGroup.objects.get(name="IPAMDudes")
        g.notify("pl-general errors", "\n\n".join(resp))
    return True

 

 

Соответственно в базе есть поле stype в котором указан тип префикса. и поле city соответственно город.  нам надо проверить, что на железе и в базе одинаковые данные.

возможны 5 типов ошибок

  1. префикс есть на железе, но нет в ноке
  2. префикс есть на железе в базе с неверным городом
  3. город не задан
  4. тип сервиса не задан
  5. не правильный тип сервиса

Отчет по результатам надо прислать в почту группе пользователей указанной в Notification Group IPAMDudes, о чем незамысловато повествует 96 строка. 


Вся магия – 20 строка. которая говорит на каком железе какой скрипт выполнить. на выходе выполнит простой редьюс таск. почти полностью позаимствованный из базовой системы.

 

скриптик добавляется так вот

а потом в schedules

  • No labels