|
|
  |
snmpd + mib + обработчик и все это на Linux, Посоветуйте хороший пример или мануал |
|
|
|
Aug 20 2010, 13:51
|
Местный
  
Группа: Свой
Сообщений: 351
Регистрация: 11-09-05
Из: Харьков
Пользователь №: 8 458

|
Цитата(Oops @ Aug 19 2010, 18:14)  Нужно в сжатые сроки ознакомиться с snmpd демоном, разработать MIB базу а также обработчик этой MIB базы. Посоветуйте хороший мануал или пример.
Есть ПК с Linux например Ubuntu, snmpd демон установил и настроил, благо по этой теме инфа есть в интернете. А вот как создать свою MIB базу и подключить ее к этому snmpd чтото не нашел. Да еще надо же обработчик MIB базы написать, это некая программа которая будет отслеживать изменения в MIB базе и реагировать на них, либо сама будет вносить изменения в эту MIB базу по необходимости. В общем во всем этом мне нужно разобраться, жду советов, полезных ссылок и мануалов. 1. динамически добавить свои MIB определения к snmpd не получится, он (snmpd) это не умеет... 2. есть 2 способа: а). пересборка стандартного snmpd с указанием добавления своих MIB + б). демон протокола agent-X для snmpd - это стандартный путь; 3. рекомендую сразу двигаться путём 2 - это во многом перспективнее... 4. документация с примерами есть более чем в достатке на вики оригинального сайта net-snmp, по этим примерам сами напишете Agent-X легко (я сделал это быстро, и далее не один раз...) Некоторые советы: 1. обратите внимание, что OID в MIB - это чистая формальность, snmpd или Agent-X будут понимать только численные OID; 2. пишите для начала Agent-X для скалярных OID, и только опробовав добавляйте по необходимости табличные (там есть несколько альтернативных видов табличных OID, внимание: число их зависит от версии snmpd!). 3. установите для разработки пакеты net-snmp-devel.i686 , net-snmp-libs.i686 , net-snmp-utils.i686 - они в Linux обычно не ставятся по умолчанию. 4. не забудьте разрешить для snmpd протокол Agent-X в конфигурационном файле snmpd (/etc/snmpd.conf или где вы его используете), это делается 1-й строкой... 5. перезапускайте штатный snmpd при отработке в режиме "не демон" - ключи -fE, это даст вам отладку. Удачи!
|
|
|
|
|
Aug 20 2010, 16:28
|

Частый гость
 
Группа: Участник
Сообщений: 129
Регистрация: 28-08-08
Из: г.Омск
Пользователь №: 39 870

|
Цитата(Olej @ Aug 20 2010, 17:51)  1. динамически добавить свои MIB определения к snmpd не получится, он (snmpd) это не умеет... 2. есть 2 способа: а). пересборка стандартного snmpd с указанием добавления своих MIB + б). демон протокола agent-X для snmpd - это стандартный путь; 3. рекомендую сразу двигаться путём 2 - это во многом перспективнее... 4. документация с примерами есть более чем в достатке на вики оригинального сайта net-snmp, по этим примерам сами напишете Agent-X легко (я сделал это быстро, и далее не один раз...)
Некоторые советы: 1. обратите внимание, что OID в MIB - это чистая формальность, snmpd или Agent-X будут понимать только численные OID; 2. пишите для начала Agent-X для скалярных OID, и только опробовав добавляйте по необходимости табличные (там есть несколько альтернативных видов табличных OID, внимание: число их зависит от версии snmpd!). 3. установите для разработки пакеты net-snmp-devel.i686 , net-snmp-libs.i686 , net-snmp-utils.i686 - они в Linux обычно не ставятся по умолчанию. 4. не забудьте разрешить для snmpd протокол Agent-X в конфигурационном файле snmpd (/etc/snmpd.conf или где вы его используете), это делается 1-й строкой... 5. перезапускайте штатный snmpd при отработке в режиме "не демон" - ключи -fE, это даст вам отладку.
Удачи! Большое спасибо Olej, буду действовать.
|
|
|
|
|
Aug 22 2010, 07:42
|

Частый гость
 
Группа: Участник
Сообщений: 129
Регистрация: 28-08-08
Из: г.Омск
Пользователь №: 39 870

