Протокол SNMP в POSIX-операционных системах.

Вопросы написания собственного программного кода (на любых языках)

Модератор: Olej

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Протокол SNMP в POSIX-операционных системах.

Непрочитанное сообщение Olej » 06 дек 2012, 14:42

Код писать для обработки своих OID в SNMP мы не станем ;-) :
Olej писал(а): 4. После этого применяются автоматические генераторы кода, которые по описанным в MIB-файлах OID делают генерацию шаблонов кода обслуживания. Существует достаточно много сторонних пакетов генерации шаблонов кода на языках C, C++, Java, ... Один из таких генераторов в код C mib2c входит в состав пакета net-snmp-perl (мы определили это выше).

Код: Выделить всё

$ mib2c -h
...

Код: Выделить всё

$ env MIBS="+OLEJ-MANAGEMENT-MIB" mib2c -c mib2c.scalar.conf currentValue
writing to currentValue.h
writing to currentValue.c
running indent on currentValue.c
running indent on currentValue.h

Код: Выделить всё

$ env MIBS="+OLEJ-MANAGEMENT-MIB" mib2c -c mib2c.scalar.conf nextStep
writing to nextStep.h
writing to nextStep.c
running indent on nextStep.c
running indent on nextStep.h
Указание -c - это конфигурация того, какой тип генерации OID применить, в нашем случае это одиночное скалярное значение.
OID в SNMP бывают таких классов: скалярная переменная, таблица, уведомление (нотификация, Trap, InfoRequest).
Можно и не указывать явно -c, но тогда на вопросы mib2c нужно будет отвечать в диалоге.

Заготовлено довольно много конфигураций для разных типов OID, главным образом для разных представлений табличных OID:

Код: Выделить всё

$ cd /usr/share/snmp
$ ls -w100 mib2c*.conf
mib2c.access_functions.conf    mib2c.container.conf       mib2c.notify.conf
mib2c.array-user.conf          mib2c.create-dataset.conf  mib2c.old-api.conf
mib2c.check_values.conf        mib2c.emulation.conf       mib2c.perl.conf
mib2c.check_values_local.conf  mib2c.genhtml.conf         mib2c.raw-table.conf
mib2c.column_defines.conf      mib2c.int_watch.conf       mib2c.row.conf
mib2c.column_enums.conf        mib2c.iterate_access.conf  mib2c.scalar.conf
mib2c.column_storage.conf      mib2c.iterate.conf         mib2c.table_data.conf
mib2c.conf		         mib2c.mfd.conf
Всё! Сгенерировали:

Код: Выделить всё

$ ls *.h 
common.h  currentValue.h  nextStep.h 
$ ls *.c 
cli.c  currentValue.c  locl.c  nextStep.c  snmp.c 

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Протокол SNMP в POSIX-операционных системах.

Непрочитанное сообщение Olej » 06 дек 2012, 14:50

Olej писал(а): Всё! Сгенерировали:
Но это сгенерировали шаблоны кода обработчиков.
Это ещё нужно будет подредактировать под свои цели...

Но нужно ещё написать код главной задачи (main) субагента.
Субагент в терминологии SNMP - это локальная программа (демон) которому главный агент (snmpd) может передать на обработку запросы к OID, которые он не может обработать сам. Техника субагента в SNMP предполагает использование специального протокола AgentX. Это не вникая в детали (это всё можно найти на сайте net-snmp).

Код главной функции (main) приложения субагента практически одинаков для всех проектов, прототип его приводится на сайте проекта net-snmp (http://www.net-snmp.org/wiki/index.php/Tutorials), или, как вариант, может быть взят здесь: http://openhpi.sourceforge.net/subagent ... tml#AEN178. Поместим этот код в произвольный файл, назвав его, положим, srv_snmp.c.

Теперь остаётся код 2-х обработчиков и main() подрехтовать под специфику проекта, объединить вместе, и компилировать.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Протокол SNMP в POSIX-операционных системах.

Непрочитанное сообщение Olej » 06 дек 2012, 14:59

Olej писал(а):Теперь остаётся код 2-х обработчиков и main() подрехтовать под специфику проекта, объединить вместе, и компилировать.
К этой точке я практически сделал программу SNMP поддержки своего проекта (ещё не написавши ни строчки кода!).
Теперь мне нужно это причесать, после чего я выложу работающий вариант проекта.
(некоторая пауза)

SimpleUser
Писатель
Сообщения: 69
Зарегистрирован: 02 авг 2012, 14:22
Откуда: Москва
Контактная информация:

Re: Протокол SNMP в POSIX-операционных системах.

Непрочитанное сообщение SimpleUser » 07 дек 2012, 11:36

На свежую голову все snmp-пакеты встали, спасибо указкам Olej))

#yum info *snmp*
Output: net-snmp-agent-libs, net-snmp, net-snmp-libs, net-snmp-utils, net-snmp-perl, net-snmp-devel

