Blog

The Cigar is often categorised on the basis of their country of origin such as Cuba, Nicaragua and Dominican Republic. In addition to this, Cigar is also classified on the basis of the wrapper leaves such as Maduro and natural. These wrappers are also classified on the basis of the region of seeds. Both types of Cigar are available online, and you can buy it from an e-commerce website.

Maduro is a word of Spanish origin that means ripe or mature, and these wrappers were collected from the top of tobacco plants in order to ensure that they get exposure to sun and become dark. It is commonly referred to as the process of fermentation instead of plants location. Maduro wrappers are created with the help of proper moisture and heat provided to them naturally, and due to this it is a time-consuming process, and high level of patience is needed in order to reap them properly.

The speciality of Maduro Cigars includes their dark colour, and rich taste made them different from other types of Cigar. The darkest shades of brown and its speciality of providing a wide range of taste such as mellow flavour, the sweet and hearty taste made its demand in the Cigar lovers. As per the claim of a Cigar smoker, most of the flavour is provided by the wrapper to the Cigar, and use of high-quality premium Maduro wrapper made it different from other Cigars.

The darkening of the shades makes the wrapper more oiler and thicker and make it more noticeable on the roll. Moreover, the intense, juicy, fatty leaf provides a rich taste that helps in improving the experience of smoking. Maduro Cigars for sale can be seen on the various websites due to their slow-burning in harmony and in a wavy manner to enhance the experience of a smoker.

Chicago Cubs merchandise is available in various physical and online stores that are officially licensed by the MLB, starting from Chicago Cubs sweatshirts, Chicago Cubs hats and caps, Chicago Cubs shirts, and more. Numerous designs of Chicago Cubs merchandise are available in the market that is manufactured by authentic manufacturers. The Chicago Cubs gear officially licensed by the MLB demonstrates the authenticity and quality of the product. So, if you wish to have a Chicago Cubs gear that is officially licensed by MLB, you may prefer purchasing the Chicago Cubs merchandise from Mlbshop.com.

You can also buy the Chicago Cubs gear from other renowned online stores, like Sports World Chicago, etc., where you can find a vast range of Chicago Cubs gear that is officially licensed by MLB. When you buy any Chicago Cubs merchandise from online stores, make sure to check the details of the product. It is mentioned in the product details whether the product is licensed by MLB or not. The Chicago Cubs gear manufactured by renowned brands like '47, Majestic, Fanatics, Nike, etc. are mostly licensed by MLB. This demonstrates the quality and genuineness of the Chicago Cubs gear.

When you purchase any Chicago Cubs gear, make sure to buy the merchandise that is licensed by MLB. Get the licensed products from well-known physical stores or online stores, and show your support for the Chicago Cubs. There is numerous Chicago Cubs merchandise available with distinct design and style licensed by MLB, so you have various choices from where you can choose products as per your desire. Get any Chicago Cubs gear, and wear them anywhere you go, to show your support and affection for the Cubs. Wear the Chicago Cubs gear while watching the Cubs' match in the stadium or at home, and relish the game as one team.

Adding the right support by opting for the computer desk for the firm is the best choice. It is because these desks help in managing the space of the organization properly. The adjustable computer desk is designed in the best way possible so that they can help in keeping all the things in the right manner without any hassle.


The adjustable computer desk not only provides comfortability but would also provide relaxation and calm while working for hours in front of the screen. They are available in modern designs that are meant to suit every kind of decor. One should make sure that you look for these desks from the reliable site. It is because this is going to offer a reliable desk at the doorstep without any hassle.


There are many online sites that are offering the opting of customization so that the person can give a personal touch on the adjustable computer desk.  The customization helps in adding a personal touch to the furniture in the right manner. So, look for all the facilities that are offered online so that one can make the best choice in less duration of time. But don’t forget to go through the policy of the site before coming to any conclusion possible.

To know more about the adjustable computer desk from the right site possible, then the person is suggested that they should give a look at this >> computer supply store

With the flow of time, people have been looking for all the things online. That is why looking for all the things online is the best choice to make. All the ones who are thinking to look for Tactical gear, then making the right and suitable choice online help the person accurately.