|
Цитата(denyslb @ Aug 22 2010, 02:51)  Как вариант еще можно использовать: в snmpd.conf
pass MIBOID PROG (или еще лучше pass_persists)
В итоге можно указывать какие либо "под"-OID, т.е. скажем если
pass_persist .1.3.6.1.4.1.5835 /bin/passtest --persist
И ваша программа может динамически отвечать на .1.3.6.1.4.1.5835.123 или .1.3.6.1.4.1.5835.5.6.87.2 и т.д. Спасибо.
|
|
|
|
|
Aug 22 2010, 14:15
|
Местный
  
Группа: Свой
Сообщений: 351
Регистрация: 11-09-05
Из: Харьков
Пользователь №: 8 458

|
Цитата(denyslb @ Aug 22 2010, 01:51)  Как вариант еще можно использовать: в snmpd.conf
pass MIBOID PROG (или еще лучше pass_persists)
В итоге можно указывать какие либо "под"-OID, т.е. скажем если
pass_persist .1.3.6.1.4.1.5835 /bin/passtest --persist
И ваша программа может динамически отвечать на .1.3.6.1.4.1.5835.123 или .1.3.6.1.4.1.5835.5.6.87.2 и т.д. Да, и это как простейший случай подключения действий на скалярные OID. Но всё это есть в достатке и в примерах на сайте net-snmp и в его вики.
|
|
|
|
|
Sep 12 2010, 07:35
|

Частый гость
 
Группа: Участник
Сообщений: 129
Регистрация: 28-08-08
Из: г.Омск
Пользователь №: 39 870

|
Здравствуйте! Сделал следующее, написал скрипт test.sh и подключил его в snmpd.conf. test.sh: Код #!/bin/bash # REQUEST_OID="$2" echo "$REQUEST_OID"; case "$REQUEST_OID" in .1.3.6.1.4.1.1958.1.0) echo "string"; echo "TransmitDevice"; exit 0;; .1.3.6.1.4.1.1958.2.0) echo "string"; echo "1.3.6.1.4.1.1958.7.2.2"; exit 0;; .1.3.6.1.4.1.1958.3.0) echo "integer"; echo "123"; exit 0;; .1.3.6.1.4.1.1958.4.0) echo "integer"; echo "100"; exit 0;; .1.3.6.1.4.1.1958.5.0) echo "integer"; echo "2"; exit 0;; .1.3.6.1.4.1.1958.6.0) echo "integer"; echo "3"; exit 0;; *) echo "string"; echo "$@"; exit 0;; esac exit Добавил в /etc/snmp/snmpd.conf: Код syslocation Ubuntu syscontact ”Adminstrator < >” rocommunity public 127.0.0.1
### Проверка агента скриптом pass .1.3.6.1.4.1.1958 /bin/bash /usr/local/bin/test.sh Перезагрузил snmpd демон. Делаю запросы на указаные в скрипте OID и получаю ответы: Код $ snmpget -v 2c -c public 127.0.0.1 .1.3.6.1.4.1.1958.1.0 SNMPv2-SMI::enterprises.1958.1.0 = STRING: "TransmitDevice" $ snmpget -v 2c -c public 127.0.0.1 .1.3.6.1.4.1.1958.2.0 SNMPv2-SMI::enterprises.1958.2.0 = STRING: "1.3.6.1.4.1.1958.7.2.2" $ snmpget -v 2c -c public 127.0.0.1 .1.3.6.1.4.1.1958.3.0 SNMPv2-SMI::enterprises.1958.3.0 = INTEGER: 123 $ snmpget -v 2c -c public 127.0.0.1 .1.3.6.1.4.1.1958.4.0 SNMPv2-SMI::enterprises.1958.4.0 = INTEGER: 100 $ snmpget -v 2c -c public 127.0.0.1 .1.3.6.1.4.1.1958.5.0 SNMPv2-SMI::enterprises.1958.5.0 = INTEGER: 2 Ответы приходят, скрипт срабатывает. А можно сделать так чтобы скрипт не только отвечал на GET запросы, но и реагировал на SET запросы. Тоесть пришла команда изменить переменную по OID .1.3.6.1.4.1.1958.5.0 на 3, скрипт анализируя значение переменной реагирует определенным образом (запускает определенную программу, генерирует определенный ответ), если пришла команда изменить пременную на 2 реагирует другим образом и т.д. Спасибо.
Сообщение отредактировал Oops - Sep 12 2010, 07:39
|
|
|
|
|
Sep 14 2010, 10:12
|
Местный
  
Группа: Свой
Сообщений: 351
Регистрация: 11-09-05
Из: Харьков
Пользователь №: 8 458

|
Цитата(Oops @ Sep 12 2010, 10:35)  Ответы приходят, скрипт срабатывает. А можно сделать так чтобы скрипт не только отвечал на GET запросы, но и реагировал на SET запросы. Тоесть пришла команда изменить переменную по OID .1.3.6.1.4.1.1958.5.0 на 3, скрипт анализируя значение переменной реагирует определенным образом (запускает определенную программу, генерирует определенный ответ), если пришла команда изменить пременную на 2 реагирует другим образом и т.д. Можно, конечно, сделать и так, но ... это будет как-то уже слишком "через задницу": - для каждого OID (или группы OID) вам нужно иметь собственную программу, запускаемую из скрипта... - сама эта программа должна иметь энергонезависимое место хранения для значения OID... Всё то же самое (но единым стандартным способом) делает AgentX субагент net-snmp. На сайте проекта net-snmp есть готовые примеры, для скалярных OID там всё до безобразия просто - берём пример, и запускаем (с таблицами OID там посложнее, есть несколько альтернативных примеров).
|
|
|
|
|
Sep 16 2010, 14:12
|

Частый гость
 
Группа: Участник
Сообщений: 129
Регистрация: 28-08-08
Из: г.Омск
Пользователь №: 39 870

|
Цитата(Olej @ Sep 14 2010, 13:12)  Можно, конечно, сделать и так, но ... это будет как-то уже слишком "через задницу": - для каждого OID (или группы OID) вам нужно иметь собственную программу, запускаемую из скрипта... - сама эта программа должна иметь энергонезависимое место хранения для значения OID...
Всё то же самое (но единым стандартным способом) делает AgentX субагент net-snmp. На сайте проекта net-snmp есть готовые примеры, для скалярных OID там всё до безобразия просто - берём пример, и запускаем (с таблицами OID там посложнее, есть несколько альтернативных примеров). Спасибо за советы, очень помогает мнение профессионалов.
|
|
|
|
|
Dec 20 2010, 14:00
|
Участник

Группа: Участник
Сообщений: 56
Регистрация: 8-02-05
Пользователь №: 2 486

|
прошу прощения, но можно и я спрошу? нужна помощь по NET-SNMP. Собрал snmpd с поддержкой AgentX, запустил моего субагента, он подключается к мастеру и скалярные OID'ы работают. Сейчас пытаюсь сделать вывод таблицы по принципу data_set таблица тоже заработала, но проблемма в том, что не могу получить первый столбец, вывод идет сразу со второго. делаю следующее:
init_nstAgentSubagentObject() { static oid alarmTable_oid[] = { 1, 1, 2 }; size_t alarmTable_oid_len = OID_LENGTH(alarmTable_oid); netsnmp_table_data_set *table_set; netsnmp_table_row *row;
table_set = netsnmp_create_table_data_set("alarmTable"); table_set->table->store_indexes = 1; // пробовал и = 0
netsnmp_table_dataset_add_index(table_set, ASN_UNSIGNED); netsnmp_table_set_add_default_row(table_set, 2, ASN_OCTET_STR, 0, NULL, 0); netsnmp_register_table_data_set(netsnmp_create_handler_registration ("alarmTable", alarmTable_handler, alarmTable_oid, alarmTable_oid_len, HANDLER_CAN_RWRITE), table_set, NULL);
row = netsnmp_create_table_data_row(); default_num = 1; netsnmp_table_row_add_index(row, ASN_UNSIGNED, &default_num, sizeof(default_num)); netsnmp_set_row_column(row, 2, ASN_OCTET_STR, "Test1", strlen("Test1"));
netsnmp_table_dataset_add_row(table_set, row); }
после этого вижу только начиная со второго столбца т.е. >snmpwalk -v 1 -On -c public 192.168.0.139 1.1.2 .1.1.2.1.2.1 = STRING: "Test1" а где первый столбец? .1.1.2.1.1.1 = 1 ???? т.е. как в таблице ifTable???
пробовал добавлять netsnmp_table_set_add_default_row(table_set, 1, ASN_UNSIGNED, 0, NULL, 0); вообще перестает отвечать на ветку .1.1.2
может кто знает в чем проблема? подскажите пожалуйста
ЗЫ: начал уж думать что data_set не подходит для этого
|
|
|
|
|
Dec 23 2010, 08:13
|
Участник

Группа: Участник
Сообщений: 56
Регистрация: 8-02-05
Пользователь №: 2 486

|
всем спасибо, проблема решена
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|