ВАДИМ ШПУРИК, разработчик программного обеспечения, фрилансер. Область интересов и приложения творческих усилий: создание интеллектуальных мультиагентных систем; изучение интеллектуального поведения искусственных объектов
Мониторинг состояния
температурных датчиков с помощью протокола SNMP
Как разработать пользовательское расширение к ядру Net-SNMP-демона (SNMP-агент) для сбора данных с температурных датчиков.
Использование SNMP-технологии требует, чтобы все объекты были подключены к физической сети, имели стек протоколов TCP/IP и соответствующий SNMP-агент. Случается, что контролируемые объекты не имеют не только необходимого программного обеспечения, но даже сетевого интерфейса. Для связи системы мониторинга с такими объектами необходимо создание промежуточного программного обеспечения – SNMP-агента, который, с одной стороны, обеспечивает связь с SNMP-менеджером, установленным на станции мониторинга, а с другой – опрашивает контролируемые объекты (датчики). Информация, которую система мониторинга запрашивает от агентов, хранится в специальной информационной базе данных MIB (Management Information Base). Обычно производитель аппаратного или программного обеспечения разрабатывает MIB-файл со своим собственным набором переменных, которые должны быть присоединены к дереву MIB. В SNMP каждой переменный присваивается уникальный идентификатор объекта (Object Identifier, OID). Пространство имён OID является иерархическим и контролируется организацией по распределению номеров в Интернете (Internet Assigned Numbers Authority, IANA).
SNMP используется для получения от сетевых устройств информации об их статусе и других характеристиках, которые хранятся в базе данных MIB. SNMP позволяет применять дополнительные агенты для поддержки баз MIB различных производителей. Агент взаимодействует с контролируемым ресурсом по нестандартному интерфейсу, а с менеджером – по стандартному протоколу через сеть. Таким образом, основная задача при создании SNMP-агента состоит в реализации функции, поддерживающей обработку запросов к заданному OID.
Генерирование кода шаблона
Предполагается, что перед началом работ произведена установка пакета Net-SNMP версии 5.4.2.1 (http://www.net-snmp.org/download.html).
Создадим новый каталог для кода шаблона SNMP-агента (далее Агент):
$ cd ~
$ mkdir sensTable
$ cd sensTable
Переменные, доступные через SNMP, организованы в иерархии и описаны соответствующим MIB. Вопросы, связанные с использованием языка абстрактной синтаксической нотации ASN.1 (http://www.amazon.com/s/ref?url=search-alias%3Dstripbooks&field-keywords=ASN.1) (стандарт ISO 8824:1987, рекомендации ITU-T X.208) и написанием MIB, выходят за рамки данного повествования, поэтому будем считать, что есть некий заранее созданный MIB-файл, например, SENSOR-MIB.mib.txt, в котором нас будет интересовать объект с именем sensTable. Об этом объекте речь пойдет ниже.
Для целей создания Агента в качестве временной замены файла SENSOR-MIB.mib.txt был использован MIB-файл реального устройства Poseidon 3262 (http://www.hw-group.com/products/poseidon/poseidon_3262_en.html).
Воспользуемся утилитой mib2c (http://www.net-snmp.org/docs/man/mib2c.html) пакета Net-SNMP для генерации шаблона Агента:
$ env MIBS="/usr/share/snmp/mibs/SENSOR-MIB.mib.txt" mib2c -c mib2c.mfd.conf \ sensTable
На все вопросы программы mib2c следует давать ответы, предусмотренные в ней по умолчанию (DEFAULT). Единственное исключение составляет вопрос Which method would you like to use to gather data about available rows? (какой метод вы хотели бы использовать, чтобы накапливать данные о доступных строках таблицы). На этот вопрос следует выбрать ответ «2) container-cached», который сообщит программе mib2c о вашем желании использовать в Агенте поддержку кэширования.
После ответа на все вопросы программа mib2c сгенерирует шаблон кода Агента:
writing to defaults/table-sensTable.m2d
Starting MFD code generation...
writing to sensTable.h
| +-> Processing table sensTable
writing to defaults/node-sensName.m2d
writing to defaults/node-sensState.m2d
writing to defaults/node-sensString.m2d
writing to defaults/node-sensValue.m2d
writing to defaults/node-sensValueRaw.m2d
writing to defaults/node-sensID.m2d
writing to defaults/node-sensUnit.m2d
writing to defaults/node-sensIndex.m2d
writing to sensTable.c
writing to sensTable_data_get.h
writing to sensTable_data_get.c
| | +-> Processing nonindex sensName
| | +-> Processing nonindex sensState
| | +-> Processing nonindex sensString
| | +-> Processing nonindex sensValue
| | +-> Processing nonindex sensValueRaw
| | +-> Processing nonindex sensID
| | +-> Processing nonindex sensUnit
writing to sensTable_data_set.h
writing to sensTable_data_set.c
writing to sensTable_oids.h
writing to sensTable_enums.h
writing to sensTable_interface.h
writing to sensTable_interface.c
writing to sensTable_data_access.h
writing to sensTable_data_access.c
writing to sensTable-README-FIRST.txt
writing to sensTable-README-sensTable.txt
writing to sensTable_Makefile
writing to sensTable_subagent.c
running indent on sensTable_data_access.h
running indent on sensTable_subagent.c
running indent on sensTable_interface.c
running indent on sensTable_enums.h
running indent on sensTable_data_access.c
running indent on sensTable_interface.h
running indent on sensTable_data_set.c
running indent on sensTable_data_get.h
running indent on sensTable.h
running indent on sensTable.c
running indent on sensTable_data_set.h
running indent on sensTable_data_get.c
running indent on sensTable_oids.h |
Результатом диалога с mib2c будет сгенерированный этой утилитой набор файлов, среди которых в первую очередь заслуживают внимания sensTable-README-FIRST.txt и sensTable-README-sensTable.txt.
Файл sensTable-README-FIRST.txt содержит указания о том, какие последующие действия следует предпринять, а из файла sensTable-README-sensTable.txt можно получить подробные сведения о тех шагах, которые были проделаны на этапе генерации шаблона.
В частности, следуя указаниям из файла sensTable-README-FIRST.txt, получим TODO-лист необходимых, по мнению mib2c, работ, которые нужно выполнить для получения работоспособного Агента:
$ grep -n "TODO:" *.[ch] | sed 's/\([^ ]*\)\(.*\)TODO\(.*\)/\3 (\1)/' | sort –n
:099:x: ******************************** (sensTable.h:205:)
:100:r: Review all context structures (sensTable.h:62:)
:101:o: |-> Review sensTable registration context. (sensTable.h:65:)
:110:r: |-> Review sensTable data context structure. (sensTable.h:71:)
:120:r: |-> Review sensTable mib index. (sensTable.h:121:)
:121:r: | |-> Review sensTable max index length. (sensTable.h:135:)
:130:o: |-> Review sensTable Row request (rowreq) context. (sensTable.h:143:)
:131:o: | |-> Add useful data to sensTable rowreq context. (sensTable.h:164:)
:180:o: Review sensTable cache timeout. (sensTable_data_access.h:40:)
:199:x: *********************************(sensTable.h:206:)
:200:r: Implement sensTable data context functions. (sensTable_data_get.c:41:)
:210:o: |-> Perform extra sensTable rowreq initialization. (eg DEFVALS) (sensTable.c:134:)
:211:o: |-> Perform extra sensTable rowreq cleanup. (sensTable.c:151:)
:230:M: Implement sensTable get routines. (sensTable_data_get.c:18:)
:231:o: |-> Extract the current value of the sensID data. (sensTable_data_get.c:476:)
:231:o: |-> Extract the current value of the sensName data. (sensTable_data_get.c:167:)
:231:o: |-> Extract the current value of the sensState data. (sensTable_data_get.c:235:)
:231:o: |-> Extract the current value of the sensString data. (sensTable_data_get.c:303:)
:231:o: |-> Extract the current value of the sensUnit data. (sensTable_data_get.c:528:)
:231:o: |-> Extract the current value of the sensValue data. (sensTable_data_get.c:371:)
:231:o: |-> Extract the current value of the sensValueRaw data. (sensTable_data_get.c:424:)
:240:M: Implement sensTable mapping routines (if any). (sensTable_data_get.c:19:)
:299:x: ******************************** (sensTable.h:207:)
:300:o: Perform sensTable one-time module initialization. (sensTable.c:43:)
:301:o: Perform sensTable one-time table initialization. (sensTable.c:78:)
:302:o: |->Initialize sensTable user context (sensTable.c:82:)
:303:o: Initialize sensTable data. (sensTable_data_access.c:57:)
:345:A: Set up sensTable cache properties. (sensTable_data_access.c:132:)
:350:M: Implement sensTable data load (sensTable_data_access.c:173:)
:351:M: |-> Load/update data in the sensTable container. (sensTable_data_access.c:244:)
:352:M: | |-> set indexes in new sensTable rowreq context. (sensTable_data_access.c:280:)
:352:r: | |-> populate sensTable data context. (sensTable_data_access.c:299:)
:380:M: Free sensTable container data. (sensTable_data_access.c:419:)
:390:o: Prepare row for request. (sensTable_data_access.c:444:)
:399:x: ******************************** (sensTable.h:208:)
:499:x: ******************************** (sensTable.h:209:)
:510:o: Perform sensTable pre-request actions. (sensTable.c:168:)
:511:o: Perform sensTable post-request actions. (sensTable.c:194:) |
Следует подчеркнуть, что данный документ никоим образом не подменяет собой официальной документации на пакет Net-SNMP, а предполагает и настоятельно рекомендует предварительное с ней ознакомление.
С общим описанием процесса написания Агента можно ознакомиться здесь http://www.net-snmp.org/wiki/index.php/TUT:Writing_a_Subagent.
Итак, у нас теперь есть шаблон Агента и перечень необходимых работ.
Структура данных
В реальных условиях температурные датчики (могут быть) подключены к Ethernet посредством шлюза Modbus/TCP. Показания температурных датчиков запрашивает и получает отдельный процесс, который сохраняет полученные значения в базе данных. Будем считать, что текущие показания записываются в файл в формате csv и с заданной периодичностью обновляются.
Структура записи csv-файла отображает поля таблицы sensTable:
$ snmptranslate -m /usr/share/snmp/mibs/SENSOR-MIB.mib.txt -Tp -IR sensTable
+--sensTable(3)
|
+--sensEntry(1)
| Index: sensIndex
|
+-- ---- INTEGER sensIndex(1)
| Textual Convention: PositiveInteger
| Range: 1..2147483647
+-- -R-- String sensName(2)
| Textual Convention: SensorName
| Size: 0..15
+-- -R-- EnumVal sensState(4)
| Textual Convention: SensorState
| Values: invalid(0), normal(1),
alarmstate(2), alarm(3)
+-- -R-- String sensString(5)
| Textual Convention: SensorString
| Size: 0..10
+-- -R-- INTEGER sensValue(6)
| Textual Convention: SensorValue
+-- -R-- INTEGER sensValueRaw(7)
| Textual Convention: SensorValue
+-- -R-- INTEGER sensID(8)
| Textual Convention: SensorID
| Range: 0..65535
+-- -R-- EnumVal sensUnit(9)
Textual Convention: UnitType
Values: celsius(0), fahrenheit(1),
kelvin(2), percent(3), volt(4),
miliamper(5), nounit(6), pulse(7), switch(8) |
Например, строка csv-файла:
1,"Sensor 241",1,"22.6",226,0,14991,0
содержит следующие данные:
sensIndex – 1;
sensName – Sensor 241;
sensState – 1 (normal);
sensString – 22.6;
sensValue – 226;
sensValueRaw – 0;
sensID – 14991;
sensUnit – 0 (celsius).
Предположим, что в нашем распоряжении есть шесть датчиков и файл sensor.csv, хранящий их текущие значения:
1,"Sensor 241",1,"22.6",226,0,14991,0
2,"Sensor 242",1,"11.4",114,0,14992,0
3,"Sensor 243",1,"2.2",22,0,14993,0
4,"Sensor 244",1,"21.5",215,0,14994,0
5,"Sensor 245",1,"20.6",206,0,14995,0
6,"Sensor 246",1,"24.0",240,0,14996,0
Далее необходимо обеспечить периодическое обновление данных в файле sensor.csv. Для отладки Агента нет необходимости использовать аппаратные датчики и шлюз. Их вполне можно заменить программной симуляцией. Другими словами, необходима программа, которая будет имитировать выдачу текущих значений датчиков путем генерации значений температур в заданном диапазоне и записывать эти значения в файл sensor.csv.
Для решения этой задачи можно использовать следующий скрипт:
#!/bin/bashCSVPATH="/home/snmp/sensTable/"CSVFILE=${CSVPATH}"sensor.csv"SENSOR[1]="1,\"Sensor 241\",1,\"24.5\",245,0,14991,0"SENSOR[2]="2,\"Sensor 242\",1,\"36.6\",366,0,14992,0"SENSOR[3]="3,\"Sensor 243\",1,\"12.2\",122,0,14993,0"SENSOR[4]="4,\"Sensor 244\",1,\"21.5\",215,0,14994,0"SENSOR[5]="5,\"Sensor 245\",1,\"20.6\",206,0,14995,0"SENSOR[6]="6,\"Sensor 246\",1,\"31.7\",317,0,14996,0"if [ ! -f ${CSVFILE} ]then for index in 1 2 3 4 5 6 # Six lines. do printf "%s\n" "${SENSOR[index]}" >> ${CSVFILE} doneelsecat $CSVFILE | awk -F"," 'BEGIN { srand(systime()) # [min,max] values SENS[1] = "21,34" # 21.0 .. 34.9 SENS[2] = "10,15" # 10.0 .. 15.9 SENS[3] = "1,6" # 1.0 .. 6.9 SENS[4] = "0,0" # do nothing SENS[5] = "0,0" # do nothing SENS[6] = "23,29" # 23.0 .. 29.9}function randint(n) { return int(n * rand()) }{ split(SENS[NR], temp, ",") min = temp[1] max = temp[2] if (min == max) { SENS[NR] = $0 } else { grad = min + randint(max-min) fraction = randint(9) split($0, sens, ",") gsub("\"", "", sens[2]) SENS[NR] = sprintf("%s,\"%s\",%s,\"%d.%1d\",%d%1d,%s,%s,%s", sens[1],sens[2],sens[3], grad,fraction,grad,fraction, sens[6],sens[7],sens[8]) }}END { for (x in SENS) { printf "%s\n", SENS[x] | "sort > '$CSVFILE'" }}'fi
Текст скрипта следует поместить в файл sensor.sh. Вариантов реализации данного скрипта может быть множество, поэтому простор для творчества оставлен открытым.
Периодичность обновления (цикл опроса датчиков) можно обеспечить при помощи cron:
$ crontab -e
В файл добавим следующие строки:
SHELL=/bin/bash
*/10 * * * * /home/snmp/sensTable/sensor.sh > /dev/null 2>&1
В результате программа sensor.sh будет выполняться каждые 10 минут, что соотвествует длительности реального цикла опроса температурных датчиков.
Задача Агента состоит в том, чтобы по запросу прочитать этот csv-файл и выдать запрашиваемые менеджером данные.
Взаимодействие с контролируемым ресурсом
Теперь необходимо расширить сгенерированный программой mib2c код шаблона Агента для чтения данных из файла sensor.csv. Для этого потребуется написать несколько фрагментов кода на языке С и добавить их в файл sensTable_data_access.c. Полный текст этого файла находится в архиве, который можно скачать по адресу: www.samag.ru раздел «Исходный код».
Требуемые изменения были сохранены в файле patchfile.patch:
$ diff sensTable_data_access.c.orig sensTable_data_access.c > patchfile.patch
где sensTable_data_access.c.orig – исходный файл, сгенерированный программой mib2c, а sensTable_data_access.c – модифицированная версия.
Файл patchfile.patch можно использовать для получения обновленной версии файла sensTable_data_access.c:
$ patch sensTable_data_access.c.orig -i patchfile.patch -o sensTable_data_access.c
После внесения изменений проведем сборку Агента:
$ make -f sensTable_Makefile
В файле sensTable_Makefile есть две заслуживающие особого внимания команды:
- net-snmp-config --base-cflags;
- net-snmp-config --agent-libs
которые выдают полезную для дальнейшего совершенствования Агента информацию об используемых библиотеках и файлах заголовков:
$ net-snmp-config --base-cflags
-DNETSNMP_ENABLE_IPV6 -march=i586 -mtune=i686
-fmessage-length=0 -O2 -Wall
-D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables
-fasynchronous-unwind-tables -g -fno-strict-aliasing
-fstack-protector-all -Ulinux
-Dlinux=linux -I/usr/include/rpm -D_REENTRANT -D_GNU_SOURCE
-DPERL_USE_SAFE_PUTENV
-DDEBUGGING -fno-strict-aliasing -pipe -D_LARGEFILE_SOURCE
-D_FILE_OFFSET_BITS=64
-I/usr/lib/perl5/5.10.0/i586-linux-thread-multi/CORE
-I/usr/include |
$ net-snmp-config --agent-libs
-L/usr/lib -lnetsnmpagent -lnetsnmphelpers -lnetsnmpmibs
-lnetsnmp -lz -Wl,-E -Wl,
-rpath,/usr/lib/perl5/5.10.0/i586-linux-thread-multi/CORE |
Перечень динамических библиотек, используемых «свежеиспеченным» Агентом:
$ ldd sensTable
linux-gate.so.1 => (0xffffe000)
libnetsnmpagent.so.15 => /usr/lib/libnetsnmpagent.so.15 (0xb7f75000)
libnetsnmphelpers.so.15 => /usr/lib/libnetsnmphelpers.so.15 (0xb7f4b000)
libnetsnmpmibs.so.15 => /usr/lib/libnetsnmpmibs.so.15 (0xb7d7d000)
libnetsnmp.so.15 => /usr/lib/libnetsnmp.so.15 (0xb7cb3000)
libz.so.1 => /lib/libz.so.1 (0xb7c9d000)
libc.so.6 => /lib/libc.so.6 (0xb7b41000)
libcrypto.so.0.9.8 => /usr/lib/libcrypto.so.0.9.8 (0xb79da000)
libwrap.so.0 => /lib/libwrap.so.0 (0xb79cf000)
libperl.so => /usr/lib/perl5/5.10.0/i586-linux-thread-multi/CORE/libperl.so (0xb775b000)
libnsl.so.1 => /lib/libnsl.so.1 (0xb7741000)
libdl.so.2 => /lib/libdl.so.2 (0xb773c000)
libm.so.6 => /lib/libm.so.6 (0xb7713000)
libcrypt.so.1 => /lib/libcrypt.so.1 (0xb76dc000)
libutil.so.1 => /lib/libutil.so.1 (0xb76d8000)
libpthread.so.0 => /lib/libpthread.so.0 (0xb76be000)
librpm-4.4.so => /usr/lib/librpm-4.4.so (0xb7627000)
librpmio-4.4.so => /usr/lib/librpmio-4.4.so (0xb7545000)
libpopt.so.0 => /lib/libpopt.so.0 (0xb753c000)
libsensors.so.3 => /usr/lib/libsensors.so.3 (0xb7504000)
/lib/ld-linux.so.2 (0xb7fcc000)
librpmdb-4.4.so => /usr/lib/librpmdb-4.4.so (0xb73fb000)
librt.so.1 => /lib/librt.so.1 (0xb73f1000)
libbz2.so.1 => /lib/libbz2.so.1 (0xb73e1000)
libselinux.so.1 => /lib/libselinux.so.1 (0xb73c4000)
libsysfs.so.2 => /lib/libsysfs.so.2 (0xb73b7000) |
Конфигурирование и запуск Агента
Оригинальная документация на пакет Net-SNMP гласит:
Enable AgentX in your Net-SNMP (UCD-SNMP) daemon
configuration (in SuSE it is /etc/snmp/snmpd.conf).
There should be line "master agentx". Restart snmpd. |
После добавления строки «master agentx» в файл /etc/snmp/snmpd.conf остается только перезапустить snmpd:
# service snmpd start
Проверим результат запуска:
# ps fax | grep snmpd | grep -v grep
18959 ? SNl 0:21 /usr/sbin/snmpd -r -A -LF d /var/log/net-snmpd.log -p /var/run/snmpd.pid |
Запуск Агента в режиме отладки:
# cd /home/snmp/sensTable
# ./sensTable -f -DsensTable,verbose:sensTable,internal:sensTable
Запуск Агента в нормальном режиме:
# ./sensTable -f &
Проверим результат запуска:
# ps fax | grep sensTable | grep -v grep
10033 ? S 0:02 ./sensTable -f |
Запросим у Агента информацию:
# snmpwalk -v2c localhost -c public .1.3.6.1.4.1.21796.3.3.3
SNMPv2-SMI::enterprises.21796.3.3.3.1.2.1 = STRING: "Sensor 241"
SNMPv2-SMI::enterprises.21796.3.3.3.1.2.2 = STRING: "Sensor 242"
SNMPv2-SMI::enterprises.21796.3.3.3.1.2.3 = STRING: "Sensor 243"
SNMPv2-SMI::enterprises.21796.3.3.3.1.2.4 = STRING: "Sensor 244"
SNMPv2-SMI::enterprises.21796.3.3.3.1.2.5 = STRING: "Sensor 245"
SNMPv2-SMI::enterprises.21796.3.3.3.1.2.6 = STRING: "Sensor 246"
SNMPv2-SMI::enterprises.21796.3.3.3.1.4.1 = INTEGER: 1
SNMPv2-SMI::enterprises.21796.3.3.3.1.4.2 = INTEGER: 1
SNMPv2-SMI::enterprises.21796.3.3.3.1.4.3 = INTEGER: 1
SNMPv2-SMI::enterprises.21796.3.3.3.1.4.4 = INTEGER: 1
SNMPv2-SMI::enterprises.21796.3.3.3.1.4.5 = INTEGER: 1
SNMPv2-SMI::enterprises.21796.3.3.3.1.4.6 = INTEGER: 1
SNMPv2-SMI::enterprises.21796.3.3.3.1.5.1 = STRING: "24.5"
SNMPv2-SMI::enterprises.21796.3.3.3.1.5.2 = STRING: "36.6"
SNMPv2-SMI::enterprises.21796.3.3.3.1.5.3 = STRING: "12.2"
SNMPv2-SMI::enterprises.21796.3.3.3.1.5.4 = STRING: "21.5"
SNMPv2-SMI::enterprises.21796.3.3.3.1.5.5 = STRING: "20.6"
SNMPv2-SMI::enterprises.21796.3.3.3.1.5.6 = STRING: "31.7"
SNMPv2-SMI::enterprises.21796.3.3.3.1.6.1 = INTEGER: 245
SNMPv2-SMI::enterprises.21796.3.3.3.1.6.2 = INTEGER: 366
SNMPv2-SMI::enterprises.21796.3.3.3.1.6.3 = INTEGER: 122
SNMPv2-SMI::enterprises.21796.3.3.3.1.6.4 = INTEGER: 215
SNMPv2-SMI::enterprises.21796.3.3.3.1.6.5 = INTEGER: 206
SNMPv2-SMI::enterprises.21796.3.3.3.1.6.6 = INTEGER: 317
SNMPv2-SMI::enterprises.21796.3.3.3.1.7.1 = INTEGER: 0
SNMPv2-SMI::enterprises.21796.3.3.3.1.7.2 = INTEGER: 0
SNMPv2-SMI::enterprises.21796.3.3.3.1.7.3 = INTEGER: 0
SNMPv2-SMI::enterprises.21796.3.3.3.1.7.4 = INTEGER: 0
SNMPv2-SMI::enterprises.21796.3.3.3.1.7.5 = INTEGER: 0
SNMPv2-SMI::enterprises.21796.3.3.3.1.7.6 = INTEGER: 0
SNMPv2-SMI::enterprises.21796.3.3.3.1.8.1 = INTEGER: 14991
SNMPv2-SMI::enterprises.21796.3.3.3.1.8.2 = INTEGER: 14992
SNMPv2-SMI::enterprises.21796.3.3.3.1.8.3 = INTEGER: 14993
SNMPv2-SMI::enterprises.21796.3.3.3.1.8.4 = INTEGER: 14994
SNMPv2-SMI::enterprises.21796.3.3.3.1.8.5 = INTEGER: 14995
SNMPv2-SMI::enterprises.21796.3.3.3.1.8.6 = INTEGER: 14996
SNMPv2-SMI::enterprises.21796.3.3.3.1.9.1 = INTEGER: 0
SNMPv2-SMI::enterprises.21796.3.3.3.1.9.2 = INTEGER: 0
SNMPv2-SMI::enterprises.21796.3.3.3.1.9.3 = INTEGER: 0
SNMPv2-SMI::enterprises.21796.3.3.3.1.9.4 = INTEGER: 0
SNMPv2-SMI::enterprises.21796.3.3.3.1.9.5 = INTEGER: 0
SNMPv2-SMI::enterprises.21796.3.3.3.1.9.6 = INTEGER: 0 |
# snmpwalk -v2c localhost -c public .1.3.6.1.4.1.21796.3.3.3.1.2
SNMPv2-SMI::enterprises.21796.3.3.3.1.2.1 = STRING: "Sensor 241"
SNMPv2-SMI::enterprises.21796.3.3.3.1.2.2 = STRING: "Sensor 242"
SNMPv2-SMI::enterprises.21796.3.3.3.1.2.3 = STRING: "Sensor 243"
SNMPv2-SMI::enterprises.21796.3.3.3.1.2.4 = STRING: "Sensor 244"
SNMPv2-SMI::enterprises.21796.3.3.3.1.2.5 = STRING: "Sensor 245"
SNMPv2-SMI::enterprises.21796.3.3.3.1.2.6 = STRING: "Sensor 246" |
# snmpwalk -v2c localhost -c public .1.3.6.1.4.1.21796.3.3.3.1.6.1
SNMPv2-SMI::enterprises.21796.3.3.3.1.6.1 = INTEGER: 245 |
Разумеется, что значение OID в команде snmpwalk от .1.3.6.1.4.1.21796.3.3.3. специфично исключительно для используемого здесь MIB-файла.
Конфигурирование Nagios
Процесс установки и конфигурирования Nagios (http://www.nagios.org) подробно рассматривался во многих публикациях, поэтому здесь предполагается, что Nagios (включая Nagios check_snmp plugin) уже установлен в системе, и нам остается только внести необходимые изменения в его конфигурационные файлы.
В файле /etc/nagios/nagios.cfg необходимо раскоментировать строку:
cfg_file=/etc/nagios/objects/switch.cfg
и внести необходимые изменения. Содержимое файла /etc/nagios/objects/switch.cfg:
define host{ use generic-switch host_name poseidon alias Poseidon 3262 address 127.0.0.1 hostgroups switches }define hostgroup{ hostgroup_name switches alias Network Switches }define service{ use generic-service host_name poseidon service_description Sensor_1 check_command check_snmp!-C public -o .1.3.6.1.4.1.21796.3.3.3.1.5.1 }define service{ use generic-service host_name poseidon service_description Sensor_2 check_command check_snmp!-C public -o .1.3.6.1.4.1.21796.3.3.3.1.5.2 }define service{ use generic-service host_name poseidon service_description Sensor_3 check_command check_snmp!-C public -o .1.3.6.1.4.1.21796.3.3.3.1.5.3 }define service{ use generic-service host_name poseidon service_description Sensor_4 check_command check_snmp!-C public -o .1.3.6.1.4.1.21796.3.3.3.1.5.4 }define service{ use generic-service host_name poseidon service_description Sensor_5 check_command check_snmp!-C public -o .1.3.6.1.4.1.21796.3.3.3.1.5.5 }define service{ use generic-service host_name poseidon service_description Sensor_6 check_command check_snmp!-C public -o .1.3.6.1.4.1.21796.3.3.3.1.5.6 }
Перезапустим Nagios, кликнем по ссылке Service Detail и посмотрим на результаты наших усилий (см. рисунок).
Результаты наших усилий
В столбце Status Information можно наблюдать значения температур, полученные от каждого датчика.
В основе системы мониторинга лежит элементарная схема взаимодействия агента и менеджера. На основе этой схемы могут быть построены системы практически любой сложности с большим количеством агентов и менеджеров разного типа.
Пользуясь API, предоставляемым Net-SNMP, разработчик может создавать законченную систему мониторинга, которая может контролировать специфическое оборудование.
Агент в SNMP – обрабатывающий элемент, который обеспечивает менеджерам, входящим в систему мониторинга, доступ к значениям переменных MIB и тем самым дает им возможность реализовать функции по наблюдению за устройствами.