реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> snmpd + mib + обработчик и все это на Linux, Посоветуйте хороший пример или мануал
Oops
сообщение Aug 19 2010, 15:14
Сообщение #1


Частый гость
**

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



Здравствуйте.

Нужно в сжатые сроки ознакомиться с snmpd демоном, разработать MIB базу а также обработчик этой MIB базы.
Посоветуйте хороший мануал или пример.

Есть ПК с Linux например Ubuntu, snmpd демон установил и настроил, благо по этой теме инфа есть в интернете. А вот как создать свою MIB базу и подключить ее к этому snmpd чтото не нашел. Да еще надо же обработчик MIB базы написать, это некая программа которая будет отслеживать изменения в MIB базе и реагировать на них, либо сама будет вносить изменения в эту MIB базу по необходимости. В общем во всем этом мне нужно разобраться, жду советов, полезных ссылок и мануалов.
Спасибо.
Go to the top of the page
 
+Quote Post
Olej
сообщение Aug 20 2010, 13:51
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 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, это даст вам отладку.

Удачи!


Go to the top of the page
 
+Quote Post
Oops
сообщение Aug 20 2010, 16:28
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 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, буду действовать. smile.gif
Go to the top of the page
 
+Quote Post
denyslb
сообщение Aug 21 2010, 22:51
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 111
Регистрация: 5-05-10
Из: Lebanon, Beirut
Пользователь №: 57 093



Как вариант еще можно использовать:
в 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 и т.д.
Go to the top of the page
 
+Quote Post
Oops
сообщение Aug 22 2010, 07:42
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 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 и т.д.

Спасибо.
Go to the top of the page
 
+Quote Post
Olej
сообщение Aug 22 2010, 14:15
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 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 и в его вики.
Go to the top of the page
 
+Quote Post
Oops
сообщение Sep 12 2010, 07:35
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Olej
сообщение Sep 14 2010, 10:12
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 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 там посложнее, есть несколько альтернативных примеров).

Go to the top of the page
 
+Quote Post
Oops
сообщение Sep 16 2010, 14:12
Сообщение #9


Частый гость
**

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



Цитата(Olej @ Sep 14 2010, 13:12) *
Можно, конечно, сделать и так, но ... это будет как-то уже слишком "через задницу":
- для каждого OID (или группы OID) вам нужно иметь собственную программу, запускаемую из скрипта...
- сама эта программа должна иметь энергонезависимое место хранения для значения OID...

Всё то же самое (но единым стандартным способом) делает AgentX субагент net-snmp.
На сайте проекта net-snmp есть готовые примеры, для скалярных OID там всё до безобразия просто - берём пример, и запускаем (с таблицами OID там посложнее, есть несколько альтернативных примеров).


Спасибо за советы, очень помогает мнение профессионалов. wink.gif
Go to the top of the page
 
+Quote Post
nvn
сообщение Dec 20 2010, 14:00
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 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 не подходит для этого
Go to the top of the page
 
+Quote Post
nvn
сообщение Dec 23 2010, 08:13
Сообщение #11


Участник
*

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



всем спасибо, проблема решена
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th July 2025 - 16:03
Рейтинг@Mail.ru


Страница сгенерированна за 0.01439 секунд с 7
ELECTRONIX ©2004-2016