Время на прочтение13 мин
Количество просмотров57K
0. Интро
Я не нашел на Хабре ни одной статьи по NetXMS, хотя очень искал. И только по этой причине решил написать сие творение, дабы уделить внимание данной системе.
Это и tutorial, и how to, и поверхностный обзор возможностей системы.
Данная статья содержит поверхностный анализ и описание возможностей системы. Глубоко в возможности я не закапывался по ряду причин. Да и описание всего функционала заняло бы далеко не одну статью.
Так как более-менее я работал только с Zabbix’ом — в статье будет часто упоминаться именно эта система для сравнения с сабжем. К тому же как-то так повелось, что все сравнивается с чем-то общепризнанным.
1. Что и зачем?
Система мониторинга, как видно из определения, — система, позволяющая в любой момент времени получить актуальную информацию по какому-либо узлу сети\машине\маршрутизатору\вписать нужное.
Зачем это нужно — так же очевидно. Чтобы быть в курсе происходящего.
Зачастую, система мониторинга может дать весьма исчерпывающую информацию о состоянии как инфраструктуры в целом, так и отдельных ее частей. Плюс к тому, если настроить оповещения (а без нее грош цена любому мониторингу), то на выходе мы получаем серьезный инструмент, который позволяет не только своевременно реагировать на уже возникшие аварийные ситуации, но и, в большинстве случаев, дает возможность эти аварии предотвратить.
2. Почему NetXMS?
Немного оффтопа для тех, кто любит многабукафф
В бытность свою молодым и неопытным… Так обычно все сказки начинаются?.. Словом, когда я был максималистом, я изучал вопрос мониторинга инфраструктуры, и результатом тех «исследований» стал вывод о том, что лучше Zabbix ничего нет. И на тот момент он мне действительно понравился, потому что многое может, многое умеет, и его функционал можно расширить самописными скриптами, так что можно сказать, что он может вообще все, если руки растут из правильного места. Но Zabbix довольно сложный инструмент. Для того, чтобы с ним худо-бедно разобраться, у меня ушло почти две недели. И это просто стадия внедрения. Потом еще пара недель на настройку мониторинга всего, что мне тогда было необходимо. А как с его помощью смотреть состояние портов на маршрутизаторах я почитал-почитал, испугался, и решил, что мне это не очень-то и необходимо… Не, ну там реально страшно для неподготовленного ума сразу после института…
И вот спустя несколько лет, повзрослев и заматерев, я решил, что пришло время освежить знания о системах мониторинга. И наконец-то сделать нормальный, стабильный мониторинг сети, так как эта проблема стала актуальной в связи с ростом сегментов, подключением филиала и прочих мелочей. Все ж течет, все меняется. И стал я тестировать всяческие инстрУменты. То эту систему поставлю, потрогаю, то ту. И везде чего-то не хватает, везде что-то не нравится. То интерфейс неудобный, то настраивать замучаешься, то еще чего. И тут мне подвернулась NetXMS. К слову: там, где с Zabbix я разбирался две недели, с NetXMS все пошло-поехало за пару часов. Возможно, сказался опыт работы с Zabbix, а может быть дело в самом NetXMS… трудно сказать.
NetXMS оказалась довольно простой в установке и настройке системой. У нее есть версии сервера и консоли администрирования как под Windows так и под Linux, построение графиков, встроенный «браузер», который позволяет изнутри консоли администрирования коннектиться к тем же маршрутизаторам по http\https протоколам, и интерфейс интуитивно понятный, а так же агент под любую ОС. Словом, эта система оказалась простой и удобной. На первый взгляд.
Документация у них, к слову сказать, на 8 из 10. Основные вещи в ней указаны, но, чтобы вникнуть в тонкости, нужно поковыряться.
Основные плюсы, обозначенные разработчиком
Глубокий мониторинг сети
Автоматическое обнаружение, визуализация и поиск подключенных компонентов на уровне 2 и 3
Полная поддержка SNMPv3
Активное обнаружение с помощью сканирующих «зондов»
Пассивное обнаружение на основе информации от контролируемых устройств — ARP и таблиц маршрутизации, интерфейсов
Мониторинг приложений и серверов
Все основные метрики, которые вы ожидаете: процессор, файловые системы, ввод-вывод, память, трафик
Мост JMX для мониторинга приложений Java
Расширения для конкретных приложений: Oracle, MySQL, PostgreSQL, MongoDB, DB2, Tuxedo и многие другие
API интеграции для собственных приложений
Предназначен для больших сетей
Один сервер может отслеживать сотни метрик на тысячах устройств
Полная поддержка распределенного мониторинга и горизонтального масштабирования
Мониторинг перекрывающихся IP-подсетей
Гибкий контроль доступа для операторов и клиентов
3. Углубляемся
Как установить систему — есть целый мануал администратора, доступный на сайте разработчика, и ничего сложного в этом нет, поэтому на этом останавливаться не буду. Самое трудное в установке — подключение системы к базе данных… Тут разница будет лишь в выборе СУБД и ОС сервера. Я выбрал Windows (далее-далее-ввести данные-готово) и MSSQL, так как он у меня уже был.
3.1. Включаем автообнаружение
Автообнаружение узлов сети можно включить при установке. Если это не было сделано по каким-то причинам, то его всегда можно включить в «Configuration-Network Discovery» или щелкнув по иконке с тем же именем. В рабочей области появятся свойства обнаружения. Нужно его включить, переведя в пассивный или активный режим, и обозначить другие свойства, например, опрашиваемые подсети. Так же тут можно накрутить фильтры, причем можно как выбрать и донастроить встроенные в систему, так и написать собственные скрипты. Честно скажу — мне фильтры не понадобились. Но выглядит настройка довольно дружелюбно и понятно.
Так же здесь можно указать SNMP community по умолчанию и его credentials (читай авторизацию).
3.2. Добавление узлов
При включенном автообнаружении конечные ноды (ПК, принтеры) будут добавлены и распределены по подсетям автоматически. С активным сетевым оборудованием все несколько сложнее.
Начать следует с включения на сетевом оборудовании SNMP и настроив community. Если в свойствах автообнаружения узлов сети не менялось значение по умолчанию для SNMP community, то система использует public community, при этом данную настройку можно изменить для каждого узла в свойствах добавляемой ноды (node).
Для удобства можно группировать девайсы по любому удобному принципу, для этого в дереве можно создавать контейнеры в ветке Infrastructure Services и биндить в них ноды из Entrie Network.
После включения и настройки SNMP на маршрутизаторах и добавления их в список отслеживаемого оборудования, система сама с ними свяжется, опросит, определит, что это за девайсы, применит шаблоны, начнет сбор данных и покажет front panel для каждого маршрутизатора. Сама. Из коробки. Когда я настраивал Zabbix, о подобном я мог только мечтать.
Я добавлял все свои сетевые железки вручную, так как сами они у меня по какой-то причине не обнаружились. Тут все просто. Создаем контейнер в Infrastructure Services с любым удобным названием (например switches), и ПКМ-создать-ноду, указать отображаемое имя ноды, ее IP-address и лучше поставить галку на «отключить использование NetXMS агента», так как его все равно невозможно установить на сетевое оборудование, а лишние пакеты ни к чему.
Встроенный браузер. Можно просто ПКМ на нужном маршрутизаторе и открыть web-интерфейс девайса. Мне это показалось удобнее, нежели каждый раз лезть в свои записи и искать нужный IP. Правда, браузер так себе.
3.3. Построение карты сети
Прежде всего нужно создать карту сети как объект. Как обычно — в ветке Networks Map ПКМ, создать, выбрать тип карты, задать параметры, и система дальше все сделает сама.
Типы карт следующие:
- Custom. Это карта, предназначенная для формирования вручную, по желанию пользователя.
- Layer 2 topology. Это карта, позволяющая автоматически сделать все за пользователя, опираясь на 2 уровень модели OSI (по-сути, строит карту основываясь на mac-адресах устройств).
- IP topology, она же Layer 3. То же самое, что и в случае с Layer 2, только карта строится на основе 3 уровня модели OSI (IP-адреса).
При выборе ручного составления карты нужно перетаскивать ноды из дерева на слой карты, соединять их и т.д. Обычное рисование.
В двух других случаях нужно выбрать точку отсчета, с которой система начнет строить карту. Например, ноду какого-нибудь маршрутизатора. Система считывает с него данные о подключенных устройствах и портах, к которым они подключены, после чего считывает данные со следующего маршрутизатора, сопоставляет, и так далее. После анализа всех устройств NetXMS сама нарисует связи между устройствами сети с указанием портов, куда что подключено. Так же можно указать, чтобы система поместила на карту в том числе и конечные устройства (принтеры, ПК, серверы), просто ткнув в соответствующий пункт в свойствах карты (ПКМ — свойства — свойства карты). Так же в этом пункте можно задать «радиус обнаружения» при желании или необходимости.
Маленькая рекомендация. Включите свойство Always fit layuot to screen, чтобы каждый раз обновляя карту сети не приходилось прокручивать рабочее пространство и работать зумом.
При распределенной топологии сети, можно наложить объекты на карту местности. Так же можно в качестве фоновой подложки использовать, например, фотку стойки с оборудованием в серверной, наложив на нее нужные объекты. Таким образом можно быстро определить статус любого девайса в стойке. На мой взгляд это крайне полезная штука в случае необходимости передать дела преемнику или вновь прибывшему коллеге объяснить положение дел. Наглядно, удобно, самоочевидно.
3.4. Агенты
Агенты существуют как для Windows, так и для Linux. Принцип работы такой же, как и у агентов того же Zabbix: устанавливается на машину, с которой нужно снимать метрики, и передает данные на сервер мониторинга. Агента можно установить как до добавления ноды в систему, так и после. После появления агента на ноде, система через некоторое время начнет принимать от него данные, применив стандартный шаблон. Добавить отслеживаемые параметры можно как для одной ноды, так и прицепив к ней один или несколько предопределенных шаблонов. Рекомендуется, естественно, работать с шаблонами, так как эта настройка более гибкая.
Список отслеживаемых параметров для агентов достаточно обширен. Полный перечень можно посмотреть в Wiki NetXMS
Как только система определит, что на ноде функционирует агент, она сразу же прикрепит эту ноду к одному из дефолтных шаблонов — Windows, Linux, HP-UX, Generic UNIX, AIX, в зависимости от операционной системы ноды.
Стандартный шаблон для Windows-хостов:
Добавить параметр для отслеживания конкретной ноде можно щелкнув «ПКМ-Data Collection Parameter«, далее «ПКМ в рабочей области — New parameter«, и выбрать нужное из списка. Тут же можно настроить и триггеры для отслеживаемого параметра.
Немаловажно, что агенты, так же как у Zabbix, умеют запускать пользовательские скрипты.
Как установить?
Это оффтоп, так как каждый… хммм… как хочет.
Тут вопрос в том — надо ли распространять агентов только на серверы, или вообще на все машины сети? Если серверы, и их немного — проще всего руками. Если много — политики домена, KIX, PoSh. Чем угодно. У агентов есть ключ /SILENT, что позволяет «внедрить» его прозрачно для пользователя (если мы говорим о распространении на все машины сети). Я предпочитаю скрипты, так как можно задать условие и создать некий флаг, в отличии от политик, которые будут ставить программу каждый раз при включении ПК. Итак, пишем скрипт из серии «проверить наличие файла-флага, если нет — запустить инсталлятор с ключом /SILENT и после успешной установки создать файл-флаг». Профит.
3.5. Триггеры
Триггеры можно настроить на реагирование на определенные события в собираемых данных. Например, превышение определенного значения ping-pong до маршрутизатора. Так же настраивается способ оповещения для каждого триггера (для каких-то достаточно значка в консоли, а какие-то сразу шлют оповещения куда только можно). Реакция на событие выбирается из преднастроенных в Action Configuration.
Для создания триггера: войти в Data Collection Cnfiguration ноды или шаблона, двойной щелчок по интересующему параметру (если нет, то надо его сперва создать), и в свойствах перейти на вкладку Thresholds, нажать кнопку добавить.
«Function» — какое или какие значения брать для вычисления условия. Может принимать следующие значения (количество используемых для проверки значений указывается в поле Samples):
— Last polled value: последнее/ние полученное/ные значение/ния
— Average value: среднее значение из последних
— Mean deviation: среднее отклонение
— Diff with previous value: разница с предыдущим значением
— Data collection error: ошибка получения данных
— Sum of values: сумма значений
— Script: значение, полученное в результате работы пользовательского скрипта
«Operation» — условие срабатывания триггера. Может принимать значения (значение указывается в соответствующем поле Value):
— <: less than: меньше, чем
— <=: less than or equal to: меньше или равно
— == equal to: эквивалентно
— >=: great than or equal to: больше или равно
— >: great than: больше, чем
— !=: not equal to: не эквивалентно
— like: приближенно к
— not like: не приближенно к
На счет двух последних параметров у меня нет уверенности в том, как они работают. По этому не буду даже предполагать какие границы в них встроены.
Словом, все как в том же Zabbix, только не надо руками формулы вписывать, боясь ошибиться или очепятаться. Для восстановления триггера (deactivation event) система сама подставит значение. (В Zabbix опять надо печатать и не опечататься).
3.6. Шаблоны
ПКМ-создать шаблон, ввести имя шаблона. ПКМ-Data Collection Cnfiguration.
Немного теории
Собираемая информация может поступать из нескольких источников. Это может быть агент NetXMS, работающий на машине, может быть «простой запрос» или «Internal«, отправляемый самим сервером (например тот же ping), «SNMP«, «check point SNMP«, «Push«, «Windows Performance Counters«, «SM-CLP«, или же пользовательский «скрипт«. У каждого типа информации можно выбрать тип, который система будет ожидать при получении. Например, ping будет возвращать целочисленное значение (integer), количество свободного дискового пространства в байтах так же будет integer, а вот та же температура будет уже не целочисленным, то есть real).
Для сбора информации через SNMP в NetXMS есть огромный список предопределенных параметров, то есть можно не вписывать конкретный OID, а найти его в дереве MIB, что достаточно проблематично на самом деле… Но. В итоге нужно копаться в документации производителя и искать IOD значения для каждого девайса по-отдельности. Можно убить массу времени на настройку считывания информации с девайсов, натыкаясь на сообщение системы «UNSUPPORTED», а в итоге окажется, что данное конкретное устройство просто не умеет предоставлять запрошенную инфу. Тут остается только курить мануалы
и надеяться
.
Например, чтобы собирать информацию о времени отклика ноды (ping), нужно добавить новый параметр (ПКМ-new parameter), в поле Origin выбрать Internal, нажать кнопку Select, и выбрать Ping Time. Там есть поиск, о чем в Zabbix я только мечтал. Так же есть смысл изменить период опроса ноды (по умолчанию стоит 60 секунд, то есть если маршрутизатор перестанет отвечать сразу после того, как был опрошен системой мониторинга, то пройдет почти целая минута до того, как система поймет, что с ним что-то не так, и забьет тревогу).
Список Internal данных, которые можно обрабатывать:
После того, как в шаблон были добавлены все необходимые настройки, нужно нажать ПКМ-apply и выбрать все ноды, к которым этот шаблон нужно применить (ctrl+ЛКМ). И все. После этого в дереве под шаблоном появится ветка, раскрыв которую, можно увидеть все ноды, к которым этот шаблон применен.
При откреплении от шаблона ноды, собираемые данные не перестают собираться, чтобы отменить их сбор нужно для каждой ноды зайти в Data Collection Configuration и удалить все вручную, либо сначала удалить параметры из шаблона и только потом удалять из него ноды. Я не знаю, для чего сделано именно так, но, на мой взгляд, это крайне странная штука. Но… Уж как есть.
В шаблоне можно выбрать нужные собираемые данные, и скопировать их в другой шаблон. Массово. И не надо копипастить из одного шаблона в другой руками…
Я уже начинаю ненавидеть Zabbix..
3.7. Dashboards
Как это ни странно, но NetXMS Wiki по этому поводу содержит лишь одну ссылку на youtube: Creating a Dashboard, нет даже списка и описания элементов, которые можно добавить на Dashboard. В принципе, там все так же интуитивно понятно. Label — это просто… ну… Label же… Я даже не знаю, как это перевести. Словом, поле с надписью, используется для обозначения и разграничения элементов, так как сами элементы названий не содержат. Line Chart — это линейный график. Bar Chart — это диаграмма. Alarm Viewer — список предупреждений для выбранного/ных узла/ов. Словом, названия говорят сами за себя.
Далее нужно открыть свойства дашборда и настроить представления. Нас интересует вкладка Dashboard Elements. Number of columns — это количество колонок, элементов, которые будут расположены по горизонтали. У каждого объекта есть свои свойства, и я бы рекомендовал снимать галку с пункта Layout-Grab execessive vertical space, чтобы минимизировать размер каждого элемента.
3.8. Action Configuration
(Configuration-Actions Configuration)
По-сути, это действия в ответ на срабатывание триггеров.
NetXMS умеет отправлять e-mail, sms, xmpp сообщение, в ответ на срабатывание триггера. Тут все тривиально — просто заполнить нужные поля.
Также можно:
— Передать оповещение на другой NetXMS сервер
— Выполнить команду на сервере администрирования NetXMS
— Выполнить команду на ноде с помощью агента NetXMS
— Выполнить NXSL скрипт (NSXL — это свой скриптовый язык программирования NetXMS)
После создания действия ему можно настроить время задержки выполнения, а так же применить макрос для выполнения. Время задержки нужно для того, чтобы не беспокоить оператора в случае, если проблема разрешится сама собой (например, время ответа на ping-запрос было больше заданного значения, но при следующей проверке оно может вернуться в норму, так зачем беспокоить по таким пустякам?).
3.9. Разграничение прав доступа
Для каждого объекта можно настроить свои права доступа. Для каждого объекта внутри другого объекта так же можно настроить права доступа. Это позволяет очень гибко распределять обязанности и возможности мониторинга для различных групп пользователей. Это все, что я хотел сказать.
4. Заключение
Я бы хотел опровергнуть название своей же статьи. NetXMS не для ленивых. Просто разработчики не сделали акцента на функциональности,
как некоторые,
но, помимо всего прочего, позаботились так же и об интерфейсе.
Давайте так. Я пользовался Zabbix’ом и NetXMS. По этому просто напишу свои ощущения от двух этих систем.
Итак.
NetXMS видится мне крайне дружелюбной к пользователю системой. Ну… к админу… да, к админу. У нее есть то, что называется интуитивно понятным интерфейсом, и это прям здорово. Не нужно писать свои формулы, читать кучу сопроводительной документации, чтобы включить проверку пингов до свича или еще какую-то простейшую вещь. Но. В Zabbix эта же простейшая вещь не многим отличается от чего-то реально непростого, то есть если освоил это — то так же сделаешь и все остальное. В NetXMS есть подсказки, большинство параметров можно найти в интерфейсе, выбрать мышкой и настроить. В Zabbix нужно узнать, а может ли система вот то-то и это, и если да — то как это пишется и какие параметры возвращает. Zabbix выигрывает в комьюнити и тоннах шаблонов на все случаи жизни… если в этой горе хлама получится найти то, что нужно… С другой стороны у NetXMS так же есть куча поклонников и созданных ими добавок к этой системе. Да и сама система из коробки умеет мониторить самые популярные приложения, о чем сказано на главной странице проекта.
Главным плюсом NetXMS против Zabbix для меня оказалась возможность запустить скрипт на проблемной ноде в ответ на срабатывание триггера. Поднялась температура ЦП выше порога — она сама погасит хост. А потом уже будем разбираться — в чем проблема. Возможно, в Zabbix такая штука тоже есть, но я не смог. Так же как и в мониторинг портов на маршрутизаторах. А тут само… Ну, как само… Надо освоить скриптовый язык, и все…
Права доступа в NetXMS позволяют очень гибко разграничивать возможности различных пользователей системы. Но чтобы все это настроить нужно прям повозиться.
В целом системы достаточно похожи, и возможности у них, на первый взгляд, кажутся как минимум сравнимыми. Хотя чувствуется, что Zabbix может больше, но эти возможности кроются глубоко под капотом и для простого смертного админа «все в одном» недостижимы. NetXMS же видится простой и понятной, дружелюбной и приятной.
У Zabbix отличная документация, wiki, how to, F.A.Q., best practice, а так же всевозможные форумы и т.д., где можно найти ответы практически на все вопросы. А если что — задать собственный.
Резюмируя, я бы хотел рекомендовать NetXMS для людей, которые только начинают или тем, кому не нужно глубоко погружаться в мониторинг всего и вся. Я уверен, что если разбираться с ней дальше, то можно накрутить в ней весьма и весьма тонкие наблюдения.
Но все же главным плюсом я вижу именно очень приятный интерфейс и простоту настройки.
5. Использованные материалы
youtube-канал Tomas Kirnak
NetXMS Wiki
Google-поиск
Если эта публикация вас вдохновила и вы хотите поддержать автора — не стесняйтесь нажать на кнопку
В этой статье я рассмотрю установку серверной части системы мониторинга NetXMS на Windows Server 2019 c Microsoft SQL Server Express 2017. Вообще, мне больше нравится конфигурация Ubuntu Server + PostgreSQL, несмотря на то, что я виндузятник. Преимущества и недостатки есть как у одного варианта, так и и другого, каждый выбирает себе подходящий.
- Установка Microsoft SQL Server Express 2017
- Установка NetXMS
- Установка web-консоли NetXMS
Картинка для привлечения внимания:
На Windows недостаток — это стоимость самой операционной системы Windows Server в первую очередь. Из преимуществ — простота работы с базой MS SQL, бекапов и т.п., так как большинство виндузятников уже имеют какой-то опыт работы с MS SQL. Но не буду углубляться в сравнения, статья не об этом.
Казалось бы, чего проще, всего лишь установка, которая в принципе и в мануале описана и в Интернете статьи присутствуют (хотя подробной пошаговой статьи я не нашел). Но, с некоторыми вещами, особенно с подключением к базе во время установки, довольно часто возникают проблемы (такая ошибка, как «Unable to connect to database: [Microsoft][SQL Server native client 11.0]», к примеру), здесь же я описываю стопроцентно рабочий вариант.
Установка Microsoft SQL Server Express 2017
Из предварительных требований, имеем установленный Windows Server 2019 в домене corp.testcompany.ru с именем netxms.corp.testcompany.ru. Установка MS SQL особенно ничем не примечательна, однако на всякий случай пройду по основным пунктам установки. Использоваться будет Express-редакция MS SQL и, в принципе, её вполне достаточно для небольших и даже средних сетей (исключая разве что крупные энтерпрайзы с тысячами серверов и большим объемом параметров мониторинга). К тому же, Express-редакция бесплатна. Естественно, если вы будете собирать много данных, то и в небольшой сети база SQL быстро вырастет, а в Express-редакции доступно всего 10 Гб, это нужно учитывать.
Скачать дистрибутив SQL Server 2017 Express можно отсюда: https://www.microsoft.com/en-US/download/details.aspx?id=55994. Запускаем установку, в окне SQL Server Installation Center нажимаем ссылку «New SQL Server stand-alone installation or add features to existing installation». В появившемся окне установки соглашаемся с лицензией и нажимаем Next. Далее происходит установка необходимых файлов для инсталляции, проверка необходимых требований и т.п.. На странице Install Rules должно быть всё Passed и предупреждение Windows Firewall. Есть смысл прочитать его, если собираетесь подключаться к MS SQL по сети, чтобы открыть необходимые порты. Жмем Next:
На следующей станице нужно выбрать компоненты и каталоги для установки MS SQL. Компоненты оставляем все, они все нам пригодятся. В каталогах я обычно предпочитаю установить инстанс (экземпляр) MS SQL на отдельный диск, именно поэтому указал в поле Instance root directory расположение на диске D:
Но тут, каждый сам решает, как ему удобней.
На следующей странице Instance Configuration, оставляем всё как есть (Named instance «SQLExpress») ) и жмем Next. На странице Server Configuration на вкладке Service Accounts в принципе менять ничего не требуется, но я предпочитаю включать тип автозапуска в Automatic для SQL Server Browser, хотя это необязательно, можно сделать и после установки тем, кому понадобится. Совсем правильно будет использовать отдельную учетную запись в AD для запуска сервиса MSSQL:
А вот на вкладке Collation нужно убедиться в том, что кодировка выставлена в Сyrillic_General_CI_AS, иначе в настройках NetXMS могут быть проблемы с русским языком в элементах NetXMS:
В следующем окне Database Engine Configuration выбираем Mixed Mode (нам это понадобится для создания встроенной учетной записи netxms, используемой для доступа к базе netxms_db) и задаем пароль для встроенной учетной записи sa. После всех настроек и установки можно будет отключить её для пущей безопасности. Я еще обычно добавляю группу Domain Admins в качестве SQL Server Administrators, но тут тоже каждый сам решает, какие учетные записи и группы для этого использовать:
Остальное оставляем по дефолту и нажимаем Next и после завершения процесса установки Close.
Также нам понадобиться установить SQL Management Studio. На момент написания статьи я использовал версию 17.9.1, есть смысл ставить последнюю, проверяя совместимость с вашей версией MS SQL. В её установке ничего особенно нет, так что останавливается на ней не буду.
После установки SQL Management Studio для проверки запустим её и подключимся с MS SQL:
Запомните или скопируйте куда-то содержимое поля «Server Name», оно пригодится при запуске мастера NetXMS. В моем случае это «NETXMS\SQLEXPRESS». Всё, проверили, что подключается, пока больше SQL Management Studio нам не нужна.
Установка NetXMS
Дальше установка собственно NetXMS. Скачать дистрибутив можно с официального сайта по ссылке: https://www.netxms.org/download/. Дистрибутивы выбираем в Server Binaries > Windows (x64). На момент написания статьи я использовал версию 2.2.16. Запускаем файл установки (netxms-2.2.16-x64.exe в моем случае), соглашаемся с лицензионным соглашением, на следующей странице выбираем каталог установки (C:\NetXMS по умолчанию), а в окне Select Components выбираем только нужное:
Снимаем галки с: MariaDB Client Library, MySQL Client Library, PostgreSQL Client Library, Oracle Instant Client и даже с Microsoft SQL Server 2008 Native Client, потому что у нас уже установлен Microsoft SQL Server 2012 Native Client. А вот галку Java Runtime Environment наоборот нужно поставить, она будет нужна для консоли управления NetXMS. Нажимаем Next.
В окне Start Menu Folder оставляем все по умолчанию, в окне Select Additional Tasks тоже, нажимаем Next и в итоговом окне Install.
После установки запустится NetXMS Server Configuration Wizard. Нажимаем Next и попадаем в окно Select Database:
В поле Database server пишем имя сервера «NETXMS\SQLEXPRESS», которое запомнили ранее, выбираем Use existing database (сколько я не бился, заставить NetXMS самостоятельно создать себе базу у меня не вышло). В полях Database name и DB login name оставляем те значения, которые туда подставляет визард, netxms_db и netxms соответственно. Придумываем какой-нибудь пароль и вводи его в поле DB password и… на это останавливаемся, кнопку Next не нажимаем, а запускаем SQL Management Studio, если она еще не запущена.
Первым делом создаем там новую базу с именем netxms_db:
В свойствах базы обязательно меняем Compatibility level на «SQL Server 2012 (110)»:
Далее, идем в Security > Logins и создаем новый логин netxms:
Выбираем SQL Server authentication и задаем пароль, тот, который вводили в поле DB Password визарда NetXMS. Не забудьте снять галки с «Enforce password expiration» и «User must change password at next login». Далее идем в User Mappings отмечаем базу netxms_db и для нее отмечаем роли db_owner и public:
Всё, этого должно быть достаточно для подключения NetXMS к нашей созданной базе. Нажимаем OK и закрываем SQL Management Studio, она нам больше не понадобится. Возвращаемся к визарду NetXMS, еще раз проверяем все данные и теперь уже нажимаем Next.
На странице Polling Configuration можно оставить всё без изменений, всё это можно настроить позднее:
В следующем окне можно указать SMTP Server и e-mail адрес сервера NetXMS, но необязательно, это тоже можно сделать позднее:
На странице Configure Logging оставляем всё как есть, на мой взгляд, забивать системные логи событиями NetXMS не очень удобно:
На странице Windows Service Configuration оставляем всё как есть, хотя правильней, конечно, создать отдельную учетную запись в AD для запуска сервиса:
На следующей странице визард рекомендует выбрать сервисы, только после запуска которых будет стартовать сам сервис NetXMS. Нам рекомендуют выбрать database engine и в этом конечно есть смысл, чтобы сервис NetXMS при запуске подключался к уже запущеной базе. Поэтому ставим галку на SQL Server (SQLExpress) и жмем Next:
В итоговом окне жмем Next:
Если все шаги выполнены верно, то мы получим успешное завершение настройки сервера:
В следующих окнах нажимаем Next и Finish. Если мастер предложит перезагрузиться, то делаем это.
После перезагрузки запускам java-консоль NetXMS, пишем там имя сервера и логин в паролем. Дефолтовые имя и пароль admin и netxms соответственно:
При первом запуске будет предложено сменить дефолтовый пароль на свой:
Меняем и наконец-то заходим в консоль управления NetXMS:
В принципе всё, установка на этом завершена. Но, я бы еще установил доступ к управлению NetXMS через web-браузер, java-консоль хотя удобней и быстрее, но веб доступ универсальней и бывает нужен, когда установленной java-консоли нет под рукой.
Установка web-консоли NetXMS
Её установка простая, в основном Next >Next > Next. Единственное, что у меня она заработала только при выборе компонентов Full Installation, несмотря на то, что Java Runtime Environment уже была установлена ранее:
Порт по умолчанию предлагается выбрать 8080:
Я его так и оставлю, однако, можно сделать его просто 80, чтобы не писать цифры в адресе. После установки проверьте, запущен ли сервис NetXMS WebUI. Если да, значит всё успешно, можно проверять доступ через веб-интерфейс по адресу http://netxms.corp.testcompany.ru:8080/nxmc:
Всё, установка завершена, надо настраивать сервер NetXMS, устанавливать агенты на серверы локальной сети т.п., но, об этом когда-нибудь в другой раз.
This entry was posted on 22.07.2019 в 12:32:00 and is filed under Мониторинг.
Отмечено: Мониторинг, NetXMS. You can follow any responses to this entry through the RSS 2.0 feed.
You can leave a response, или trackback from your own site.
Русский
GNU GPL v2
Система управления и мониторинга сети корпоративного класса, которая обеспечивает комплексное управление событиями, мониторинг производительности, оповещения, отчетность и построение графиков для всех слоев ИТ-инфраструктуры. Полностью на русском языке.
Система имеет трехуровневую архитектуру: информация собирается агентами мониторинга (либо высокопроизводительные агенты NetXMS или агенты SNMP) и предоставляется мониторинг серверу для обработки и хранения. Сетевой администратор может получить доступ к собранным данным с помощью полнофункционального клиентского приложения (MANAGEMENT CONSOLE) или веб-интерфейса.
NetXMS имеет широкий спектр поддерживаемых платформ, операционных систем и СУБД, обеспечивая полную интеграцию с какой-либо инфраструктурой.
NetXMS может быть использована для мониторинга всей ИТ-инфраструктуры, начиная с протокола SNMP-совместимых аппаратных средств (таких как коммутаторы и маршрутизаторы) и заканчивая приложениями на серверах.
Victor Kirhenshtein и Alex Kirhenshtein — оригинальные авторы, поддерживающие NetXMS. NetXMS работает нативно в ОС Windows, ОС Linux и других Unix-подобных системах. Она лицензирована под GNU GPL v2, опубликованной FSF.
Особенности:
- единая платформа для управления и мониторинга всей ИТ-инфраструктурой;
- предназначена для максимальной производительности и масштабируемости;
- распределенный мониторинг сети;
- автоматическое обнаружение сети;
- гибкая и простая в использовании обработка событий
- инструменты анализа воздействия на бизнес;
- быстрое развертывание с минимальными усилиями конфигурации;
- легкая и простая интеграции со смежными продуктами;
- встроенная поддержка большинства популярных платформ и операционных систем;
- мониторинга сетевых устройств, серверов и приложений с одного сервера управления;
- сбор данных из протокола SNMP-совместимых платформ или из родного NetXMS агента;
- возможность отправки электронных писем и смс-уведомлений или выполнение внешних программ как реакция на любое событие, что позволяет пользователям получать предупреждающие уведомления на основе собранных значений;
- организация наблюдаемых объектов в иерархические структуры для представления зависимостей сервисов;
- централизованное удаленное обновление агента;
- портативная клиентская библиотека;
- гибкая политика на основе обработки событий (в том числе правила корреляции);
- удаленные действия;
- гибкая настройка контроля доступа;
- встроенный скриптовый движок для автоматизации и управления.
По умолчанию, логин «admin» и пароль «netxms» для доступа к консоли управления. При первом входе появится окно изменения пароля. Перед использованием рекомендуется изучить инструкции на официальном сайте.
Мониторим программу, которая мониторит компьютерные сети
- Кратко о NetXMS
- 64-битные ошибки
- 64-битная ошибка N1
- 64-битная ошибка N2
- 64-битная ошибка N3
- Ошибки при работе с типом SOCKET
- Потенциальный выход за границу массива
- Ещё одна ошибка работы с беззнаковыми типами
- Буферы, очищенные наполовину
- Copy-paste
- Опечатка
- Неожиданная оптимизация
- Использование неинициализированных переменных
- Указатель в начале используется, а потом проверяется на равенство нулю
- Ошибка использования функций с переменным количеством аргументов
- Не учтено, что оператор ‘new’ генерирует исключения при нехватке памяти
- Странный цикл
- Вместо заключения
Существует проект NetXMS. Это программное обеспечение для мониторинга компьютерных систем и сетей. Может быть использовано для мониторинга всей IT-инфраструктуры, начиная с SNMP-совместимых устройств и, заканчивая программным обеспечением на серверах. А я, естественно, сейчас буду мониторить код этого проекта с помощью анализатора PVS-Studio.
Кратко о NetXMS
Ссылки:
- Описание в Wikipedia: NetXMS
- Сайт.
Проект NetXMS является открытым и распространяется под лицензией GNU General Public License v2. Код написан на языках Си, Си++, Java.
Проект требует целый ряд сторонних библиотек. Если честно, я поленился скачать некоторые из них и добиться сборки этого проекта. Поэтому проект был проверен мной не целиком. Впрочем, это не помешает написать заметку. Всё равно мой анализ носит поверхностный характер. Намного больше пользы принесет проверка проекта его авторами. Предлагаю разработчикам написать нам в поддержку. Я сгенерирую временный ключ для анализатора PVS-Studio, чтобы они могли выполнить более тщательную проверку.
64-битные ошибки
В статьях, описывающих проверку open-source проектов, я увлекся ошибками общего назначения. А ведь 64-битные ошибки тоже никуда не делись. Они везде и повсюду. Только писать про них не так интересно. Когда показываешь разыменовывание нулевого указателя, ошибка очевидна. Если говорить, что в 64-битной программе 32-битная переменная может переполниться, это уже не так интересно. Должны совпасть определенные условия. Приходится говорить о «потенциальных ошибках».
Вдобавок, искать 64-битные ошибки намного сложнее. Набор для выявления 64-битных ошибок даёт очень много ложных срабатываний. Анализатор не знает, каков допустимый диапазон входных значений и ругается на всё, сколько-нибудь подозрительное. Чтобы найти действительно опасные места, придётся просмотреть много сообщений. Это единственный путь, чтобы быть уверенным, что программа корректно перенесена на 64-битную платформу. Особенно это касается приложений, которые используют более 4 гигабайт оперативной памяти.
Одним словом, писать статьи про поиск обыкновенных ошибок проще, чем про поиск 64-битных. Но в этот раз, я не поленился и высмотрел несколько опасных мест. С них и начну.
64-битная ошибка N1
BOOL SortItems(...., _In_ DWORD_PTR dwData);
void CLastValuesView::OnListViewColumnClick(....)
{
....
m_wndListCtrl.SortItems(CompareItems, (DWORD)this);
....
}
V220 Suspicious sequence of types castings: memsize -> 32-bit integer -> memsize. The value being casted: ‘this’. lastvaluesview.cpp 716
Раньше в 32-битных системах, размер указателя равнялся 4 байтам. Если нужно было сохранить или передать указатель как целочисленный тип, для этого использовались типы DWORD, UINT и так далее. В 64-битных системах размер указателя увеличился до 8 байт. Чтобы хранить их в целочисленных переменных, появились типы DWORD_PTR, UINT_PTR и прочие. Интерфейсы функций претерпели соответствующие изменения. Посмотрите, как объявлена функция SortItems() в первой сточке примера.
К сожалению, в программе осталось приведение указателя к 32-битному типу DWORD. Такая программа успешно компилируется. Указатель явно приводится к 32-битному типу DWORD, а затем неявно расширяется до DWORD_PTR. А самое плохое, что такая программа чаще всего успешно функционирует.
Программа будет работать до тех пор, пока экземпляры класса CLastValuesView будут создаваться в младших четырёх гигабайтах памяти. То есть почти всегда. Но может сложиться ситуация, когда программе потребуется много памяти. Или после долгой работы произойдет фрагментация памяти. Тогда объект будет создан за пределами 4 гигабайт и ошибка проявит себя. Указатель потеряет старшие 32 бита и поведение программы станет неопределенным.
Исправить ошибку очень просто:
m_wndListCtrl.SortItems(CompareItems, (DWORD_PTR)this);
Аналогичные приведения типов находятся и в других местах:
- mibbrowserdlg.cpp 160
- lastvaluesview.cpp 232
- graphdatapage.cpp 370
- graphdatapage.cpp 330
- graphdatapage.cpp 268
- graphdatapage.cpp 172
- controlpanel.cpp 126
Каждое их таких мест — коварнейший баг. Воспроизвести такие ошибки бывает очень сложно. Результат — ОЧЕНЬ РЕДКИЕ падания программы после длительного времени их работы.
64-битная ошибка N2
Следующая ошибка, скорее всего, не критична. Однако, плохо вычисленный хэш-код может привести к замедлению алгоритмов поиска.
static int hash_void_ptr(void *ptr)
{
int hash;
int i;
/* I took this hash function just off the top of my head,
I have no idea whether it is bad or very bad. */
hash = 0;
for (i = 0; i < (int)sizeof(ptr)*8 / TABLE_BITS; i++)
{
hash ^= (unsigned long)ptr >> i*8;
hash += i * 17;
hash &= TABLE_MASK;
}
return hash;
}
V205 Explicit conversion of pointer type to 32-bit integer type: (unsigned long) ptr xmalloc.c 85
В комментарии автор пишет, что не уверен в качестве этой функции. И он прав. Как минимум, здесь есть ошибка в приведении указателя к типу ‘unsigned long’.
Модель данных в Windows и Linux системах различается. В Linux принято использовать модель данных LP64. В ней тип ‘long’ является 64-битным. Таким образом, в Linux системах этот код будет работать, как и планировалось.
В Win64 размер типа ‘unsigned long’ имеет размер 32 бита. В результате, старшая часть указателя теряется, и хэш вычисляется менее качественно.
64-битная ошибка N3
Множество 64-битных ошибок возникает вовсе не из-за явного приведения типов. Но такие ошибки легче искать. В том числе и мне. Поэтому ещё посмотрим ещё на одно плохое приведение типа.
static int ipfix_print_newmsg(....)
{
....
strftime(timebuf, 40, "%Y-%m-%d %T %Z",
localtime( (const time_t *) &(hdr->u.nf9.unixtime) ));
....
}
V114 Dangerous explicit type pointer conversion: (const time_t *) & (hdr->u.nf9.unixtime) ipfix_print.c 68
Член класса ‘unixtime’ объявлен так:
uint32_t unixtime; /* seconds since 1970 */
Тип ‘time_t’ объявляется следующим образом:
#ifdef _USE_32BIT_TIME_T
typedef __time32_t time_t;
#else
typedef __time64_t time_t;
#endif
Если я не ошибаюсь, макрос _USE_32BIT_TIME_T нигде в проекте не объявлен. По крайней мере, я его не нашел. Это значит, что функция localtime() должна работать с временем, представленным 64-битными переменными. А здесь в функцию передаётся адрес 32-битной переменной. Это нехорошо. Функция localtime() будет работать с мусором.
Думаю, читателю теперь понятно, почему я не люблю писать про 64-битные ошибки. Уж очень они невзрачные и неубедительные. Я даже не хочу продолжать искать и приводить другие примеры. Сейчас мы перейдем к ошибкам общего назначения. И они покажутся намного ярче и опасней.
Тем не менее, 64-битные ошибки есть, и если вы заботитесь о качестве 64-битного кода, рекомендую помнить про набор диагностических правил viva64. Эти ошибки будут прятаться от вас гораздо дольше, чем обыкновенные. Чтобы испугаться, рекомендую для чтения на ночь:
- Коллекция примеров 64-битных ошибок в реальных программах
- 64-битные уроки. Урок 24. Фантомные ошибки.
Ошибки при работе с типом SOCKET
В Linux тип SOCKET объявлен как знаковая переменная. В Windows этот тип беззнаковый:
typedef UINT_PTR SOCKET;
Это часто приводит к ошибкам в Windows программах.
static int DoRadiusAuth(....)
{
SOCKET sockfd;
....
// Open a socket.
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0)
{
DbgPrintf(3, _T("RADIUS: Cannot create socket"));
pairfree(req);
return 5;
}
....
}
V547 Expression ‘sockfd < 0’ is always false. Unsigned type value is never < 0. radius.cpp 682
Переменная ‘sockfd’ имеет UINT_PTR. Из этого следует, что условие ‘sockfd < 0’ никогда не выполняется, если программа запущена в операционной среде Windows. Программа будет безуспешно пытаться работать с сокетом, который не был открыт.
Следует не лениться и использовать специальные константы. Этот код должен выглядеть так:
if (sockfd == SOCKET_ERROR)
Аналогичные некорректные проверки можно найти здесь:
- ipfix.c 845
- ipfix.c 962
- ipfix.c 1013
- ipfix.c 1143
- ipfix.c 1169
- ipfix_col.c 1404
- ipfix_col.c 2025
Потенциальный выход за границу массива
int ipfix_snprint_string(....)
{
size_t i;
uint8_t *in = (uint8_t*) data;
for( i=len-1; i>=0; i-- ) {
if ( in[i] == '\0' ) {
return snprintf( str, size, "%s", in );
}
}
....
}
V547 Expression ‘i >= 0’ is always true. Unsigned type value is always >= 0. ipfix.c 488
Переменная ‘i’ имеет тип size_t. Значит проверка «i>=0» не имеет смысла. Если в стоке не будет найден ноль, то функция начнёт читать память далеко за границей массива. Последствия могут быть разнообразнейшие.
Ещё одна ошибка работы с беззнаковыми типами
bool CatalystDriver::isDeviceSupported(....)
{
DWORD value = 0;
if (SnmpGet(snmp->getSnmpVersion(), snmp,
_T(".1.3.6.1.4.1.9.5.1.2.14.0"),
NULL, 0, &value, sizeof(DWORD), 0)
!= SNMP_ERR_SUCCESS)
return false;
// Catalyst 3550 can return 0 as number of slots
return value >= 0;
}
V547 Expression ‘value >= 0’ is always true. Unsigned type value is always >= 0. catalyst.cpp 71
Буферы, очищенные наполовину
Одним из распространённых паттернов ошибок является путаница с размером строк типа WCHAR. Немало примеров можно увидеть в нашей базе ошибок.
typedef WCHAR TCHAR, *PTCHAR;
static BOOL MatchProcess(....)
{
....
TCHAR commandLine[MAX_PATH];
....
memset(commandLine, 0, MAX_PATH);
....
}
V512 A call of the ‘memset’ function will lead to underflow of the buffer ‘commandLine’. procinfo.cpp 278
Тип TCHAR раскрывается в тип WCHAR. Количество символов в массиве ‘commandLine’ равно значению MAX_PATH. Размер этого массива равен ‘MAX_PATH * sizeof(TCHAR). Функция ‘memset’ работает с байтами. Значит, правильное обнуление буфера должно быть таким:
memset(commandLine, 0, MAX_PATH * sizeof(TCHAR));
А ещё лучше написать так:
memset(commandLine, 0, sizeof(commandLine));
Класс CToolBox болен тем же самым:
typedef WCHAR TCHAR, *PTCHAR;
#define MAX_TOOLBOX_TITLE 64
TCHAR m_szTitle[MAX_TOOLBOX_TITLE];
CToolBox::CToolBox()
{
memset(m_szTitle, 0, MAX_TOOLBOX_TITLE);
}
V512 A call of the ‘memset’ function will lead to underflow of the buffer ‘m_szTitle’. toolbox.cpp 28
Copy-paste
В функции findIpAddress() может произойти разыменовывание нулевого указателя. А причина тому скопированная строчка.
void ClientSession::findIpAddress(CSCPMessage *request)
{
....
if (subnet != NULL)
{
debugPrintf(5, _T("findIpAddress(%s): found subnet %s"),
ipAddrText, subnet->Name());
found = subnet->findMacAddress(ipAddr, macAddr);
}
else
{
debugPrintf(5, _T("findIpAddress(%s): subnet not found"),
ipAddrText, subnet->Name());
}
....
}
V522 Dereferencing of the null pointer ‘subnet’ might take place. session.cpp 10823
Вызов функции debugPrintf() явно скопирован. Но в ветке ‘else’ вызов некорректен. Указатель ‘subnet’ равен NULL. Это значит, что «subnet->Name()» делать нельзя.
Опечатка
#define CF_AUTO_UNBIND 0x00000002
bool isAutoUnbindEnabled()
{
return ((m_flags & (CF_AUTO_UNBIND | CF_AUTO_UNBIND)) ==
(CF_AUTO_UNBIND | CF_AUTO_UNBIND)) ? true : false;
}
V578 An odd bitwise operation detected: m_flags & (0x00000002 | 0x00000002). Consider verifying it. nms_objects.h 1410
Выражение (CF_AUTO_UNBIND | CF_AUTO_UNBIND) очень странное. Скорее всего, здесь должно использоваться две разные константы.
Неожиданная оптимизация
void I_SHA1Final(....)
{
unsigned char finalcount[8];
....
memset(finalcount, 0, 8);
SHA1Transform(context->state, context->buffer);
}
V597 The compiler could delete the ‘memset’ function call, which is used to flush ‘finalcount’ buffer. The RtlSecureZeroMemory() function should be used to erase the private data. sha1.cpp 233
В функциях, связанных с криптографией, принято очищать временные буферы. Если этого не делать, последствия могут быть очень интересными. Например, фрагмент секретной информации может непреднамеренно быть отправлен по сети. Подробности про это можно почитать в статье «Перезаписывать память — зачем?».
Для очистки памяти часто используют функцию memset(). Это неправильно. Если массив после обнуления больше не используется, компилятор может удалить функцию memset(). Это делается с целью оптимизации. Чтобы этого не происходило, следует использовать функцию RtlSecureZeroMemory().
Использование неинициализированных переменных
Многие уверены, что неинициализированные переменные это самая неприятная и частая ошибка. По опыту анализа различных проектов, я думаю это не так. Про эту ошибку очень много говорится в книгах и статьях. В результате, все знают, что такое неинициализированные переменные, чем это грозит, как избегать таких ошибок и, как их искать. По моему ощущению, гораздо больше ошибок связано, например, с Copy-Paste. Однако, это, конечно, не значит, что неинициализированные переменные побеждены. Вот они.
int OdbcDisconnect(void* pvSqlCtx)
{
....
SQLRETURN nSqlRet;
....
if (nRet == SUCCESS)
{
....
nSqlRet = SQLDisconnect(pSqlCtx->hDbc);
....
}
if (SQLRET_FAIL(nSqlRet))
....
}
V614 Potentially uninitialized variable ‘nSqlRet’ used. odbcsapi.cpp 220
Переменная nSqlRet инициализируется, только если мы попали в тело оператора ‘if’. А вот проверяется оно потом всегда. В результате, иногда в этой переменной будет лежать случайное значение.
Не всегда инициализируются переменные и в других местах:
- session.cpp 2112
- session.cpp 7525
- session.cpp 7659
- functions.cpp 386
- unlock.cpp 63
- alarmbrowser.cpp 539
Указатель в начале используется, а потом проверяется на равенство нулю
Очень часто в ходе рефакторинга получается так, что проверка указателя, оказывается ниже в тексте программы, чем разыменование указателя. Здесь можно увидеть множество примеров.
Для выявления данного паттерна ошибок используется диагностика V595. Часто количество таких дефектов исчисляется в программе десятками. Однако, к чести NetXMS, я обратил внимание только на один такой фрагмент кода:
DWORD SNMP_PDU::encodeV3SecurityParameters(....,
SNMP_SecurityContext *securityContext)
{
....
DWORD engineBoots =
securityContext->getAuthoritativeEngine().getBoots();
DWORD engineTime =
securityContext->getAuthoritativeEngine().getTime();
if ((securityContext != NULL) &&
(securityContext->getSecurityModel() ==
SNMP_SECURITY_MODEL_USM))
{
....
}
V595 The ‘securityContext’ pointer was utilized before it was verified against nullptr. Check lines: 1159, 1162. pdu.cpp 1159
Были и другие предупреждения V595. Но они мне показались не убедительными, чтобы приводить их в статье. Скорее всего, это просто избыточные проверки.
Ошибка использования функций с переменным количеством аргументов
Ошибки при использовании функции printf() и аналогичных ей, являются классикой. Причина в том, что функции с переменным количеством аргументов не контролируют типы передаваемых аргументов.
#define _ftprintf fwprintf
static __inline char * __CRTDECL ctime(const time_t * _Time);
BOOL LIBNETXMS_EXPORTABLE SEHServiceExceptionHandler(....)
{
....
_ftprintf(m_pExInfoFile,
_T("%s CRASH DUMP\n%s\n"),
szProcNameUppercase,
ctime(&t));
....
}
V576 Incorrect format. Consider checking the fourth actual argument of the ‘fwprintf’ function. The pointer to string of wchar_t type symbols is expected. seh.cpp 292
Макрос _ftprintf() раскрывается в функцию fwprintf(). Строка форматирования указывает, что в функцию должны передаваться строки типа ‘wchar_t *’. Однако, функция ctime() возвращает строку, состоящую из символов типа ‘char’.
Скорее всего, этот баг остается незамеченным, так как находится в обработчике ошибок.
Есть ещё пара ошибок этого рода:
- nxpush.cpp 193
- nxpush.cpp 235
Не учтено, что оператор ‘new’ генерирует исключения при нехватке памяти
Ранее оператор ‘new’ возвращал ‘NULL’, если не мог выделить память. Теперь он генерирует исключение. Во многих программах это не учтено. Не всегда это страшно, но иногда может приводить к сбоям. Рассмотрим фрагмент кода из проекта NetXMS:
PRectangle CallTip::CallTipStart(....)
{
....
val = new char[strlen(defn) + 1];
if (!val)
return PRectangle();
....
}
V668 There is no sense in testing the ‘val’ pointer against null, as the memory was allocated using the ‘new’ operator. The exception will be generated in the case of memory allocation error. calltip.cpp 260
Раньше, если не удавалось выделить память, возвращался пустой объект ‘PRectangle’. Теперь при нехватке памяти, возникнет исключение. Я не знаю, критично такое изменение поведения или нет. В любом случае, проверка указателя на равенство нулю больше не имеет смысла.
Следует или удалить проверки, или использовать оператор ‘new’, который не генерирует исключение и возвращает ноль:
val = new (std::nothrow) char[strlen(defn) + 1];
Для проекта NetXMS анализатор PVS-Studio выдает достаточно много предупреждений V668. Поэтому не буду загромождать статью. Авторам будет проще самим проанализировать проект.
Странный цикл
static bool MatchStringEngine(....)
{
....
// Handle "*?" case
while(*MPtr == _T('?'))
{
if (*SPtr != 0)
SPtr++;
else
return false;
MPtr++;
break;
}
....
}
V612 An unconditional ‘break’ within a loop. tools.cpp 280
Тело цикла выполняется не более одного раза. Наверное, ключевое слово ‘break’ в теле цикла является лишним.
Вместо заключения
Новых выводов из проверки проекта NetXMS я не сделал. Везде есть ошибки. Многие из них можно найти с помощью статического анализа. И чем раньше, тем лучше.
Вместо заключения приведу ряд полезных и интересных ссылок:
- Почему важно проводить статический регулярно, а не наскоком, как я сделал это в статье: Статический анализ наиболее эффективен при регулярном использовании. И вот почему.
- Результаты проверки других открытых проектов: PVS-Studio и open-source
- Скачать полнофункциональную демонстрационную версию PVS-Studio.
- Если вы разрабатываете бесплатные open-source проекты, мы можем предоставить ключ для подробной проверки. Пишите нам.
Присылаем лучшие статьи раз в месяц
Перед любым системным администратором всегда стоит вопрос контроля инфраструктуры сети. С этой задачей позволяет справиться использования средств мониторинга, а именно систем мониторинга, которые позволяют наблюдать за различными типами устройств таких как серверы, сетевые устройства, виртуальные машины, персональные компьютеры, принтеры и т.д., а также визуализировать полученную информацию с помощью графиков, комплексных экранов, карт сетей. Одной из функций системы мониторинга является сбор данных нагрузки и производительности оборудования с помощью стандартных протоколов ICMP, SNMP и с использованием собственных агентов, которые поддерживаются большинством операционных систем. Внедрение системы мониторинга позволяет обеспечить бесперебойную работу сервисов, быстро определять проблемный участок инфраструктуры при появлении проблемы, а также станет возможным прогнозирование и разрешение различных типов проблем.
При внедрении системы мониторинга возникает большое количество проблем таких как, неполнота представления существующей физической и логической топологии сети, а также количества оконечных устройств и списка используемых сервисов, которое со временем может изменяться.
Таким образом, целью данной работы было исследование «open-source» кроссплатформенной системы управления и мониторинга сети NetXMS.
Описание системы NetXMS
NetXMS — это система мониторинга с открытым исходным кодом. Он может использоваться для мониторинга всей ИТ-инфраструктуры, начиная с оборудования, совместимого с SNMP (например, коммутаторов и маршрутизаторов) и заканчивая приложениями на серверах. Предоставляются следующие возможности NetXMS:
– Единая унифицированная платформа для управления и мониторинга всей ИТ-инфраструктуры — от сетевых коммутаторов и маршрутизаторов до приложений
– Автоматическое обнаружение сети для уровня 2 и 3 модели OSI
– Сбор данных либо через SNMP, либо через собственного агента NetXMS
– Гибкая система пороговых значений для собранных данных
– Настраиваемые действия для событий, в том числе: один или несколько аварийных сигналов для администратора, выполнение команды на сервере управления или на удаленном хосте через агента NetXMS, SMS и оповещения по электронной почте, перенаправление событий (на другой сервер NetXMS или внешнюю систему)
– Корреляции событий для уменьшения количества предупреждений и увеличения скорости разрешения проблем
– Конфигурация сбора данных на основе шаблонов для упрощенного управления большими сетями
– Шаблонные наборы действий (например, завершение или перезапуск конкретного процесса для любого ПК на базе Windows или Linux, перезагрузка для любого типа устройства и т. д.)
– Дерево зависимостей службы для сопоставления элементов инфраструктуры со службами
– Поддержка SNMP версий 1, 2c, 3
– Встроенный скриптовый движок для расширенной автоматизации и управления
– Собственные C и Java API для быстрой разработки пользовательских клиентских приложений
– Модульная структура сервера и агента (сервер или агент могут быть расширены дополнительными модулями — сторонними или собственными)
Пользовательский интерфейс NetXMS предоставляет следующие возможности:
– Удобная консоль управления Windows и Unix GUI
– Графические сетевые карты (как автоматические, так и ручные)
– Конфигурируемые информационные панели по группам пользователей (например, оператор, администратор, менеджер и т. д.)
Агент NetXMS имеет следующие возможности:
– Централизованная настройка и обновление
– Низкое использование системных ресурсов
– Режим прокси для других агентов NetXMS и устройств SNMP
Система NetXMS имеет трёхуровневую архитектуру: информация собирается агентами мониторинга (NetXMS агентами или агентами SNMP) и доставляется на сервер мониторинга для обработки и хранения. Сетевой администратор может получить доступ к собранным данным с помощью кроссплатформенной консоли управления, веб-интерфейса или консоли управления для Android. [1]
Рис. 1. Архитектура NetXMS
Установка NetXMS
В качестве операционной системы для установки системы мониторинга был выбран Linux Debian 8.7. Установка NetXMS производится из собственного хранилища пакетов NetXMS расположенного по адресу http://packages.netxms.org/. Для того чтобы его использовать необходимо установить дополнительный ключ шифрования для проверки подписи и добавить источник в apt репозитории Linux Debian, который находится в файле /etc/apt/sources.list. Это можно сделать 2-мя способами вручную или через netxms-пакета.
1) С помощью netxms-пакета.
С помощью утилиты wget выполним скачивания пакета и установим его с помощью dpkg, далее обновим список доступных для установки пакетов:
# wget http://packages.netxms.org/netxms-release_1.1_all.deb
# dpkg -i netxms-release_1.1_all.deb
# apt-get update
2) Вручную
В файле sources.list добавляем источник пакетов:
deb http://packages.netxms.org/debian/ jessie main
Скачиваем и устанавливаем дополнительный ключ шифрования и выполняем обновление доступных пакетов:
# wget -q -O — http://packages.netxms.org/netxms.gpg | sudo apt-key add —
# apt-get update
Выполним установку NetXMS-сервера, а также драйверы для работы с базой MySQL:
# apt-get install netxms-server
# apt-get install netxms-dbdrv-mysql
Установим NetXMS-агент:
# apt-get install netxms-agent
Для выполнения функций администрирования данного сервера требуется установить консоль управления с клиентской стороны. Для этого необходимо скачать с https://www.netxms.org/download/, выбрав при этом в разделе Management Console Binaries нужную операционную систему.
Также, для выполнения данных функций можно установить веб-сервер на сервере мониторинга. Для это необходимо предварительно установить Apache Tomcat. Выполним установку при помощи нижеперечисленных команд:
# apt-get install tomcat7
Далее загрузим веб-интерфейс NetXMS по адресу https://www.netxms.org/download/webui/nxmc-2.1-RC1.war и скопируем в папку /var/lib/tomcat7/webapps. В итоге веб-интерфейс доступен по адресу: http://адрес сервера:8080/nxmc/ [1]
Настройка NetXMS
Заходим в консоль управления, при входе потребуется ввести логин и пароль, во вкладке «открыть редактор конфигурации обнаружения элементов сети» указываем пул адресов для обнаружения в автоматическом режиме, выбираем активные и пассивные режимы обнаружения.
Рис. 2. Настройка автоматического обнаружения в NetXMS
Далее переходим во вкладку Настройка → Учётные записи SNMP и вводим используемые SNMP Community (в данном случае «public, tcsmietru»).
Рис. 3. Настройка SNMP в NetXMS
Описание интерфейса NetXMS
При использовании NetXMS на начальном экране слева появляется список подсетей, найденных во время обнаружения. Данный список подсетей формируется исходя из существующих VLAN. Справа располагается подробный вид для выбранного устройства, он позволяет просмотреть общее описание устройства, какие на данный момент установлены компоненты, информацию об интерфейсах и подключённых к нему других устройств. Если на выбранном устройстве нажать правой кнопкой мышью, то возможно выбрать и просмотреть различную полезную информацию. К примеру, для коммутаторов 3-го уровня core.tcs.miet.ru это — таблица маршрутизации, соседи IP, физическая топология, список VLAN c графическим отображением какой порт к какому vlan принадлежит, а также таблицу MAC-адресов коммутатора.
Рис. 4. Начальный экран при входе в консоль NetXMS
Рис. 5. Таблица маршрутизации коммутатора 3-го уровня core.tcs.miet.ru
Рис. 6. Принадлежность Vlan к интерфейсам на core.tcs.miet.ru
Также есть возможность построить существующую логическую и физическую топологию. Имеется несколько режимов расположения элементов: пружинная, круговая, горизонтальное и вертикальное дерево, пользовательское расположение.
Рис. 7. Распределение адресного пространства сети кафедры ТКС
Рис. 8. Фрагмент физической топология сети кафедры ТКС
Литература:
- Официальная документация по NetXMS: [Электронный ресурс], 2016. — Режим доступа: https://wiki.netxms.org/wiki/Server_Installation_Guide (дата обращения: 15.06.2017).
Основные термины (генерируются автоматически): SNMP, VLAN, консоль управления, агент, API, GUI, ICMP, дополнительный ключ шифрования, начальный экран, физическая топология.