Загвоздка была в версии пакетика perl-Scalar-List-Utils: нужна была последняя, 217, я же подсовывал 211, скачанную из другого репозитория. Пойду snmpwalk запущу.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Протокол SNMP в POSIX-операционных системах.

Непрочитанное сообщение Olej » 07 дек 2012, 13:17

SimpleUser писал(а):Пойду snmpwalk запущу.
Ну вот тут-то самое интересное только начинается ;-) - это всё будет не так просто.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Протокол SNMP в POSIX-операционных системах.

Непрочитанное сообщение Olej » 07 дек 2012, 15:02

Olej писал(а): К этой точке я практически сделал программу SNMP поддержки своего проекта (ещё не написавши ни строчки кода!).
SimpleUser писал(а):Пойду snmpwalk запущу.
Чтоб вам это веселее делалось ;-), я вам приложу архив тестового проекта (как о нём говорилось) в таком виде (совершенно промежуточном - draft) виде, как он сейчас находится.

Код: Выделить всё

[root@notebook snmp.5]# ./myagn
...
- вот это запустился собственный агент SNMP, так он запущен как master - вместо стандартного snmpd, это не есть хорошо, но он (одним оператором там в коде закомментированным) превращается в субагент для snmpd работающий в протоколе AgentX, и snmpd будет ему сбрасывать запросы SNMP, которые сам обработать не может (т.е. из наших MIB-файлов).

А вот мы к нему пообращаемся:

Код: Выделить всё

bash-4.2$ snmpget -v2c localhost -c public OLEJ-MANAGEMENT-MIB::currentValue.0
OLEJ-MANAGEMENT-MIB::currentValue.0 = INTEGER: -13

bash-4.2$ snmpget -v2c localhost -c public OLEJ-MANAGEMENT-MIB::nextStep.0
OLEJ-MANAGEMENT-MIB::nextStep.0 = INTEGER: 1

bash-4.2$ snmpget -v2c localhost -c public OLEJ-MANAGEMENT-MIB::nextStep.0
OLEJ-MANAGEMENT-MIB::nextStep.0 = INTEGER: 2

bash-4.2$ snmpget -v2c localhost -c public OLEJ-MANAGEMENT-MIB::nextStep.0
OLEJ-MANAGEMENT-MIB::nextStep.0 = INTEGER: 3

bash-4.2$ snmpwalk -v2c localhost -c public OLEJ-MIB::olej
OLEJ-MIB::olej.11.5.0 = INTEGER: -13
OLEJ-MIB::olej.11.7.0 = INTEGER: 4
OLEJ-MIB::olej.11.7.0 = No more variables left in this MIB View (It is past the end of the MIB tree)
1. Пока сделан доступ к переменным только по чтению;
2. В currentValue зашито константное значение -13;
3. А nextStep инкрементируется при каждом обращении;

Всё это видно в коде, и занимает по 1-2 оператору сверх сгенерированного автоматически шаблона.

P.S. Для того, чтобы это как-то заработало, нужно выполнить конфигурационные условия SNMP (это будет для любого проекта!), а они многочисленные и путанные:
- составить конфигурационный файл myagn.conf и помещение его в одно из мест, где он будет доступен программе myagn при старте, например, в /etc/snmp (начальным прототипом для myagn.conf может служить /etc/snmp/snmpd.conf);
- прописать в myagn.conf разрешения для доступа определённых сообществ (опция -c) к требуемым поддеревьям OID;
- поместить MIB-файлы в место, где они будут доступны и для root (т.е. не только утилитам SNMP, запускаемым от имени пользователя, но и агентам, запускаемым от root), например, /root/.snmp/mibs;
Одним словом, хлопотно это. ;-)
Вложения
snmp.tgz
(19.38 КБ) 341 скачивание

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Протокол SNMP в POSIX-операционных системах.

Непрочитанное сообщение Olej » 07 дек 2012, 15:18

Olej писал(а): Чтоб вам это веселее делалось ;-), я вам приложу архив тестового проекта (как о нём говорилось) в таком виде (совершенно промежуточном - draft) виде, как он сейчас находится.
А в дополнение (бонус! :lol:) я вам выложу файл .odt - это описание всего про SNMP, что говорилось здесь в теме + то, что ещё не говорилось ;-) - это более-менее причищенные итого черновых заметок моей предыдущей разработки SNMP, переписанные под условия тестовой задачи. Там не так много, нона 19 страниц набралось. Я пока не знаю, стану ли дальше доделывать как тестовую задачу, так и этот текст... но он вам будет существенной помощью (особенно вместе с предыдущим архивом тестового проекта - они согласованные). Все команды, показываемые в тексте - они проверены на свежих версиях, вот сейчас, непосредственно перед вписыванием.
Вложения
SMTP_104.odt
(42.05 КБ) 353 скачивания

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Протокол SNMP в POSIX-операционных системах.

Непрочитанное сообщение Olej » 07 дек 2012, 16:09