People who are thinking to look for Tactical gear for their safety should make a reliable choice online. This is the best and most prompt way in which one can enhance the level of safety in the right manner. 


The Tactical gear is easily available in various designs as well as quality online so that the make the right choice possible. Even taking help from the experts can help in landing the better gear without any hassle. 

Try and go through all the details of the site carefully before coming to any conclusion. Even a comparison of the gear on the basis of cost and quality can help in getting the finest product accordingly.

Such tools are required by the ones who like to offer the right support possible. The Tactical gear is easy to wear so that the complete protection is added to the person without taking much time. So, all you need to do is just look up the right site for the durable products.


To know more about the suitable Tactical gear from the online site, then it is suggested to give a look at this >> Buy Tactical Clothing

In case you are going through the phase of premature hair loss, then Full Cap Human Hair Wigs are the most effective solution that helps in making you stay confident of yourself and bringing the positive change. Gone are those days when wigs were the only choice for those people who do not wish to undergo the surgical hair transplant procedure as now the hair systems prove to be the more evolved solution for women and men facing baldness. 


Know the right size of your chosen Affordable human hair wigs so that you can opt for the most suitable one without having an odd look and getting your scalp properly covered. Next, opt for the type of hair as the most effective hair used is the chemically treated human hair. You should not also forget to check out the durability and stay away from synthetic hair as much as possible. Are you usually in front of a camera? Do you wear the handset or hat frequently? These questions are critical because it will assist determine what kind of base as well as the attachment method will be the best suitable for you. 


You have to be most cautious while selecting texture, style, and color while buying Men's hair systems as any little adventure can turn out to be an issue. Also, every face needs a different hair system, and this is why it is vital to know about the correct one that suits your face. 


If you want to know more about Mens hairpieces, kindly visit here - Hair Pieces for Men





Fault Managment и поддержка GNU/Linux

1. Введение.

Есть очень много способов реализовать журналирование событий в GNU/Linux. Рассмотрим один из лучших, с возможностью предварительной фильтрации журналируемых событий и отправкой их по сети на syslog сервер NOC.

Предварительная фильтрация журналируемых событий необходима для предотвращения перегрузки сетевого канала передаваемыми событиями и DDOS сервера NOC.

Чтобы реализовать аудит будем использовать средства ядра Linux, также дополнительные утилиты: iptables, .... для настройки правил отлова событий в сети.  В качестве сервиса журналирования - syslog-ng.

2. Включение аудита выполняемых на сервере команд (Security | Audit | Command).

2.1 Настройка ядра Linux.

На исходные тексты ядра необходимо предварительно наложить патчи grsecurity.net после чего, как минимум, включить следующие опции:

CONFIG_GRKERNSEC_AUDIT_GROUP=y
CONFIG_GRKERNSEC_AUDIT_GID=65111
CONFIG_GRKERNSEC_EXECLOG=y
CONFIG_GRKERNSEC_AUDIT_CHDIR=y
2.2 Настройка системы.

Создаём группу для аудита:

# groupadd -g 65111 audit

И добавляем в неё необходимых пользователей:

# usermod -a -G audit noc
# usermod -a -G audit ...

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

3. Настройки защиты ядра Linux (Security | Attack | Crack Attemption Detected).

Включаем следующие опции настройки ядра:

CONFIG_PAX_NOEXEC=y
CONFIG_PAX_PAGEEXEC=y
CONFIG_PAX_MPROTECT=y
CONFIG_PAX_ASLR=y
CONFIG_PAX_RANDKSTACK=y
CONFIG_PAX_RANDUSTACK=y
CONFIG_PAX_RANDMMAP=y
CONFIG_PAX_MEMORY_SANITIZE=y
CONFIG_PAX_MEMORY_STACKLEAK=y
CONFIG_PAX_REFCOUNT=y
CONFIG_PAX_USERCOPY=y
CONFIG_GRKERNSEC_KMEM=y
CONFIG_GRKERNSEC_IO=y
CONFIG_GRKERNSEC_BPF_HARDEN=y
CONFIG_GRKERNSEC_PERF_HARDEN=y
CONFIG_GRKERNSEC_RAND_THREADSTACK=y
CONFIG_GRKERNSEC_PROC_MEMMAP=y
CONFIG_GRKERNSEC_KSTACKOVERFLOW=y
CONFIG_GRKERNSEC_BRUTE=y
CONFIG_GRKERNSEC_MODHARDEN=y
CONFIG_GRKERNSEC_HIDESYM=y
CONFIG_GRKERNSEC_RANDSTRUCT=y
CONFIG_GRKERNSEC_KERN_LOCKOUT=y
CONFIG_GRKERNSEC_BLACKHOLE=y
CONFIG_GRKERNSEC_FLOODTIME=60
CONFIG_GRKERNSEC_FLOODBURST=3

Бинарные файлы должны собираться с PIE/SSP (CFLAGS="-fPIE -fstack-protector-all -D_FORTIFY_SOURCE=2" LDFLAGS="-Wl,-z,now -Wl,-z,relro"). Теперь ядро способно определять некоторые виды популярных атак, предотвращать их распространение и информировать нас о произошедшей попытке взлома. Можно отметить в этом разделе больше опций или меньше... Некоторые опции сильно влияют на производительность, которая в свою очередь зависит от аппаратной платформы и поддерживаемых процессором инструкций.

4. Настройки iptables, ... и прочих средств списков контроля доступа (Security | ACL).

Необходимо создать специальные правила журналирования пакетов в iptables со специальными метками. Например для журналирования отброшенных пакетов необходимо последними в цепочках INPUT, FORWARD, OUTPUT добавить соответственно следующие правила:

# iptables -t filter -A INPUT -p ALL -m limit --limit 5/h --limit-burst 3 -j LOG --log-prefix 'iptables INPUT '
# iptables -t filter -A FORWARD -p ALL -m limit --limit 5/h --limit-burst 3 -j LOG --log-prefix 'iptables FORWARD '
# iptables -t filter -A OUTPUT -p ALL -m limit --limit 5/h --limit-burst 3 -j LOG --log-prefix 'iptables OUTPUT ' --log-uid

Количество сетевых событий также может быть огромным, фильтруйте только необходимые, например атака ssh heartbeat:

# iptables -t filter -A INPUT -p tcp --dport 22 -m u32 --u32 "52=0x18030000:0x1803FFFF" -j LOG --log-prefix 'iptables SSH HEARTBEAT '

5. Настройка lm_sensors (Environment)

Устанавливаем в систему пакет lm_sensors с поддержкой sensord. В опции запуска sensord можно добавить "-i 0", так он будет журналировать только тревожные сообщения. Запускаем sensord и добавляем его в вашу систему инициализации.

6. Настройка syslog-ng

Настройка этого сервиса предельно понятна и удобна. Необходимо указать 4 главных параметра: источник событий (source), место назначения событий (destination), фильтр событий (filter) и дать команду журналировать (log). Фильтр событьй должен выбирать только события классифицируемые в NOC! Приведём рабочий пример файла настройки /etc/syslog-ng/syslog-ng.conf, локальные журналы с него удалены:

@version: 3.7
# $Id$
#
# Syslog-ng default configuration file for Gentoo Linux

# https://bugs.gentoo.org/show_bug.cgi?id=426814
@include "scl.conf"

options {
threaded(yes);
chain_hostnames(no);

# The default action of syslog-ng is to log a STATS line
# to the file every 10 minutes. That's pretty ugly after a while.
# Change it to every 12 hours so you get a nice daily update of
# how many messages syslog-ng missed (0).
stats_freq(43200);
# The default action of syslog-ng is to log a MARK line
# to the file every 20 minutes. That's seems high for most
# people so turn it down to once an hour. Set it to zero
# if you don't want the functionality at all.
mark_freq(3600);
};

source src {
system();
internal();
};

destination NOC { udp("1.1.1.1" port(514)); };

filter Environment { facility(daemon) and program("sensord") and level(alert); };
filter Network_Link { facility(kern) and message("^.*: (link up|link down)$"); };
filter Network_LAG { facility(kern) and message("^.*: (Adding slave|Removing slave)"); };
filter Network_NTP { facility(daemon) and program("^ntpd$") and (
message("(now valid|now invalid)$")
or message("adjusting local clock by")
or message("clock is now synced$")
); };
filter Security_ACL { facility(kern) and (
                message("^iptables .*")
                or message("^ebtables .*")
                ); };
