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

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

Модератор: Olej

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

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

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

Olej писал(а):Я пока не знаю, стану ли дальше доделывать как тестовую задачу, так и этот текст...
Доделал ;-)
Теперь там работающий тестовый проект, как описывался вначале ... модель примитивной системы авторегулирования.
Данные по SNMP и пишутся и читаются, можно всё это наблюдать runtime.
Текстовое описание адекватно архиву примера.

Вот как теперь выполняются (с отладочной диагностикой, ключ -v):

- локальный пример:

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

bash-4.2$ ./cli_locl  -v
команда (h-подсказка): =13
новое значение = 13
0 +13 => 13
команда (h-подсказка): =3
новое значение = 3
13 -10 => 3
команда (h-подсказка): *1.4
усиление = 1.4
команда (h-подсказка): =7
новое значение = 7
3 +6 => 9
9 -3 => 6
6 +1 => 7
команда (h-подсказка): ?
текущее значение = 7
команда (h-подсказка): q
- пример точно так же работающий по SNMP:

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

bash-4.2$ ./cli_snmp localhost -v
host: localhost, currentValue OID=.1.3.6.1.4.1.9876.11.5, nextStep OID=.1.3.6.1.4.1.9876.11.7
команда (h-подсказка): ?
SNMPv2-SMI::enterprises.9876.11.5.0 = INTEGER: 13
текущее значение = 13
команда (h-подсказка): =3
новое значение = 3
SNMPv2-SMI::enterprises.9876.11.5.0 = INTEGER: 13
SNMPv2-SMI::enterprises.9876.11.5.0 = INTEGER: 13
13 -10 => 3
SNMPv2-SMI::enterprises.9876.11.7.0 = INTEGER: -10
SNMPv2-SMI::enterprises.9876.11.5.0 = INTEGER: 3
команда (h-подсказка): ?
SNMPv2-SMI::enterprises.9876.11.5.0 = INTEGER: 3
текущее значение = 3
команда (h-подсказка): *1.4
усиление = 1.4
команда (h-подсказка): =7
новое значение = 7
SNMPv2-SMI::enterprises.9876.11.5.0 = INTEGER: 3
SNMPv2-SMI::enterprises.9876.11.5.0 = INTEGER: 3
3 +6 => 9
SNMPv2-SMI::enterprises.9876.11.7.0 = INTEGER: 6
SNMPv2-SMI::enterprises.9876.11.5.0 = INTEGER: 9
9 -3 => 6
SNMPv2-SMI::enterprises.9876.11.7.0 = INTEGER: -3
SNMPv2-SMI::enterprises.9876.11.5.0 = INTEGER: 6
6 +1 => 7
SNMPv2-SMI::enterprises.9876.11.7.0 = INTEGER: 1
SNMPv2-SMI::enterprises.9876.11.5.0 = INTEGER: 7
команда (h-подсказка): ?
SNMPv2-SMI::enterprises.9876.11.5.0 = INTEGER: 7
текущее значение = 7
команда (h-подсказка): q
Всё идёт по тем же шагам!

(в архиве есть файлы *.hist - это протоколы работы команд по мере развития задачи - там всё можно разобраться)

P.S. SimpleUser, можете взять это за основу - этого вам хватит, чтобы построить любую систему SNMP.
Вложения
snmp.tgz
(23.82 КБ) 428 скачиваний
SMTP_105.odt
(63.54 КБ) 423 скачивания

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

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

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

Olej писал(а):этого вам хватит, чтобы построить любую систему SNMP.
Там (и в тексте, и в примерах) для полноты нет только 2-х вещей:
1. отсылки асинхронных уведомлений SNMP (trap или info);
2. программного кода SNMP клиента (менеджера)

По поводу п.1 - это достаточно просто (хотя намудрено, как всё в SNMP ;-) , для того, чтобы начально понять).

По поводу п.2 здесь интереснее:
- редко нужно писать свой код SNMP-менеджера, для наблюдения SNMP-событий и получения SNMP-trap есть очень немало хороших SNMP-менеджеров от сторонних изготовителей, с GUI, много их для Windows (кому удобнее из этой системы наблюдать);
- в своих кодах примеров (выше) я схитрил :lol: : вместо того, чтобы писать SNMP-код, запускаются дочерние процессы snmpget & snmpset (через вызов POSIX popen() - это очень сродни system(), кто не сталкивался) - это тоже достойный способ выполнить какие-то клиентские функции SNMP когда их немного...
- а если уж сильно надо код SNMP-менеджера писать, то на сайте net-snmp есть пример достаточный (http://www.net-snmp.org/wiki/index.php/ ... pplication + http://www.net-snmp.org/tutorial/tutori ... pdemoapp.c) собирается приложение snmpdemoapp - чтоб убедиться, что это достаточно громоздко и противно ... но возможно.

Я как будет минимум незанятого времени сделаю кой-какие дополнения и по п.1 и по п.2 и выкину сюда в тему.

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

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

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

Olej, как же вообще конфигурируется служба SNMP в Linux? Несколько непонятно зачем нужен файл snmpd.conf кроме установки защиты доступа для группы имён public :-?
А где же прописываются пути для поиска демоном snmpd файлов MIB? Где их размещать?

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

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

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

SimpleUser писал(а):как же вообще конфигурируется служба SNMP в Linux?
Это безумно противное занятие! :lol:
(но Linux здесь не при чём - это свойство SNMP)
SimpleUser писал(а):Несколько непонятно зачем нужен файл snmpd.conf кроме установки защиты доступа для группы имён public :-?
snmpd.conf - это очень важный конфиг, там могут определяться новые (свои) community, их доступы, права чтения/записи и др., важнейшее здесь: нужно явно разрешить протокол agentx для своих субагентов.

snmtrapd.conf - определяет кому, как и когда посылать уведомления (trap & info), и что делать по получения уведомлений.
SimpleUser писал(а):А где же прописываются пути для поиска демоном snmpd файлов MIB? Где их размещать?
Есть несколько зарезервированных путей для поиска MIB.
Менять их и дополнять противно и сложно.
Об этом коротко написано в тексте .odt по SNMP, который я для вас составил.
(можете для начала поместить их в $HOME/.snmp/mibs, если какого каталога нет на этом пути - создайте)

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

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

Непрочитанное сообщение SimpleUser » 11 янв 2013, 15:30

Я создал файл вида OLEJ-MANAGEMENT-MIB.txt, где в числе прочих описываются переменные hostIpAddress и hostName. Наверное эти переменные дублируют уже существующие переменные MIB c IP-адресом(atTable.atNetAddress) и именем хоста(не знаю название). Тогда никакой смысловой нагрузки они значит не несут?
Стоит ли задать переменной hostIpAddress значение по умолчанию и можно ли это сделать? Чтобы по запросу она действительно выдавала IP-адрес хоста?
А если адресов несколько? Можно ли привязать данные этой переменной к выводу

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

#ip address
?

Ещё хотелось бы узнать, действительно ли имена описаний модулей в команде snmptranslate должны начинаться с "+"? В библиотеке net-snmp много файлов, имена которых начинаются с "+". Это тоже файлы MIB или какие-то скрипты библиотеки?

Edit: понимаю, что не совсем точно сформулировал вопрос. Подкорректирую))
Последний раз редактировалось SimpleUser 11 янв 2013, 17:37, всего редактировалось 1 раз.

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

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

Непрочитанное сообщение Olej » 11 янв 2013, 16:44

SimpleUser писал(а):Я создал файл вида OLEJ-MANAGEMENT-MIB.txt,
Нет, вы уж лучше создавайте MIB-файлы вида SimpleUser-MANAGEMENT-MIB.txt :lol:
SimpleUser писал(а): где в числе прочих описываются переменные hostIpAddress и hostName. Наверное эти переменные дублируют уже существующие переменные MIB c IP-адресом(atTable.atNetAddress) и именем хоста(не знаю название).
Переменные в MIB не могут дублировать друг друга (если только вы очень сильно не постараетесь) - их OID находятся в разных ветках дерева OID-ов (а MIB-файлы и именованные переменные в них - это вообще только для удобства человека, SNMP агент про них ничего и не знает). У вас может быть хоть сотня переменных с именем XXX, если предшествующие им имена (префикс) различаются.
SimpleUser писал(а): Тогда никакой смысловой нагрузки они значит не несут?
Система (SNMP агент) ничего вообще не знает runtime о каких-то именах - она знает только числовые OID-ы.
Утилиты, менеджеры (snmpget, snmpset, snmpwalk, ...) тоже в IP пакетах используют только обращения по числовым OID-ам. А для удобства пользователя они в терминальном выводе трансформируют OID-ы в имена (если эти OID попадают в доступные утилитам MIB-файлы для такой трансформации).

Естественно, что при этом любой смысл именам придаёт только человек, и они могут быть любыми (с синтаксическими ограничениями MIB-файлов, например: начинаться только с маленькой буквы, ... не использовать русскую литеру 'ь' в MIB и т.п.). Смысла за ними особого нет.
SimpleUser писал(а): Стоит ли задать переменной hostIpAddress значение по умолчанию и можно ли это сделать? Чтобы по запросу она действительно выдавала IP-адрес хоста?
Нужно соответствующему OID присвоить значение (так как это делается в моих примерах).
SimpleUser писал(а): А если адресов несколько? Можно ли привязать данные этой переменной к выводу

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

