to post messages and comments.

Таки дошел до руч~wW стандарта в вопросе нумерации строк таблиц:
Instances identified by use of integer-valued objects should be numbered starting from one (i.e., not from zero). The use of zero as a value for an integer-valued index object should be avoided, except in special cases.

Таки узнал, что означает ".0" в конце некоторых OID — означает что они скаляры. Причем в MIB декларируются без всех этих trailing-zero, а добавляется при запросе. Но зачем? Следует ли из этого, что строки таблицы, при том что строка это объект (следовательно не скаляр), тоже должны нумероваться с 0 — не понятно.

Интернетик, я правильно понимаю, что в MIB нельзя запилить и использовать несколько раз сложный тип (из нескольких полей)? Только скаляры и энумы?

Хочешь испортить себе настроение с утра — сядь писать MIB-файл. Хочешь возжелать увечий ближнему своему — заставь какое-то java-поделие, написанное древними римлянами понять этот файл и правильно отобразить данные. Хочешь устроить геноцид — осознай, что это никому не нужно, никто этим не будет пользоваться и ты только что прожил несколько часов зря. Лучше бы спал. Или как @Zert, лучше бы водку пил.

Есть маленькое (SOHO) сетевое устройство. Хочу организовать его мониторинг. Устройство умеет SNMP. Есть что-нибудь простенькое, что будет собирать информацию по SNMP, писать её куда-нибудь и строить графики?
Желательно поменьше PHP и MySQL — городить их ради одного устройства представляется мне оверинженирингом.

у кого-нибудь получалось настроить SNMP толком? Пробую https://erlangcentral.org/wiki/index.php?title=SNMP_Quick_Start пошагово сделать и получаю
([email protected])10> snmpm:sync_get("simple_user", "otp agent", [[sysName,0]]). 
{error,{invalid_sec_info,[{sec_level,3,0},
                          {request_id,807031961,0}],
                         {noError,0,
                                  [{varbind,[1,3,6,1,6,3,15,1,1,4,0],'Counter32',4,1}]}}}
очевидно, что с доступом что-то нетак, вопрос - что же именно?

c:\>snmpget -v2c -d -c security 94.2х.х.230 system.sysDescr.0
No log handling enabled — using stderr logging

Sending 43 bytes to UDP: [94.2х.х.230]:161->[0.0.0.0]:0

Вопросы: почему не работает? с другого компа работает.

Что значит [94.2х.х.230]:161->[0.0.0.0]:0 ?

Мопед не мой

вот набросал простенький трап хэндлер для mac notifications с dlink 3028. Всё что умеет — немного разгребать полученное и класть в базу. Регулярка я айпишниками требует более тонкого подхода, я знаю. pastebin.com

Как это не печально и удивительно, но с 2006 года до сих пор не исправлены баги с отсутствием отсылки snmp трапа по snmp-server enable traps tty даже в ветке Version 15.0(2) для 4500 Catalyst. Точнее даже два бага: CSCsa67252 и CSCsg99865. Собственно, login on-success|on-failure trap тоже не работает в моём случае с ssh. Начинаю думать о плохом и смотреть в сторону embedded event manager и tcl, предвкушая размеры костыля.

.1.3.6.1.4.1.9.9.194.1.1.1 — количество сессий, .1.3.6.1.2.1.1.1.0 — определение вендора/модели (работает на cisco, d-link, linksys), .1.3.6.1.2.1.1.1 — тоже самое только для линксис (вероятно и циско), .1.3.6.1.2.1.4.21.1.2.client_ip — индекс локального интерфейса по ip, .1.3.6.1.2.1.2.2.1.7.int_num i 2 — положить этот локальный интерфейс

Интересно было бы знать каким образом jabber.ru снимает через cacti данные о количестве сессий, графики stats.jabber.ru
Я пока лишь вижу решение добавлением custom oid к snmpd, оный по exec запускает скрипт, которые посылает станзу

