![]() |
Модераторы: xvr |
![]() ![]() ![]() |
|
kyzia887 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 26.8.2011 Репутация: 1 Всего: 1 |
Собственно вопрос возник в следующем:
требуется написать расширение для net-snmp под linux на С++. В этом я новичок и хотел бы попросить у вас совета где и что можно почитать на данную тему. При написании клиента с использование этой библиотеки вопросов особо не возникло, а вот с расширением увы =( Сразу скажу что гуглил и неоднократно (парюсь этим вопросом уже 2й день), но результатов почти ни каких. Варианты с примерами на Перле или Питоне тоже не катят, тк я с ними вообще не работал. Сама задача заключается в следующем: при запросе по snmp (oid = произвольный набор к примеру задаю) мое расширение опрашивает некую программу и возвращает 1 - если та запущена, и 0 - если нет. Хотелось бы для примера хоть небольшой кусок кода глянуть чтобы понять как все это дело собрать воедино. Заранее благодарен. |
|||
|
||||
svlary |
|
||||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 207 Регистрация: 8.9.2009 Репутация: 4 Всего: 4 |
В свое время я написал целиком и менеджера и агента для SNMP, но было это очень давно - больше 10 лет назад, так что - увы, почти ничего не помню...
Не очень понятно, что Вы имеете в виду... В SNMP используется терминология :
А на официальном сайте смотрели ? net-snmp.org
Ну, на sourceforge я, по запросу "snmp" сразу нашел 376 результатов. ![]()
|
||||||
|
|||||||
kyzia887 |
|
||||
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 26.8.2011 Репутация: 1 Всего: 1 |
Да, перелопатил его. Как раз пример клиента / менеджера там неплохо на С описан и немного повозившись все заработало как часы, а вот расширение агента увы у них тока на перле.
Спасибо за инфу, щас буду разбираться что к чему ![]() |
||||
|
|||||
kyzia887 |
|
||||||||||||||
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 26.8.2011 Репутация: 1 Всего: 1 |
Разобрался с проблемой
![]() Net-SNMP поддерживает возможность использовать подгружаемый внешний модуль (далее - библиотека). Для того чтобы собрать данную библиотеку следует рассмотреть приведенный пример: http://www.net-snmp.org/wiki/index.php/TUT...Loadable_Object Опишу мои действия вкратце (может кому-нибудь пригодится еще): 1) Для начала написал как в примере 2 файла (заголовочный и исходного текста С): Заголовочный файл "SNMPExtended.h"
Файл исходного текста С "SNMPExtended.c"
2) Далее собираю все это дело в нашу библиотеку:
3) Проверяем конфигурацию net-snmp: Открываем файл /etc/snmp/snmpd.conf В моем случае он имеет следующий вид:
4) Далее создаем свой MIB-файл (отталкивался от примера): NET-SNM-ITELECT-MIB.txt
И закидываем наш новый MIB к остальным MIB-файлам: /usr/share/snmp/mibs/ После чего перезапускаем агент net-snmp: cd /etc/init.d/ ./snmpd restart 5) Проверяем структуру нашего нового MIB-файла: cd /usr/bin ./snmptranslate -M+. -mNET-SNMP-INTELECT-MIB -Tp -IR netSnmpIntelectMIB Получаем что-то вроде этого:
6) После всего выше перечисленного можно пойти двумя путями добавления нашей новой библиотеки в агент: - прописать ее в конфигурационном файле snmpd.conf (я выбрал этот вариант) (не нужно каждый раз регать наш внешний модуль) - выполнить 7 пунктов, описанных в мануале (ссылка вначале сообщения) (данный вариант работает только до тех пор, пока не перезагрузим агент net-snmp! После перезагрузки все настройки слетают!) В моем случае отредактированный конфигурационный файл стал выглядеть так: /etc/snmp/snmpd.conf
7) Перезапускаем агент net-snmp и запрашиваем необходимую нам информацию: cd /usr/bin ./snmpget -c public -v 2c localhost .1.3.6.1.4.1.8072.2.4.1.1.333.0 Получим: NET-SNMP-EXAMPLES-MIB::netSnmpExamples.4.1.1.333.0 = INTEGER: 333 Это сообщение отредактировал(а) kyzia887 - 30.8.2011, 14:52 |
||||||||||||||
|
|||||||||||||||
svlary |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 207 Регистрация: 8.9.2009 Репутация: 4 Всего: 4 |
Лично мне Ваше сообщение было очень интересным. Вспомнил - сколько сам мучился с этим делом, когда никакой net-snmp не было !
![]() Один момент не понял. Вот вы регистрируете функцию-обработчик данного OID:
Но где сама функция ? (SNMPExtended) Т.е. каким образом получается значение объекта { 1, 3, 6, 1, 4, 1, 8072, 2, 4, 1, 1, 333, 0 } и каким образом агент вызывает эту функцию ? При чтении и при записи... |
|||
|
||||
kyzia887 |
|
||||||||
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 26.8.2011 Репутация: 1 Всего: 1 |
Как описывается в мануале, мы описываем инициализацию нашей библиотеки по средствам
и должны описать выгрузку нашей библиотеки по окончании работы
т.е. общая структура получается void init_Название нашей библиотеки (void); и void deinit_Название (void); При запуске самого net-snmp (если в его конфигурационном файле прописано подключение нашей библиотеки) наша библиотека регистрируется и присваивает новому инстансу заданный в ней OID (естественно MIB файл тоже должен присутствовать как я писал ранее). После того как net-snmp запуститься можно обращаться к нашему новому элементу двумя способами:
Лично я дописал несколько строк кода для вывода конкретного значения по запросу: SNMPExtebded.cpp
Записывать значение так же как получать ![]() Единственный минус - я пока что не знаю как сделать эти данные обновляемыми, т.е. в моем случае размер БД запишется в переменную только при инициализации библиотеки и все, и если мы к примеру при старте не смогли подключиться к БД то в значении будет висеть 0 и он уже не обновиться даже если подключение вновь появится =( Может конечно нужно настраивать сам net-snmp, пока не знаю... Думаю над этим вопросом. Тут еще возникает необходимость в обработке netsnmpset, т.е. чтобы не ставить это значение в переменную. а производить какие-то манипуляции скажем с БД и не более (значение инстанса при этом должно остаться прежним)... Это сообщение отредактировал(а) kyzia887 - 31.8.2011, 10:06 |
||||||||
|
|||||||||
fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: 2 Всего: 1 |
kyzia887, спасибо, интересная статья.. плюсанул..
-------------------- undefined |
|||
|
||||
svlary |
|
||||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 207 Регистрация: 8.9.2009 Репутация: 4 Всего: 4 |
Вот здесь :
Т.е, получается, что Вы регистрируете не функцию доступа, а переменную, хранящую значение для MIB. Действительно, у Вас она получает значение только при инициализации всей MIB. Мой вопрос был как раз про это... Насколько я помню, мне пришлось найти обработчик
Вставить туда проверку на код нашей фирмы. Если код совпадал, то вызывался мой обработчик оставшейся части OID, который и делал проверку на то, какая именно переменная обрабатывается и что с ней надо делать (код запроса). И только после этого реализовывалась семантика запроса.... |
||||||
|
|||||||
kyzia887 |
|
||||||||||
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 26.8.2011 Репутация: 1 Всего: 1 |
Разобрался с обработкой (по крайней мере на данном этапе мне этого должно хватить) ![]() Пришлось переписать немного код. Теперь он выглядит следующим образом: SNMPExtended.h
SNMPExtended.cpp
Прокомментировал все что могло бы вызвать вопросы в самом коде. MIB-файл и настройки net-snmp не трогал. Данный вариант обрабатывает каждый запрос который поступает от клиента/менеджера:
Надеюсь не зря разгребал эту штуку ![]() ![]() |
||||||||||
|
|||||||||||
svlary |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 207 Регистрация: 8.9.2009 Репутация: 4 Всего: 4 |
||||
|
||||
kyzia887 |
|
||||||||||||
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 26.8.2011 Репутация: 1 Всего: 1 |
Довинтил во все выше описанное еще создание таблицы.
MIB-файл теперь имеет следующую структуру: NET-SNM-ITELECT-MIB.txt
Проверяем структуру нового MIB-файла (см. выше) и должны получить что-то вроде этого:
Конфигурационный файл Net-SNMP стал выглядеть так (подключаю дополнительный новый модуль, который будет создавать таблицу): snmpd.conf
Сам код имеет следующий вид: MyTestTables.h
MyTestTables.cpp
При запросе информации получим следующее:
Если возникнут вопросы, пишите, попробую объяснить или разбраться что к чему ![]() |
||||||||||||
|
|||||||||||||
kyzia887 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 26.8.2011 Репутация: 1 Всего: 1 |
Небольшое дополнение по таблицам
![]() Для того чтобы таблица каждый раз пересоздавала строки переписал код следующим образом: MyTestTables.cpp
Все остальное осталось прежним. Всем успехов ![]() Это сообщение отредактировал(а) kyzia887 - 9.9.2011, 10:39 |
|||
|
||||
azote |
|
|||
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 30.10.2012 Репутация: нет Всего: нет |
Спасибо за статью.
Есть такой вопрос. Могу ли я как-то создать обработчик всех OID'ов начиная с определенного, например, .1.3.6.1.4.1.8072...., и уже в своем обработчике перебирать дочерние номера и решать какому из них какое значение устанавливать? Ведь, как я понял, у Вас в примере показывается, как обрабатывать определенные значения OID'ов. И еще вопрос. Могу ли я создать подобное расширение агента без внедрение соответствующего MIB-модуля? |
|||
|
||||
kyzia887 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 26.8.2011 Репутация: 1 Всего: 1 |
Вот на счет первого вопроса к сожалению не подскажу, т.к. сам это задачу не решал, а по поводу внедрения MIB-файла, то вроде бы можно и без него. ![]() |
|||
|
||||
igormat |
|
|||
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 17.9.2013 Репутация: нет Всего: нет |
Добрый день, а никто не может посоветовать литературу по Net-SNMP с точки зрения девелоперов? А то туториалы на официальном сайте очень скудные.
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "С/С++: Программирование под Unix/Linux" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |