Скрипт номер раз. Он платформо зависим и такие скрипты есть под каждую необходимую архитектуру.
# -*- 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
отдает данные в виде списка префиксов, просто списком.
забирает их вот такой монстрик
# -*- 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 типов ошибок
- префикс есть на железе, но нет в ноке
- префикс есть на железе в базе с неверным городом
- город не задан
- тип сервиса не задан
- не правильный тип сервиса
Отчет по результатам надо прислать в почту группе пользователей указанной в Notification Group IPAMDudes, о чем незамысловато повествует 96 строка.
Вся магия – 20 строка. которая говорит на каком железе какой скрипт выполнить. на выходе выполнит простой редьюс таск. почти полностью позаимствованный из базовой системы.
скриптик добавляется так вот

а потом в schedules