<iq type="get" to="server.tld" id="aed4a">
<query xmlns="http://jabber.org/protocol/disco#items" node="online users"/>
</iq>

серверу, и возвращает количество items. Ну а далее обычно добавляем custom oid в cacti и рисуем графики.
Минусы — костыльность, необходимость наличия администраторских прав на jabber-сервере у аккаунта для скрипта. А вот вдруг есть более простое решение?

Перфекционизм зло.

Задача - найти крайние коммутаторы в кольце с MSTP. Проще всего найти их, основываясь на наличии mac узла агрегации, куда эти крайние коммутаторы подключены каким-либо из магистральных портов, в root STP дерева.

У D-Link о наличии крайнего коммутатора нам расскажут инстансы, в частности, наличие 6000/6001 в роли Root.

 MSTI   Designated Bridge   Internal PathCost  Prio  Status      Role      
 -----  ------------------  -----------------  ----  ----------  ----------
 0      6000/0019562A0AC0   20000              128   Forwarding  Root      
 1      6001/0019562A0AC0   20000              128   Forwarding  Root      
 2      N/A                 20000              128   Disabled    Disabled  
 3      N/A                 20000              128   Disabled    Disabled  
 4      N/A                 20000              128   Disabled    Disabled 
 
У нас это 0 и 1 инстансы. Через слеш мы видим mac порта узла агрегации. Остаётся собрать эти данные через SNMP. Увы, оба нужных мне инженера D-Link отсутствовали на рабочих местах, MIB STP у D-Link практически нигде не упоминается, но если сделать snmpwalk на .1, то можно по grep поймать упоминание dlkMSTP.mib, это он и есть.
Итого, через 5 минут мы знаем, что 1.3.6.1.4.1.171.12.15.2.5.1.3.25.0 покажет нам данные с 25 порта коммутатора:
 
snmpget -v2c -c public 10.2.1.125 1.3.6.1.4.1.171.12.15.2.5.1.3.25.0
SNMPv2-SMI::enterprises.171.12.15.2.5.1.3.25.0 = Hex-STRING: 60 00 00 19 56 2A 0A C0 

Отлично, хекс, первые 4 значения - 6000, указывают на роль Root в нашем случае, далее следует mac порта узла. Ещё за 3 минуты пишется маленький скрипт, который получает на вход IP коммутатора и решает, является ли он граничным на основе всего вышеперечисленного.

Обращаем свой взгляд на мониторинг на базе Nagios, в котором каждый файл кольца содержит описание хостов этого кольца. Банальный grep IP адресов из файла:
$ grep address /path2/N1R1.cfg 
address	10.2.1.125;
address	10.2.1.253;
...

Нам мешают "address" и ";".
$ grep address /path2/N1R1.cfg | awk '{print $2}' | sed 's/;//'
10.2.1.125
10.2.1.253
...

Упрощаем.
$ awk /address/'{print $2}' /path2/N1R1.cfg | sed 's/;//'
10.2.1.125
10.2.1.253
...

Ещё упрощаем.
$ awk /address/'{gsub(";", "", $2);print $2}' /path2/N1R1.cfg
10.2.1.125
10.2.1.253
...

Отлично, теперь в цикле отдаём ранее написанному скрипту.
$ for ip in $(awk /address/'{gsub(";", "", $2);print $2}' /path2/N1R1.cfg); do ./edges.sh $ip; done
10.2.1.125
10.2.253.253

И, наконец, избавляемся от явного цикла.
$ awk /address/'{ gsub(";", "", $2); print $2}' /path2/N1R1.cfg | xargs -L 1 ./edges.sh
10.2.1.125
10.2.253.253

Выводы: большая часть времени потрачена на bash golf. В никуда.

Ну неужели данный вендор до сих пор не может корректно реализовать отдачу arp-таблиц по snmp. Ждать по минуте-три таблицу с catalyst 4948 — это ужасно. Более того, нет штатного механизма получить таблицу, не выполняя snmpwalk, потому как везде в oid перед IP хоста стоит age, а age вычислить никак невозможно до. Либо я чего-то не знаю и это "что-то" от меня искусно скрывают.
То лапы ломит, что хвост отваливается.

Обновление Indy в Delphi

Многие используют Indy 9 или Indy 10.0.X, но на самом деле эти версии являются далеко не актуальными и не лишенными различных багов.
Теперь я расскажу как вам обновить ваши компоненты Indy до актуальных ( на момент написания этой статьи актуальная версия была 10.5.5)
Итак, начнем.

Актуальная версия Indy находится только в SVN репозитории разработчиков, значит нам понадобится клиент SVN под Windows. Наиболее популярным клиентом является tortoisesvn, который можно скачать на сайте разработчика. Затем устанавливаем его. Для простоты можем в настройках (после установки) указать язык интерфейса русский. Перегружаемся. Теперь выберем место, где у нас будет располагаться папка с нашими актуальными компонентами, щелкаем правой клавишей мыши на свободном месте в проводнике и выбираем пункт TortoiseSVN->Экспорт… В появившемся окне в поле URL Хранилища впишите адрес репозитория Indy «https://svn.atozed.com:444/svn/Indy10/» в поле «Папка экспорта» выберите папку куда экспортировать компоненты. Затем нажмите ОК, у вас спросят логин с паролем в поле имя пользователя впишите «Indy-Public-RO», пароль указывать не нужно. Теперь дождитесь окончания операции.
Запустите Delphi , выберите в меню «Component»->»Install Packages». В появившемся списке снимите галки с всех пакетов Indy. И затем удалите все пакеты Indy в этом же списке, воспользовавшись кнопкой remove. Затем откройте окно настроек среды: меню «tools->options->Library Win32″ и удалите из строки Library path пути к исходным кодам Indy. Затем добавьте в Library path 3 пути:

1. «<папка, куда вы экспортировали репозиторий Indy>\branches\Tiburon\Lib\System«
2. «<папка, куда вы экспортировали репозиторий Indy>\branches\Tiburon\Lib\Core«
3. «<папка, куда вы экспортировали репозиторий Indy>\branches\Tiburon\Lib\Protocols«
Закройте Delphi. Далее найдите в папке, где у вас установлена Delphi исходные коды Indy. Обычно они располагаются в папке «<папка с Delphi>/sources/Indy» и удалите эту папку. Далее в папке Lib, которая располагается по адресу «<папка установки Delphi>/lib» удалите все файлы Indy (поиск по вхождению «Indy» вам в этом поможет).Теперь запустите Delphi, и откройте пакет «IndySystemX0.dpk» (где X – это ваша версия Delphi), который располагается по следующему адресу: «<папка, куда вы экспортировали репозиторий Indy>\branches\Tiburon\Lib\System» и скомпилируйте его. Далее откройте пакет «IndyCoreX0.dpk» (где X- это ваша версия Delphi) из папки «<папка, куда вы экспортировали репозиторий Indy>\branches\Tiburon\Lib\Core» и скомпилируйте его. Теперь откройте и скомпилируйте пакет «IndyProtocolsX0.dpk» (где X – это ваша версия Delphi) , который располагается в папке «<папка, куда вы экспортировали репозиторий Indy>\branches\Tiburon\Lib\Protocols«.Далее откройте пакет «dclIndyCoreX0.dpk», который располагается в папке «<папка, куда вы экспортировали репозиторий Indy>\branches\Tiburon\Lib\Core» и установите его, также установите пакет «dclIndyProtocolsX0.dpk» из папки «<папка, куда вы экспортировали репозиторий Indy>\branches\Tiburon\Lib\Protocols». Вот и все, поздравляю, теперь у вас установлена актуальная версия Indy.

cisco.com

Enable SNMP Community Strings
This procedure is the same for both routers and Cisco IOS software-based XL Catalyst Switches.

1.Telnet to the router:

prompt#telnet 172.16.99.20
2.Enter the enable password at the prompt in order to enter the enable mode:

Router>enable
Password:
Router#3.Display the running configuration and look for the SNMP information:

Router#show running-config
Building configuration...
....
.... Note: If no SNMP information is present, continue with these steps. If any SNMP commands are listed, you can modify or disable them.

4.Go into the configuration mode:

Router#configure terminal
Enter configuration commands, one per line. End
with CNTL/Z.
Router(config)#5.Use this command in order to enable the Read-only (RO) community string:

Router(config)#snmp-server community public RO where "public" is the Read-only community string.

6.Use this command in order to enable the Read-write (RW) community string:

Router(config)#snmp-server community private RW

where "private" is the Read-write community string.

7.Exit out of the configuration mode and return to the main prompt:

Router(config)#exit
Router#8.Write the modified configuration to nonvolatile RAM (NVRAM) to save the settings:

Router#write memory
Building configuration...
[OK]
Router#

Скучающий админ в отпуске — страшная сила. Хвастаюсь — допилил статистику домашнего роутера... ;)
home.infidel.name
Желательно оперой (есть спецэффекты специфичные, но ничего критичного), желательно в 1680 точек ширины (пилил под это, но работать будет прилично и от 1024, в 800 чуть-чуть не вписался). Желательно поелозить мышкой по графикам ;) И покликать тоже.
Сделано на базе MRTG, RRDTool, mrtg-rrd.cgi и чуть-чуть routers2.cgi. Доточенных нещадно напильником ;)

Каждый раз, работая с SNMP, мне хотелось посмотреть в глаза двум людям: M. Rose и K. McCloghrie. Посмотреть и спросить, какие наркотические вещества они принимали, разрабатывая те самые RFC, описывающие SNMP в общей концепции, а главное — что конкретно применялось в момент придумывания OID в том виде, в котором мы знаем их сейчас.

Угробил полчаса на поиски нигде недокументированных MIBs для UPS, ещё полчаса на поиск нужных мне OIDs.

настроил немножко себе snmpd, подцепил к cacti и нужный скрипт выдаёт с удалённой машинки всякую полезную стату по процессам (в основном вывод от ps)
список терниев:

надо было добавить в snmp.conf следующие параметры доступа:
rocommunity public
rwcommunity private
имена public и private разумно сменить на более секурные, да и вообще закрыть вход по портам от вражеского доступа.. :3

в том же конфиге надо было добавить в разделе Executables/scripts вызов стороннего скрипта:
exec echotest /usr/local/bin/test.sh
echotest — это дефолт..

собсна, сам скрипт, который для демона выдаёт загрузку проца:
#!/bin/bash
echo `ps axo pcpu,comm | grep "daemond$" | cut -d ' ' -f 1`

самое геморройное было найти правильный "адрес" для вызова: .1.3.6.1.4.1.2021.8.1.101.1
я так и не понял, где прописаны привязки чисел к текстовым значениям (в "словах" это выглядит, как enterprises.ucdavis.extTable.extEntry.extOutput.1), искать было влом, поэтому я собрал адрес из примера в конфиге и какого то примера из гугла..
ну и разница между snmpwalk и snmpget в том, что первый допускает любой уровень адресации и выводит все ключи с текущего и ниже, а второй хочет точное указание адреса, иначе ругается на ненайденные элементы..

результат:
$ snmpget -v2c -c public 127.0.0.1 .1.3.6.1.4.1.2021.8.1.101.1
UCD-SNMP-MIB::extOutput.1 = STRING: 10.6

тут наступает момент счастья, слава, признание, деньги, женщины, власть!!11
ЗЫЖ ещё очень хотелось получить результат, дёрнув какой-нить "ssh [email protected] /usr/local/bin/test.sh" >_>

накрадываются смутные подоздения, что snmpv3 очень уж редкая вещь.очень мало документации по нему. и практически никакой на русском.а уж скриптик надыбать для nagios что бы использовался v3 так вообще нереально.