Main

Взаимодействие по протоколу SNMP

Данный модуль предназначен для мониторинга и управления устройствами по протоколу SNMP (v1).

Основные возможности:

  • Чтение значения SNMP-свойст (с заданным периодом опроса)
  • Установка значения SNMP-свойств
  • Связь SNMP-свойств со свойствами объектов системы (синхронное чтение и установка)

Важно: Для работы данного модуля необходимо, чтобы в конфигурации PHP на сервере была включена поддержка протокола SNMP. В Windows-дистрибутиве для этого нужно открыть на редактирование файл C:\_majordomo\server\config_tpl\php.ini и найти строчку:

;extension=php_snmp.dll

и раскомментировать её, убрав символ ";" в начале строки:

extension=php_snmp.dll

После этого следует сохранить файл и перезагрузить сервер MajorDoMo

Дополнительно реализована возможность чтения значения свойств устройства при получении любого SNMP-trap пакета от устройства. Для реализации последнего, необходимо помимо основного цикла системы запустить скрипт обработки SNMP-пакетов, находящийся в папке htdocs/scripts/snmp_trap_daemon.php.

В Linux системе, находясь в вышеуказнной папке, это можно сделать командой

php ./snmp_trap_daemon.php

Для Windows-системы можно сделать соответствующий bat-файл (так же запускать из вышеуказанной папки):

@echo off
c:
cd \_majordomo\htdocs\scripts
..\..\server\php\php.exe cycle_snmp_trap.php

Пример использования совместно с оборудованием компании NetPing

 
 

Обсуждение

 

sergejey: Обсуждение страницы Взаимодействие по протоколу SNMP

Alex: Интересно. Хотелось бы конкретный пример как считать значение и как записать значение. И сам принцип как узнать поддерживаемые устройством значения и команды.

sergejey: Я завтра допишу статью на примере netping. Если кратко, то принцип такой -- связываем со свойством объекта и запись в это свойство через тот же SetGlobal отправит команду записи в snmp свойство. Чтение так же просто как в 1wire. А сами свойства поддерживаемые нужно искать в документации к девайсу.

Amarok: А покажите, пожалуйста, пример взаимодействия программы Tasker и SNMP-устройства

sergejey: А покажите, пожалуйста, пример взаимодействия программы Tasker и SNMP-устройства У меня такой связки нету, но могу подсказать как реализовать: 1. Делаем сценарий, который обновляет какое-то свойство объекта (условно Object1.A) через setGlobal("Object1.A","нужное_значение"); 2. Получаем URL на запуск этого сценария и в таскере добавляем действие с открытием URL-а 3. В модуле SNMP-устройств связываем SNMP-свойство со свойством Object1.A собственно, всё -- из таскера будет устанавливаться свойство объекта и соответствующий запрос будет отправлен на связанное SNMP-устройство

dimitrystd: Есть подозрение на баг. Итак опишу ситуацию 1. Добавид снмп устройство 2. Добавил новый клас и объект и связал свойства с устройством snmp_device.png 3. Значение в одном из свойст "1,1,1,1". Я его записываю в IPSensor1.rawSensorStatus 4. В настройках rawSensorStatus стоит вызов метода. Этот метод разбивает строку на 4 значения и записывает в 4 других свойства property.png На данном этапе всё работает отлично. МД пулит значения, метод срабатывает и парсит их. Идём дальше, настраиваем snmp_trap_daemon.php 5. Добавляю бат файл и запускаю (кстати в документации неправильный скрипт указан) 6. Замыкаю контакты на устройсве, вижу что МД ловит трап, вижу в X-Ray изменения rawSensorStatus Проблема в том что не срабатывает метод который прописан на изменение в rawSensorStatus. Можно ли это как то пофиксить малой кровью? P.S. Пытаюсь интегрировать девайс IPSensor S4T1 засветившийся на ab-log.

sergejey: Это баг системы похоже. Записал себе в список на разбор. В ближайшее время постараюсь посмотреть.

dimitrystd: Дошли руки наконец разобраться с багой. Ато девайс уже 2 месяца валяется без дела. Итак есть объект со свойством IPSensor1.rawSensorStatus. На изменение свойства висит метод splitStringToBool. Делаем простой юнит тест public function testSetPropertyWithOnChangeMethod() { $obj=getObject('IPSensor1'); $this->assertNotEmpty($obj); $obj->setProperty('rawSensorStatus', '1,2,1,0'); $this->assertEquals(1, $obj->getProperty('sensor1')); $this->assertEquals(2, $obj->getProperty('sensor2')); $this->assertEquals(1, $obj->getProperty('sensor3')); $this->assertEquals(0, $obj->getProperty('sensor4')); $obj->setProperty('rawSensorStatus', '0,0,0,0'); $this->assertEquals(0, $obj->getProperty('sensor1')); $this->assertEquals(0, $obj->getProperty('sensor2')); $this->assertEquals(0, $obj->getProperty('sensor3')); $this->assertEquals(0, $obj->getProperty('sensor4')); } Тест падает после второго присваивания значения на проверке $this->assertEquals(0, $obj->getProperty('sensor1')); PHPUnit_Framework_ExpectationFailedException : Failed asserting that '1' matches expected 0. Expected :0 Actual :1 Подебажив метод setProperty класса /modules/objects/objects.class.php видно что мы забываем сбрасывать $property_linked_history] Покажу в куске кода function setProperty($property, $value, $no_linked=0) { .... .... if ($prop['ONCHANGE']) { global $property_linked_history; if (!$property_linked_history[$property][$prop['ONCHANGE']]) { $property_linked_history[$property][$prop['ONCHANGE']]=1; global $on_change_called; $params=array(); $params['NEW_VALUE']=(string)$value; $params['OLD_VALUE']=(string)$old_value; $this->callMethod($prop['ONCHANGE'], $params); // Если расскоментировать строку то тест заработает unset($property_linked_history[$property][$prop['ONCHANGE']]); } elseif ($property_linked_history[$property][$prop['ONCHANGE']]) { unset($property_linked_history[$property][$prop['ONCHANGE']]); } } Я если честно не разобрался во всей этой логик с флажками, и нет полных тестов чтоб можно было не опасаясь рефакторить. Помогите разобраться как фофиксить. p.S. Может заменить концепцию $property_linked_history на обычный стек вызовов методов и свойств. Да, надо будет бежать по этому стеку вместо простой проверки, но такой подход более ясный (IMHO)

sergejey: Можно убрать эту проверку вовсе, хоть и придётся полагаться на то, что логических ошибок пользователь не допустит. Стек вызовов это хорошо было бы, но когда делал сходу не сообразил как его организовать правильно (чтобы он обнулялся когда нужно), поэтому поставил такой "костыль".

dimitrystd: Не, флажок там всётки нужно потому как сообразить бесконечный цикл на одном свойстве и одном методе тяжело в здравом уме, а вот несколько объектов с перекрётсными ссылками дадут бесконечный цикл. И потом будут топики на форуме что один из циклов уходит в себя по непонятным причинам. И думай потом как унего объекты заведены и события с девайсов приходят. Надеюсь пхп имеет встроеную проверку что стек вызовов не может быть глубже какого то значения. Сделаю ещё пару юнит тестов и потом поменяю код. Но наверное только на вых. доберусь до этого. Про стек я ещё потом подумал и решил что этот флажок справится. Ну а вообще при заходе в метод добавляем в стек, при выходе вытягиваем. Посколько это выглядит как рекурсия работа со стеком как FIFO. Но в этом месте нет смысла заморачиваться.

dimitrystd: Пофиксил багу. Умудрился и на текущем коде воспроизвести бесконечный цикл. Чтото не получается сделать пулреквест только с фиксом, хочет отправить мои специфичные комиты. Разберусь к выходным как правильно сделать.

sergejey: Пофиксил багу. Умудрился и на текущем коде воспроизвести бесконечный цикл. Чтото не получается сделать пулреквест только с фиксом, хочет отправить мои специфичные комиты. Разберусь к выходным как правильно сделать. Можно мне в личку патч кидать, я в основной код вставлю.

Urbas81: Как убрать надписи при старте системы про ненайденные модули snmp, уже и в php.ini закоментил и убрал два файла php cycle_snmp.php и snmp_trap_daemon.php все равно вылазит эта надпись про модули http://i.pixs.ru/thumbs/7/9/4/snmpPNG_6509594_9782794.jpg

sergejey: Как убрать надписи при старте системы про ненайденные модули snmp, уже и в php.ini закоментил и убрал два файла php cycle_snmp.php и snmp_trap_daemon.php все равно вылазит эта надпись про модули http://i.pixs.ru/thumbs/7/9/4/snmpPNG_6509594_9782794.jpg С удовольствием внедрил бы решение, если б кто нашёл. У самого не получается никак. Это какие-то компоненты snmp-модуля, которые под windows я не знаю как установить. Эти ошибки ни на что не влияют, но не приятно это да.

Urbas81: Как убрать надписи при старте системы про ненайденные модули snmp, уже и в php.ini закоментил и убрал два файла php cycle_snmp.php и snmp_trap_daemon.php все равно вылазит эта надпись про модули http://i.pixs.ru/thumbs/7/9/4/snmpPNG_6509594_9782794.jpg С удовольствием внедрил бы решение, если б кто нашёл. У самого не получается никак. Это какие-то компоненты snmp-модуля, которые под windows я не знаю как установить. Эти ошибки ни на что не влияют, но не приятно это да. Т.е это нильзя отключить, если модуль не планируется использовать?

sergejey: Как убрать надписи при старте системы про ненайденные модули snmp, уже и в php.ini закоментил и убрал два файла php cycle_snmp.php и snmp_trap_daemon.php все равно вылазит эта надпись про модули http://i.pixs.ru/thumbs/7/9/4/snmpPNG_6509594_9782794.jpg С удовольствием внедрил бы решение, если б кто нашёл. У самого не получается никак. Это какие-то компоненты snmp-модуля, которые под windows я не знаю как установить. Эти ошибки ни на что не влияют, но не приятно это да. Т.е это нильзя отключить, если модуль не планируется использовать? Если SNMP вообще не используется, то можно в C:\_majordomo\server\config_tpl\php.ini отключить: http://c2n.me/6cTRBZ.png т.е. добавить ";" перед подключением расширения snmp

Urbas81: Спасибо, я сначала так и сделал, но вроде не помогло, а потом после перезапуска сообщения пропали.

denis: вопрос по настройке модуля SNMP. есть скрипт, который замечательно забирает данные с устройства SNMP $snmp_host = 'x.x.x.x'; // адрес устройства $snmp_community = 'public'; // "секретное слово" $snmp_oid = '.1.3.6.1.4.1.31440.10.5.1.1.0'; // идентификатор параметра $result = snmpget($snmp_host, $snmp_community, $snmp_oid); // чтение порта вбиваю в модуле SNMP те же данные и ничего не "подхватывается". Надо ли в OID вбивать первую точку? в поле "название" можно вбивать любую инфу или настоящее название OID (параметра)?

sergejey: вопрос по настройке модуля SNMP. есть скрипт, который замечательно забирает данные с устройства SNMP $snmp_host = 'x.x.x.x'; // адрес устройства $snmp_community = 'public'; // "секретное слово" $snmp_oid = '.1.3.6.1.4.1.31440.10.5.1.1.0'; // идентификатор параметра $result = snmpget($snmp_host, $snmp_community, $snmp_oid); // чтение порта вбиваю в модуле SNMP те же данные и ничего не "подхватывается". Надо ли в OID вбивать первую точку? в поле "название" можно вбивать любую инфу или настоящее название OID (параметра)? в исходниках используется практически такой же код: $snmp_oid = $prec['OID']; $snmp_host = $drec['HOST']; $snmp_community = $drec['READ_COMMUNITY']; $value = snmpget($snmp_host, $snmp_community, $snmp_oid); так что должно работать... насчёт точки в OID не подскажу -- но если в том коде работает с ней, то надо её оставить название может быть любым -- OID используется только в свойствах.

denis: спасибо, буду пробовать.

denis: на странице по SNMP-модулю указано, что можно ловить trap-пакеты следующим образом: Для Windows-системы можно сделать соответствующий bat-файл (так же запускать из вышеуказанной папки): @echo off c: cd \_majordomo\htdocs\scripts ..\..\server\php\php.exe cycle_snmp_trap.php Об этом уже говорилось в ветке, просьба исправить на файл snmp_trap_daemon.php мало ли кому понадобится. и такой вопрос: Когда приходит trap-пакет, он должен менять связанное свойство в модулях SNMP ? Так как у меня trap-пакеты в MIB-браузере приходят, а вот в МДМ почему-то ничего не происходит.

sergejey: Когда приходит trap-пакет, он должен менять связанное свойство в модулях SNMP ? Так как у меня trap-пакеты в MIB-браузере приходят, а вот в МДМ почему-то ничего не происходит. Да, должно. Фактически, наличие Trap-пакета заставляет систему пересканировать устройство на предмет изменившихся значений.

denis: ок. продолжу изыскания, где они теряются. bat-файл snmp_daemon зацикливать не нужно? т.е. он просто исполнился и "висит"?

sergejey: ок. продолжу изыскания, где они теряются. bat-файл snmp_daemon зацикливать не нужно? т.е. он просто исполнился и "висит"? Он запускается и висит, да. Т.е. он остаётся висеть в виде сервиса, который слушает сеть на предмет trap-пакетов.

denis: разобрался. php (CLI) Не стояла "галка" в разрешенных приложениях брандмауера-windows, хотя само приложение там было. теперь работает!

denis: Еще вопрос: как сделать перезапуск файла snmp.bat так как у меня он висит, висит, принимает пакеты, а потом по неизвестной причине просто закрывается. Может его тоже можно зациклить?

dimitrystd: У меня так сделано :1
cd 
.\htdocs\scripts
C
:\wamp\bin\php\php5.4.16\php.exe snmp_trap_daemon.php
cd 
..\..
goto 1 Помню поломал мускул и видел как он в цикле бросал ошибку и рестартовал

denis: Спасибо за идею. Я вроде разобрался в чем было дело, у меня в скрипте был сделан вывод переменных var_dump() для отладки и я все этого благополучно не удалил, в результате "мусор" валился прямо в консоль. Закомментил ненужные строки пока 12 часов полет нормальный. Но на будущее все равно сделаю "зацикливание". p.s. "зацикливание" помогло, теперь процесс перезапускается при падении, но ошибка из-за которой это происходит мне не совсем понятна, в консоли такое написано:
Error
:<br />
2006MySQL server has gone away<br>SELECT ID FROM snmpdevices WHERE HOST LIKE '
хх.хх.хх.хх'
</b></font></p></td></tr></table>&nbsp;</body></html>
 
вместо хх.хх.хх.хх IP адрес SNMP устройства. похоже на ошибку доступа к БД из-за отключения сервера?!, хотя никаких перезапусков МДМ не делал. Вообщем пока и так работает, и славно!!

Zaezd2008: Что то не очень получается ловить TRAP пакеты. Батник такой: @echo off c: cd \_majordomo\htdocs\scripts ..\..\server\php\php.exe snmp_trap_daemon.php goto 1 Есть у кого настроенный "трапоприемник" ?

sergejey: На эти ошибки можно не обращать внимание, должно работать. Может быть Firewall какой блокирует приём trap-сообщений? Принцип trap-ловушки довольно простой -- при запуске создаётся сокет на 162-м порту, который ловит все широковещательные сообщения. Собственно всё, там даже ломаться особо нечему :)

Zaezd2008: Понятно, для 161 так же, работает? У меня просто 161 порт на traps по дефолту, к сожалению... В snmp_trap_daemon заменил на udp://0.0.0.0:161 так?

sergejey: Понятно, для 161 так же, работает? У меня просто 161 порт на traps по дефолту, к сожалению... В snmp_trap_daemon заменил на udp://0.0.0.0:161 так? Да, видимо так. Но вообще "кошерный" SNMP trap как раз на 162-ом порту должен срабатывать.

gorobey: Почему-то появилась ошибка при добавлении устройства snmp 1366: Incorrect integer value: '' for column 'SCRIPT_ID' at row 1 INSERT INTO `snmpdevices`(`TITLE`, `HOST`, `SCRIPT_ID`, `CODE`, `READ_COMMUNITY`, `WRITE_COMMUNITY`) VALUES('LPC', '192.168.99.55', , , , ) Os: ubuntu PHP 5.6.27-1+deb.sury.org~xenial+1

sergejey: Попробуйте обновить модуль через маркет дополнений.

gorobey: Действительно была не последняя версия спасибо. Я обошел потому тяжело сказать или не повторится. Будет время откачу систему еще проверю. Спасибо за помощь !

gorobey: Спасибо за апдейт. Откатился проверил. Проблема ушла.

I_I_Imonder: Друзья!!! помогите, наверно сказываются праздники (алкоголь), но подскажите один момент. Есть netping к нему подключен датчик движения, при движении на IO1 нетпинга появляется 1. Как это завести в АЛису? При изменении с 0>1 тнетпинг умеет отправлять trap пакет, но как его ловить в Алисе, я не разобрался. HELP!!!

gorobey: Запустить snmp_trap_daemon.php и создать обекты, которые будут связанны со свойствам.

I_I_Imonder: Запустить snmp_trap_daemon.php и создать обекты, которые будут связанны со свойствам. вроде все правильно сделал, запускаю батник и пишет что модуль не найден, копм трапы принимает (trap receiver-ом проверил), алиса не принимает их ( куда копнуть? поделитесь у кого принимает трапы?

Zaezd2008: Модулю SNMP не хватает одной маленькой доработки- прежде чем опрашивать устройства, очень хочется проверки доступности (пинг устройства, если есть, работаем). Может поможет кто? И вопрос как в поле Хост (адрес): (*) вставить объект.свойство с IP адресом? Это возможно?

Zaezd2008: И снова я с вопросом. Как snmp.bat запускать с остальными циклами? А то почему то каждую ночь этот файл закрывается....

Zaezd2008: Повторюсь с вопросом, поможите Как ловилку трапов snmp.bat запускать с остальными циклами? Что бы отдельно батник не запускать?

denis: тоже мучался с этим, вроде помогло http://majordomo.smartliving.ru/forum/viewtopic.php?f=4&t=595&start=20#p12737

Zaezd2008: Спасибо, на винде работает, но в связи с переходом на линукс не очень понятно как быть с трапами...

Memodota: Всем добрый день. Подскажите пожалуйста. 1) Пытаюсь снять температуру на процессоре сервера. В консоли с соседних машин все ок, а на сервере Majordomo при попытке любого действия после добавления хоста ( то есть пытаюсь завести и опрашивать OID) происходит крэш и выводит HTTP ERROR 500; 2) У сервера есть тип данных в SNMP Gauge32. В модуле этого типа данных нет. Пожалуйста подскажите куда копать.

Memodota: Вау какая быстрая реакция у форума! В общем решил проблемы: 1) Почему то был выключен модуль snmp в PHP 2) В Majordomo нужно выбирать Counter

skysilver: Вау какая быстрая реакция у форума!Вот это к чему щас было?! Хотите сказать, что все тут сидят целыми днями и только и ждут новых вопросов, чтобы броситься на них отвечать?! Это вам не тикеты в платной тех. поддержке.

[ Обсудить на форуме ]

 

MajorDomo

Информация

Проекты

Партнёры

edit SideBar

 
 
 

 

Blix theme adapted by David Gilbert, powered by PmWiki