filter Security_Attack_Hardened { facility(kern) and (
                message("^PAX: terminating task: ")
                or message("^grsec: banning user with uid ")
                or message("^grsec: bruteforce prevention initiated ")
                or message("^grsec: denied resource overstep ")
                or message("^grsec: denied RWX mmap ")
               or message("^grsec: denied untrusted exec ")
                or message("^grsec: From ")
                ); };
filter Security_Audit_Command { facility(kern) and (
                message("^grsec: chdir to") and not message("^.*uid/euid:0/0 gid/egid:0/0, parent /usr/sbin/(run-crons|cron)")
                or message("^grsec: exec of") and not message("^.*uid/euid:0/0 gid/egid:0/0, parent /usr/sbin/(run-crons|cron)")
                ); };
filter Security_Audit_Cron { facility(cron) and message("^.* CMD .*$") and not message("^.*/usr/sbin/run-crons.*$"); };
filter Security_Authentication { facility(authpriv) and message("^(.*|)pam_unix.*$"); };
filter System { program("^init$") and message("^(Entering|Switching to) runlevel: "); };
filter NOC { filter(Environment)
                or filter(Network_Link)
                or filter(Network_LAG)
or filter(Network_NTP)
                or filter(Security_ACL)
                or filter(Security_Attack_Hardened)
                or filter(Security_Audit_Command)
                or filter(Security_Audit_Cron)
                or filter(Security_Authentication)
                or filter(System)
                ; };
log { source(src); filter(NOC); destination(NOC); };

7. NOC

Теперь необходимо ваш GNU/Linux сервер добавить в NOC Service Activation -> Managed Object, при добавлении выбрать профиль OS.Linux и указать в Trap Source IP адрес сервера.

Если решили добавить новые события с сервера GNU/Linux, то напишите ещё фильтры, у файле настройки /etc/syslog-ng/syslog-ng.conf, выбирающие только необходимые вам события и добавьте их через or в агрегирующий фильтр NOC. Выбранные вами события появятся в Fault Management -> Events как Unknown | Syslog. Далее вам необходимо написать правила классификации событий.

 

Ишью как модераторы-то джируют!

Или рассказ о модерировании Issues в JIRA.

Назрела потребность добавить порядка в задачах в трекере. 

Собственно трекер: https://bt.nocproject.org/secure/Dashboard.jspa

Пара модераторов: Егор и Сергей.

Права на редактирования задачи и добавляем инфы в поля Component/s & Labels.

Сейчас добавляем в Component/s:

в Labels:

  • профиль, если задача по конкретному профилю, например Cisco.IOS;
  • unknown-event — по необработанным FM-сообщениям;
  • patch — при наличии в задаче патча;
  • security — все про безопасность в ноке;
  • request-sa-script — запрашивается создание скрипта в профиле SA;
  • search — проблемы поиска и одноимённого приложения;
  • new-sa-profile — новый профиль устройств;
  • beefCanned Beef;
  • crash — баг ведет в трейсбэку;
  • get_ — имя скрипта, о котором задача;
  • json — есть json-данные.

Примеры поисковых запросов:

labels = sa AND component IS NULL
component IS NULL AND text ~event_class__name
component IS NULL AND text ~"SNMP Trap" AND status != RESOLVED
labels IS NULL AND text ~dlink AND status NOT IN (RESOLVED, CLOSED)
labels IS NULL AND text ~cisco AND status NOT IN (RESOLVED, CLOSED)
project = NOC AND labels IS NULL AND text ~cisco AND status NOT IN (RESOLVED, CLOSED)
project = NOC AND labels IS NULL AND component IS NULL AND status NOT IN (RESOLVED, CLOSED)
project = NOC AND reporter =  'Ilya Zakharov' AND labels IS NULL AND component IS NULL AND status NOT IN (RESOLVED, CLOSED)

 

Веллком в комменты с предложениями по Component/s & Labels.

Повседневный:

project = NOC AND (labels IS NULL OR component IS NULL) AND status NOT IN (RESOLVED, CLOSED, DONE)

Старые баги:

project = NOC AND status not in (RESOLVED, CLOSED, DONE, FEEDBACK) AND createdDate < 2012-01-01 AND type = Bug

вот еще:

project = NOC AND status not in (RESOLVED, CLOSED, DONE, FEEDBACK) AND type = Bug AND (labels is EMPTY OR component is EMPTY) ORDER BY updatedDate

 

 
Записки новичка: перезалить скрипт

Бывает, что нужно поправить файло, а с обновлением потом "непонятки",

или и вовсе я случайно грохнул нужный скрипт sa/profiles/Cisco/IOS/get_oam_status.py

возвращаем файл к состоянию, зафиксированному в репозитории:

под noc'ом

hg revert sa/profiles/Cisco/IOS/get_oam_status.py

 

или точнее:

8[14:38]    zi_rus: TSergey: у тебя неправильное описание, реверт не метит, а вытягирает и репо текущую версию взамен той что лежит на диске. 
            если локальный файл отличается от репозитарного, то hg не может по-нормальному его обновить, вернее она могла бы его зам
8[14:38]    zi_rus: а когда ты ревертишь у тебя файл становится одинаковым
8[14:38]    zi_rus: и апгрейд может нормально дальше пройти
Записки новичка: удаляем конфиг МО

Как-то так:

./noc shell
%cpaste
from noc.lib.gridvcs.gridvcs import *
from noc.lib.gridvcs.manager import *
from noc.sa.models import *
CLEAR_CONFIG_MO = {'MO1','MO2',...}
mo = ManagedObject.objects.filter()
for m in mo:
    if m.name in CLEAR_CONFIG_MO:
        print "*************************************"
        print m.name
        m.config.get_gridvcs().delete(m.id)
--
quit()

Понадобилось при работе над get_config, для удаления черновых конфигов.

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

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

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

Для 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?

(Canned BeefNOC-1429)

Есть у меня в использовании несколько коммутаторов DLink DGS-3100-24TG.

Они чуть более исключительные, чем остальные DES-DGS, и для них сделан отдельный профиль DGS3100.

Я допилил для указанного профиля обработку портчэналов, доработка коснулась скриптов get_portchannel и get_interfaces.

Для того, что бы поместить изменения в проект, нужно протестировать скрипты — действительно ли я все учел.

В NOC'е для этого реализован механизм работы с "тушенкой", возможность собрать данные с коммутатора и затем тестировать работу скриптов в отсутствии самого железа.

Обновим "тушенку" из публичного репо:

noc@noc:/opt/noc$ ./noc beef --pull
[sa_public]
pulling from https://bitbucket.org/nocproject/noc-sa-beef-public
searching for changes
no changes found

Тестируем скрипты:

noc@noc:/opt/noc$ ./noc test --beef-filter=DLink.DGS3100.get_portchannel noc.stop
Ran 0 tests in 0.000s
OK
noc@noc:/opt/noc$ ./noc test --beef-filter=DLink.DGS3100.get_interfaces noc.stop
Ran 0 tests in 0.000s
OK

Ноль тестов? Проверяем, есть ли "тушенка" для наших скриптов.

Данные лежат в /opt/noc/local/

noc@noc:/opt/noc/local/repos/sa/sa_public/DLink/DGS3100$ ls -l
drwxrwxr-x 2 noc noc 4096 Oct 20 14:41 get_chassis_id
drwxrwxr-x 2 noc noc 4096 Oct 20 14:41 get_dom_status
drwxrwxr-x 2 noc noc 4096 Oct 20 14:41 get_interface_status
drwxrwxr-x 2 noc noc 4096 Oct 20 14:41 get_lldp_neighbors
drwxrwxr-x 2 noc noc 4096 Oct 20 14:41 get_mac_address_table
drwxrwxr-x 2 noc noc 4096 Oct 20 14:41 get_version
drwxrwxr-x 2 noc noc 4096 Oct 20 14:41 get_vlans

Видим, что для get_portchannel и get_interfaces нет каталогов.

Значит сделаем локальный репо и протестируем на своих данных.

Пишем где будет наш репо:

etc/beef.conf

[my_repo]
enabled = true
type = sa
private = true
repo = /srv/noc/my_repo

Проверяем:

noc@noc:/opt/noc$ ./noc beef --list-repo
E P T  Name                 Repo
+ N sa sa_public            https://bitbucket.org/nocproject/noc-sa-beef-public
+ N sa my_repo              /srv/noc/my_repo

Готовим "тушенку":

./noc debug-script get_portchannel router1 -o output.json
./noc debug-script get_interfaces  router1 -o output.json
 я делал это так

(DLink DGS-3100 — предварительно сделанный селектор)

 

./noc shell
from noc.sa.models import *
SELECTOR = "DLink DGS-3100"
mos = ManagedObjectSelector.objects.filter(name=SELECTOR)[0]
if mos is not None:
    for m in mos.managed_objects:
        #print m.name, m.platform, m.get_attr("version","")
        txt  = "./noc debug-script get_portchannel " 
        txt += m.name + " -o /home/noc/" 
        txt += m.name.split(".")[0] + "_get_portchannel_" 
        txt += m.get_attr("version","") + ".json"
        print txt
if mos is not None:
    for m in mos.managed_objects:
        txt  = "./noc debug-script get_interfaces " 
        txt += m.name + " -o /home/noc/" 
        txt += m.name.split(".")[0] + "_get_interfaces_" 
        txt += m.get_attr("version","") + ".json"
        print txt
quit()

получаю строки вида:
./noc debug-script get_portchannel router1 -o /home/noc/s2-5-8_get_portchannel_3.60.44.json
./noc debug-script get_interfaces router1 -o /home/noc/s2-5-8_get_interfaces_3.60.44.json

затем кучей вываливаю их в консоль и через некоторое время получаю "тушенку" в /home/noc/

 


Делаем каталоги  get_portchannel и get_interfaces в /srv/noc/my_repo, копируем в них полученные файлы json. (json в репо помещается не совсем так, буду корректировать)

Тестируем на наших данных:

noc@noc:/opt/noc$ ./noc test --beef=/srv/noc/my_repo/ noc.stop
Ran 28 tests in 0.014s
OK

Или так:

./noc test --beef=/srv/noc/my_repo/ --beef-filter=DLink.DGS3100.get_portchannel noc.stop
./noc test --beef=/srv/noc/my_repo/ --beef-filter=DLink.DGS3100.get_interfaces noc.stop

Или так, на всей доступной тушенке: и нашей и публичной:

./noc test --beef-filter=DLink.DGS3100.get_portchannel noc.stop
./noc test --beef-filter=DLink.DGS3100.get_interfaces noc.stop

 

Ура, скрипты корректно работают на всех DGS-3100, которые есть у меня в NOC`е.

 

P.S.

Бывает, что "test" ругается на данные, а мы видим, что скрипт корректно отдает данные. В моем случае ругалось на ответ скрипта "[]".

Корректируем данные так:

./noc test --beef=/srv/noc/my_repo/ --fixed-beef-base=/srv/noc/fixed-beef yes

в /srv/noc/fixed-beef будут сформированы файлы, в которых найдена и поправлена ошибка. Копируем эти файлы в репо (нужно угадать какие файлы были ошибочные) и снова тестируемся.


Файлы "тушенки" отправляем на beef@nocproject.org и если все корректно, то их разместят в публичном репо.

 

 

Записки новичка: закрытие аварий

Как подсказал zi_rus:

 

09:36 misak, noc shell в помощь
09:36 from noc.fm.models import *
09:36 ac = AlarmClass.objects.get(name='Network | EIGRP | Neighbor Down')
09:36 alarms = ActiveAlarm.objects.filter(alarm_class=ac)
09:36 
09:36 for a in alarms:
09:36 a.clear_alarm("close")
09:36 from noc.fm.models import *
09:36 alarms = ActiveAlarm.objects.filter(vars__peer__in=['195.98.32.86'])
09:36 for a in alarms:
09:36 a.clear_alarm("close")
09:36  или так
09:36 from noc.fm.models import *
09:36 from noc.sa.models import *
09:36 alarms = ActiveAlarm.objects.filter(managed_object=ManagedObject.objects.get(name="bb-zmile").id)
09:36 for a in alarms:
09:36 a.clear_alarm("close")
09:36 5 строк

Закроем такие:

# закрыть 'Network | IMPB | Unauthenticated IP-MAC' с IP = '0.0.0.0'
from noc.fm.models import *
ac = AlarmClass.objects.get(name='Network | IMPB | Unauthenticated IP-MAC')
alarms = ActiveAlarm.objects.filter(alarm_class=ac)
for a in alarms:
    if a['vars']['ip']=='0.0.0.0':
        a.clear_alarm("close")

Решил поиграться с графитом. Цель была- понять, можно ли механизмом активаторов собирать и слать данные во внешнюю систему в больших объемах. Все выродилось в два pyRule:

  1. IReduceTask, именно он собранные данные шлет наружу - в графит по простому текстовому протоколу. Мне кажется, проблема моей ДНК где-то в этом коде. Именно отсюда растут тормоза.
# -*- coding: utf-8 -*-
##----------------------------------------------------------------------
## ResultReport
##----------------------------------------------------------------------
## INTERFACE: IReduceTask
##----------------------------------------------------------------------
## DESCRIPTION:
## Display reduce task result
##----------------------------------------------------------------------
## Copyright (C) 2007-2010 The NOC Project
## See LICENSE for details
##----------------------------------------------------------------------
import pprint
##
## 
##
@pyrule
def result_report_graphite(task):
    out=""
    import time
    from noc.lib.nbsocket import *
    sf=SocketFactory()
    gp=sf.connect_tcp('graphite.host',2003,ConnectedTCPSocket)
    sf.loop()
    gp.create_socket()
    sf.loop()
    gp.handle_connect()
    sf.loop()
    for mt in task.maptask_set.all():
      if mt.script_result:
        for k,v in mt.script_result:
            t=int(time.time())
            out+="crc.%s.%s %s %s\n"%(mt.managed_object.address, k.split(".")[-1],v,t)
            gp.write("crc.%s.%s %s %s\n"%(mt.managed_object.address, k.split(".")[-1],v,t))
            sf.loop()
  #          for i in xrange(10):
   #          sf.loop()
            #gp.close(True)
#    out+=["<TR><TD>%s</TD><TD>%s</TD><TD><PRE>%s</PRE></TD></TR>"%(mt.managed_object.name,mt.status,pprint.pformat(mt.script_result))\
#        for mt in task.maptask_set.all()]
 #   out+=["</tbody>","</table>"]
    sf.shutdown()
    return out

2. IPeriodicTask - собственно, пируль, который запускает сбор данных. Просто для всех железяк опрашивается ноковским getnext ветка CRCErrors

# -*- coding: utf-8 -*-
from noc.sa.models import *
from noc.inv.models import *
from noc.ip.models import *
from noc.main.models import SystemNotification
import string


@pyrule
def SendCRCtoGraphite(timeout= None):
 #mo=managed object to get counters from
 mo=ManagedObjectSelector.objects.get(name='All-DLINK')
 t=ReduceTask.create_task(mo,"pyrule:result_report_graphite","","get_snmp_getnext",{'oid':'1.3.6.1.2.1.16.1.1.1.8'},900)
 z=t.get_result()
 SystemNotification.notify(name="sa.version_inventory", subject="Managed Object discovered", body="Discovered %s"%z)
 return True

Для одного хоста укладывался секунд в 10 вместе с отправкой всех данных в графит. Для двух тысяч наступает понимание - что-то тут не так... Если будут сочувствующие, умные и вообще неплохие люди - могу поэкспериментировать(до среды или с 5 октября).

Да, код-ревью устраивать не надо,это черновик.

Записки новичка: грохнуть порты
./noc shell
# delete mo interface 
from noc.inv.models import *
mo = ManagedObject.objects.get(name='MO')
for i in Interface.objects.filter(managed_object=mo.id ): #, type='physical' , type='SVI' , name='1:9'
    print i.name, i.type, i.managed_object
    i.delete()
    i.save()
quit()