#ip address
?
Это хороший вопрос... ;-) "адресов несколько" это у кого? сетевой хост не имеет IP, IP имеет сетевой интерфейс.
Вот для примера:

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

bash-4.2$ ip address
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
    link/ether 00:15:60:c4:ee:02 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.5/24 brd 192.168.1.255 scope global eth0
    inet6 fe80::215:60ff:fec4:ee02/64 scope link 
       valid_lft forever preferred_lft forever
3: wlan0: <BROADCAST,MULTICAST> mtu 1500 qdisc mq state DOWN qlen 1000
    link/ether 00:13:02:69:70:9b brd ff:ff:ff:ff:ff:ff
7: ppp0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 3
    link/ppp 
    inet 77.52.90.118 peer 80.255.73.34/32 brd 77.52.90.118 scope global ppp0
Какой IP будем присваивать?: 192.168.1.5 ? 77.52.90.118? ... 127.0.0.1?

А ещё я могу сделать так:

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

bash-4.2$ sudo ifconfig eth0:0 172.1.2.5
bash-4.2$ sudo ifconfig eth0:1 10.1.2.5
И тогда один сетевой интерфейс поимеет несколько IP (из разных подсетей ... или из одной):

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

bash-4.2$ ip addr
...
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
    link/ether 00:15:60:c4:ee:02 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.5/24 brd 192.168.1.255 scope global eth0
    inet 172.1.2.5/16 brd 172.1.255.255 scope global eth0:0
    inet 10.1.2.5/8 brd 10.255.255.255 scope global eth0:1
См. алиасные IP

Если любая переменная MIB может иметь несколько значений, и тем более, если это "несколько" может динамически менятся по времени - то для такой переменной должен быть определён тип в MIB таблица.
P.S. Работа с таблицами в собственном коде агента/субагента SNMP - намного сложнее, чем с отдельными скалярными переменными MIB. В net-snmp предоставляется несколько альтернативных (на выбор) моделей и API для работы с таблицами.

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

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

Непрочитанное сообщение Olej » 11 янв 2013, 17:36

SimpleUser писал(а): Ещё хотелось бы узнать, действительно ли имена описаний модулей в команде snmptranslate должны начинаться с "+"?
Загляните внутрь в MIB-файлы - нет там "+" перед именем. Вот:

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

bash-4.2$ head -n5 ~/.snmp/mibs/OLEJ-MANAGEMENT-MIB.txt 
OLEJ-MANAGEMENT-MIB DEFINITIONS ::= BEGIN

IMPORTS
    OBJECT-TYPE, NOTIFICATION-TYPE, 
    MODULE-IDENTITY, Integer32,
OLEJ-MANAGEMENT-MIB.txt - это имя файла, OLEJ-MANAGEMENT-MIB в начале файла - имя определения MIB, с именем файла не имеет ничего общего (просто совпадает ... случайно ;-) ... чтоб не выдумывать), никакого "+" там нет (ни там, ни там).

"+" - это в опции snmptranslate, в смысле "добавить", а не "заменить" ... вот из каких-то давних моих опытом, где я подсмотрел не помню:

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

bash-4.2$ snmptranslate -On -m +OLEJ-MANAGEMENT-MIB -IR currentValue
.1.3.6.1.4.1.9876.11.5
Но может это и неправильно, может и -m OLEJ-MANAGEMENT-MIB имело бы тот же эффект. Не помню, а разбираться с такой мелочёвкой не хочется. :-?
SimpleUser писал(а): В библиотеке net-snmp много файлов, имена которых начинаются с "+". Это тоже файлы MIB или какие-то скрипты библиотеки?
Пример?
Какой каталог? - точный путь...
Я не видел.

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

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

Непрочитанное сообщение SimpleUser » 15 янв 2013, 17:15

SimpleUser писал(а):Я создал файл вида OLEJ-MANAGEMENT-MIB.txt, где в числе прочих описываются переменные hostIpAddress и hostName. Наверное эти переменные дублируют уже существующие переменные MIB c IP-адресом(atTable.atNetAddress) и именем хоста(не знаю название). Тогда никакой смысловой нагрузки они значит не несут?
Стоит ли задать переменной hostIpAddress значение по умолчанию и можно ли это сделать? Чтобы по запросу она действительно выдавала IP-адрес хоста?
Этот вопрос у меня возник, потому что я хочу научиться получать из какого-либа OID адрес(адреса) своего единственного сетевого интерфейса em1. Начав исследование доступных мне на хосте OID-ов и соответствующих им переменных MIB я сильно удивился, выяснив, что мне доступны значения OID-ов только группы system. А для других групп заготовки в mib-файлах вроде бы есть, но агент о соответствующих их oid значениях ничего не знает. Я пытался получить значение, соответствующее переменной udpInDatagrams. Видно, что такой oid вроде бы определён, но тем не менее агент почему-то ничего в нём не находит:
snmpget_udp.png
snmpget_udp.png (54.89 КБ) 6589 просмотров
,а в версии 1, на которую я надеялся, даже mib-описания такого нет. Результаты snmptranslate выдаются для версии snmp 3 наверное?
Здесь возникает вопрос: а в каком файле(файлах) сохраняются значения OID?

Во всей группе udp, впрочем, тоже все oid группы почему-то не инициализированы. То же касается и других групп дерева snmp, а группа at(1.3.6.1.2.1.3), в oid которой(mib atNetAddress) я хотел найти ip-адрес сетевого интерфейса, вообще больше не существует:
nummibs.png
nummibs.png (42.25 КБ) 6589 просмотров
Неужели кроме группы system никакие oid не установлены? А я могу их установить программно и какой-либо утилитой?

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

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

Непрочитанное сообщение SimpleUser » 15 янв 2013, 17:26

Olej писал(а):
SimpleUser писал(а):Я создал файл вида OLEJ-MANAGEMENT-MIB.txt,
Нет, вы уж лучше создавайте MIB-файлы вида SimpleUser-MANAGEMENT-MIB.txt :lol:
Файл называется VADIM-MANAGEMENT-MIB.txt))
Olej писал(а):
SimpleUser писал(а): В библиотеке net-snmp много файлов, имена которых начинаются с "+". Это тоже файлы MIB или какие-то скрипты библиотеки?
Пример?
Какой каталог? - точный путь...
Я не видел.
Скачал библиотеку с официального сайта. В распакованном виде она выглядит так:
netsnmpdir.png
netsnmpdir.png (58.15 КБ) 6592 просмотра
Начало одного из файлов:
+contents.png
(117.77 КБ) 5315 скачиваний
похоже на какой-то скрипт для сборки. Половина файлов с "+" примерно такие, есть и из 1-2 строк.

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

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

Непрочитанное сообщение Olej » 16 янв 2013, 02:31

SimpleUser писал(а): Этот вопрос у меня возник, потому что я хочу научиться получать из какого-либа OID адрес(адреса) своего единственного сетевого интерфейса em1. Начав исследование доступных мне на хосте OID-ов и соответствующих им переменных MIB я сильно удивился, выяснив, что мне доступны значения OID-ов только группы system. А для других групп заготовки в mib-файлах вроде бы есть, но агент о соответствующих их oid значениях ничего не знает. Я пытался получить значение, соответствующее переменной udpInDatagrams. Видно, что такой oid вроде бы определён, но тем не менее агент почему-то ничего в нём не находит:
Это связано, скорее всего, не с неопределённостью, а с правами доступа установленными для вашего community (в команде) и области видимости OIDs, определяемых в snmpd.conf - ищите там.
SimpleUser писал(а): ,а в версии 1, на которую я надеялся, даже mib-описания такого нет. Результаты snmptranslate выдаются для версии snmp 3 наверное?
Версия 1 - это очень старое, ним вряд ли кто пользуется.
Версия 3 - это ... слишком новое - не самое удобное, и неоднозначно толкуемое.
Чаще всего используют версию 2c - вполне достаточно.
SimpleUser писал(а): Здесь возникает вопрос: а в каком файле(файлах) сохраняются значения OID?
Ни в каких файлах.
Поддерживаемые агентом (сервером) OID непосредственно вкомпилированы глухо в программный код агента, в вашем случае в snmpd.
Свои OID вы будете вкомпилировать так же глухо в программный код своего субагента (если использовать протокол agentx), или в код своего агента (если вы надумаете заменить ним типовой snmpd, или подвесить его на другой нестандартный порт UDP).
SimpleUser писал(а): Во всей группе udp, впрочем, тоже все oid группы почему-то не инициализированы. То же касается и других групп дерева snmp, а группа at(1.3.6.1.2.1.3), в oid которой(mib atNetAddress) я хотел найти ip-адрес сетевого интерфейса, вообще больше не существует:
Большинство OID просто не попадают в поле видимости для вашего community.

Ответить

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

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

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