Olej писал(а): Синтаксические требования к записи MIB-файла жёстче, чем у любого языка программирования, и это занятие переведёт вам ещё немало крови.
Кстати, вот попалась ссылка: SMI и MIB - описание правил составления MIB-файлов, да ещё и на русском языке:
Описание MIB делится на модули, каждый модуль обычно размещается в отдельном текстовом файле и содержит конструкцию:
...
Раньше мне такое нигде не попадалось, приходилось изучать по оригинальной документации, а там не то, что проблема с языком, но там объём очень большой, уровень детализации - занудный, ничего не найдёшь что надо...
Так что вот этого короткого описания, кажется, будет вполне достаточно.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Протокол SNMP в POSIX-операционных системах.

Непрочитанное сообщение Olej » 07 дек 2012, 19:20

Olej писал(а):я вам приложу архив тестового проекта
Не забудьте в Makefile этого проекта вписать явно:

Код: Выделить всё

CC = gcc
А то попадёте в ту же засаду, что и я ... несколько дней голову ломаю, только сейчас обнаружил:

Код: Выделить всё

bash-4.2$ cc -V
cc: Sun C 5.12 Linux_i386 2011/11/16
Я устанавливал когда-то Solaris Studio, и оттуда компилятор Sun вызывается по дефаулту по "cc".
А он на дух не принимает некоторых опций, которые создаёт net-snmp-config:

Код: Выделить всё

bash-4.2$ net-snmp-config --cflags
-DNETSNMP_ENABLE_IPV6 -fno-strict-aliasing -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector
--param=ssp-buffer-size=4 -m32 -march=i686 -mtune=atom -fasynchronous-unwind-tables -D_RPM_4_4_COMPAT
-Ulinux -Dlinux=linux -D_REENTRANT -D_GNU_SOURCE -fno-strict-aliasing -pipe -fstack-protector -I/usr/local/include
-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -I/usr/lib/perl5/CORE -I. -I/usr/include
И я помню, что "это работало", а теперь это никак не работает, и вызывает большое замешательство ;-)

Правильный Makefile для этого пробного проекта должен выглядеть так:

Код: Выделить всё

CC = gcc
CFLAGS = `net-snmp-config --cflags`
BUILDAGENTLIBS = `net-snmp-config --agent-libs`
OBJS2 = subagent.o currentValue.o nextStep.o
PROGLIST = cli_locl cli_snmp myagn

all: prog
prog:  $(PROGLIST)

cli_locl: cli.c locl.c common.h
        $(CC) -lm cli.c locl.c -o $@
cli_snmp: cli.c snmp.c common.h
        $(CC) -lm cli.c snmp.c -o $@
myagn: $(OBJS2)
        $(CC) $(OBJS2) $(BUILDAGENTLIBS) -o $@
        rm -f *.o
subagent.o: subagent.c
        $(CC) $(CFLAGS) -c $< -o $@
currentValue.o: currentValue.c
        $(CC) $(CFLAGS) -c $< -o $@
nextStep.o: nextStep.c
        $(CC) $(CFLAGS) -c $< -o $@
clean:
        @rm -f *.o $(PROGLIST)

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Протокол SNMP в POSIX-операционных системах.

Непрочитанное сообщение Olej » 08 дек 2012, 02:03

Olej писал(а): А вот мы к нему пообращаемся:
Ещё одно предупреждение! (что-то я такого раньше не замечал ... версия net-snmp?):

Делаю get/set по одному и тому же OID, одинаковые команды:

Код: Выделить всё

bash-4.2$ snmpget -v2c localhost -c private OLEJ-MANAGEMENT-MIB::nextStep.0
OLEJ-MANAGEMENT-MIB::nextStep.0 = INTEGER: 2
bash-4.2$ snmpset -v2c localhost -c private OLEJ-MANAGEMENT-MIB::nextStep.0 i 33
No community name specified.
USAGE: snmpset [OPTIONS] AGENT OID TYPE VALUE [OID TYPE VALUE]...

  Version:  5.7.1
  Web:      http://www.net-snmp.org/
...
get - проходит, а set - будет ещё тут на 2 страницы help выводить по правильному синтаксису.
Т.е. для get синтаксис правильный, а для set - правильный.

Над толкованием этой головоломки можно поседеть! :-o

Теперь по-другому:

Код: Выделить всё

bash-4.2$ snmpset -v2c -c private 127.0.0.1 OLEJ-MANAGEMENT-MIB::nextStep.0 i 33
OLEJ-MANAGEMENT-MIB::nextStep.0 = INTEGER: 33
bash-4.2$ snmpget -v2c localhost -c private OLEJ-MANAGEMENT-MIB::nextStep.0
OLEJ-MANAGEMENT-MIB::nextStep.0 = INTEGER: 3
А так ему всё нравится!

Т.е. snmpset не понимает если опции, ключи (-c private) переставить местами с параметрами (localhost, 127.0.0.1).
Хотя этого (возможности перестановки, смешивать) требуют правила POSIX (POSIX.2).

Ответить

Вернуться в «Программирование»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя