
В работе администратора есть такая штука, как наблюдение за параметрами среды. Иными словами - контроль температуры, влажности воздуха в помещениях. Не буду расписывать, зачем это требуется, это очевидно. Речь о другом, как это делать.
В прошлом подобная задача уже поднималась, только наблюдали не за температурой, а за состоянием серверного хозяйства. Знаю, что стандартный Ping не есть исчерпывающий и достоверный показатель работоспособности сервисов (именно сервисов, не серверов), но для серверов этого хватает, чего и добивались. Теперь задача почти такая же - есть кучка теплодатчиков, за которыми надо присматривать. Вся проблема в том, что датчики эти разбросаны георгафически, а штатные методы наблюдения за ними предполагают открытие большого количества разных программ. Поскольку всякого рода следящих утилит открыто уже и так немало, хотелось бы данный беспорядок причесать. Отдельным недостатком всех этих консолей-мониторов является то, что они молчаливы. То есть, на экране-то они покажут. что есть проблема, но за всем на экране не уследишь. А вот если будет, скажем, писк, это точно привлечет внимание. Попробуем поступить так же, как в свое время и с серверами.
Известно, что эти теплодатчики всю информацию, которую накапливают, отдают наблюдающим консолям через протокол SNMP - Simple Network Management Protocol. Несколько раз с ним сталкивался в прошлом, и всякий раз убеждался, что слово Simple там явно лишнее. Однако, в этот раз деваться некуда, с датчиками можно общаться только посредством SNMP.
Начинаем ковырять предметную область в надежде подружить SNMP и ставший уже просто незаменимым Powershell. Результат плачевен - "из коробки" Powershell работать с SNMP не умеет. Вместо этого предлагается к покупке целый набор надстроек для "мощной ракушки", который обещает нужный функционал. Ключевое слово - покупка. Понятное дело, что никто просто так "космокредитами" не поделится. И тут взгляд цепляется за следующую ссылку: vwiki.co.uk/SNMP_and_PowerShell
Ключевым моментом является библиотека со всеми необходимыми функциями. И там же представлена обвязка на Powershell для вызова этих фукнций. Утаскиваем, настраиваем, проверяем. На входе подаем IP адрес и OID сенсора. На что консоль возвращает - таймаут. Что-то не так. А что там может быть не так? Разрешенные адреса, Community name, пожалуй и все. Стоп. А ведь Community name ведь и забито нестандартное. Немного поменяв одну из функций получаем требуемый результат: скрипт подцепился к указанному сенсору, считал его показания и вывел их на экран. Почти победа, почти - потому что теперь нужно написать обвязку для проверки всех сенсоров, но это уже мелочи жизни. Итогом стал скрипт примерно следующего содержания:
Традиционно, пара слов о том, как это все готовить.
Исходные данные скрипту подаются методом, сходным с предыдущим скриптом: в каталоге с файлом самого скрипта есть папка с простыми текстовыми файлами, в которых и описаны все сенсоры для обхода. Формат данных там вот такой:
IP,OID,Community,Name,MinValue,MaxValue
где IP - адрес сенсора в сети, OID - идентификатор этого же сенсора (именно они являются чуть ли не ядром всего SNMP), Community - имя "сообщества" - читай, логина, Name - отображаемое имя (пример: "Датчик температуры в комнате 1234"), MinValue и MaxValue - соответственно, минимальное и максимальное значение для показаний с данного сенсора.
Строк заголовков в текстовиках быть не должно, скрипт сам все поймет. Самих текстовиков в каталоге config может лежать сколько угодно.
Отдельно о каталоге Include. Там хранится та обвязка на Powershell, через которую вызываются функции стащенного DLL-файла. Обвязка эта выполнена в виде трех файлов, описывающих три разные фукции. Можно их все свести в отдельный файл, но мне показалось удобнее держать их так, разбитыми. Возможно, в дальнейшем я это мнение поменяю.
Изначально фукнции Invoke-SNMPGet и Invoke-SNMPWalk содержат в себе жестко прописанный параметр Community, равный стандартному public. Поскольку это далеко не всегда выполняется, требуется изменить эти фукнции так, чтобы они принимали параметр Community в качестве аргумента. Делается это просто:
меняется на
И, соответственно:
меняется на
Вот, пожалуй, и все.