Interactive map for Zabbix

Вкрутил leaflet в Zabbix

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

  • Отображение хостов
  • Отображение триггеров
  • Связи между хостами

Основные слои - на основе OSM. Но также интегрированы карты Yandex и Google, GoogleStreetView, Panoramio

Страничка на GitHub: https://github.com/RussianFox/imap
Скриншоты: http://zabbiximap.lisss.ru/screenshots/

Ты уж Runge не обижай, дополни копирайт “rendering GIScience Research Group @ Heidelberg University”, как это сделано на осм.ру

Честно старался соблюсти все копирайты. Это для какого слоя?

MapSurfer или OSM Roads, 3-й скриншот.

Накосячил с ковычками в коде, поэтому было видно только половину строки. Поправил.

Получилась отличная библиотека! Спасибо!
При ее использовании возник вопрос: как можно смайлы заменить на нужную мне иконку с подсветкой состояния триггеров? В описании нашел только вариант указания hardware объекта - но это чуть-чуть не то…
Возможно ли реализовать данный функционал?

А вот немного не то - это что? Этот вопрос мне задавали не меньше двух десятков раз и всегда оказывалось, что это именно то :slight_smile:

Делал по следующему алгоритму:

  • положил в папку hardware файл server.png;
  • на карте кликнув по объекту в всплывающем окне выбрал “Выбрать тип оборудования” и указал server;
    Сменилась иконка, которая отображается во всплывающем окне и в окне по клику, но на карте так и отображаются зеленые/желтые смайлы, а не выбранный мной тип оборудования…

А еще не работает кнопка “Во весь экран” интерфейса Zabbix’са. Хотя ошибок js не выводит…

В папке imap есть файлик settings.js.template. Скопируйте его в эту же папку и назовите settings.js
В нем вас интересует _imap.settings.useIconsInMarkers. Поменяйте значение на true

Да, действительно - теперь объект помечается выбранным типов оборудования и вокруг него рисуется круг с заливкой цветом… Надо будет только подобрать иконку, а то цвета заливки и иконки перекрываются. А задать несколько иконок на один тип оборудования нельзя? Т.е. самому указать какую иконку при каком статусе триггера выводить. Такой механизм сложнореализуем?

Пока да. Может быть в дальнейшем сделаю.

А еще не работает кнопка “Во весь экран” интерфейса Zabbix’са. Хотя ошибок js не выводит…

Какая версия Zabbix?

2.2.8

Странно, должно работать. Проверю чуть позже.

В любом случае спасибо за разработку. Будем ждать новых версий :slight_smile:

Изменил немного Ваш скрипт.

Добавил в settings.js:


/* true - use hardware icons in status triggers */
/* true - использовать иконки оборудования для статуса триггера */
_imap.settings.useIconsInStatus = true;

В imap.js вместо:


		if (_imap.settings.useIconsInMarkers) {
			_imap.markersList[host_id].marker.setIcon(L.divIcon({className:nottrigger_t+maintenance_t+'icon_status_img icon_status_'+_imap.markersList[host_id].marker.options.status,html:'<img onerror="this.src=\'imap/images/status'+_imap.markersList[host_id].marker.options.status+'.gif\';" src=\'imap/hardware/'+_imap.markersList[host_id].marker.options.hardware+'.png\'>',iconAnchor:[8, 8]}));
		} else {
			_imap.markersList[host_id].marker.setIcon(L.divIcon({className:nottrigger_t+maintenance_t+'icon_status icon_status_smile_'+_imap.markersList[host_id].marker.options.status + ' icon_status_'+_imap.markersList[host_id].marker.options.status,html:'',iconAnchor:[8, 8]}));
		};

заменить на:


		if (_imap.settings.useIconsInStatus) {
			_imap.markersList[host_id].marker.setIcon(L.divIcon({className:nottrigger_t+maintenance_t+'icon_status_img icon_status_'+_imap.markersList[host_id].marker.options.status,html:'<img onerror="this.src=\'imap/images/status/'+_imap.markersList[host_id].marker.options.hardware+_imap.markersList[host_id].marker.options.status+'.png\';" src=\'imap/hardware/'+_imap.markersList[host_id].marker.options.hardware+_imap.markersList[host_id].marker.options.status+'.png\'>',iconAnchor:[8, 8]}));
		}
		else {
			if (_imap.settings.useIconsInMarkers) {
				_imap.markersList[host_id].marker.setIcon(L.divIcon({className:nottrigger_t+maintenance_t+'icon_status_img icon_status_'+_imap.markersList[host_id].marker.options.status,html:'<img onerror="this.src=\'imap/images/status'+_imap.markersList[host_id].marker.options.status+'.gif\';" src=\'imap/hardware/'+_imap.markersList[host_id].marker.options.hardware+'.png\'>',iconAnchor:[8, 8]}));
			} else {
				_imap.markersList[host_id].marker.setIcon(L.divIcon({className:nottrigger_t+maintenance_t+'icon_status icon_status_smile_'+_imap.markersList[host_id].marker.options.status + ' icon_status_'+_imap.markersList[host_id].marker.options.status,html:'',iconAnchor:[8, 8]}));
			};
		};

При этом если изображение hardware (например server.png) положили в /hardware, то необходимо создать папку /images/status и туда положить изображения hardware для разных состояний триггеров и назвать соответственно (например server0.png…server5.png)

Кнопку “Во весь экран” победить не получилось…

Приветствую! Спасибо за библиотеку.
Версию 3.0 все никак не отрелизят, но на днях пришлось обновиться, дабы избавиться от кучи смс, когда вырубается цепочка узлов. Пока полет нормальный.
В связи с чем, вопрос: есть ли какие-нибудь наработки для 3-ей версии? Интерактивную карту на ней завести удалось, но с некоторыми изменениями в imap.php. С кодом фронтенда заббикса практически нисколько не был знаком ранее, поэтому рассчитываю на некоторую помощь.:slight_smile:

сейчас пока ничего не делаю, потому что неожиданно сменил работу, а тут сервера все в одном месте и функционал Interactive Map не требуется.
свободного времени нет. вернее есть, но предпочитаю его использовать для путешествий, пока тепло.
Предложений, пожеланий и идей накопилось достаточно. Планирую к зиме возобновить работу.

P.S. могу отвечать на конкретные вопросы и помогать с конкретными проблемами.

Буду признателен за помощь.
Для того, чтобы заработала карта, исправил только то, на что ругался в логах httpd.
По всей видимости, код фронтенда забби был основательно переработан, не хватало функции getSeverityCaption().
В imap.php добавил:

function getSeverityCaption($severity = null) {
    $config = select_config();

    $severities = array(
        TRIGGER_SEVERITY_NOT_CLASSIFIED => _($config['severity_name_0']),
        TRIGGER_SEVERITY_INFORMATION => _($config['severity_name_1']),
        TRIGGER_SEVERITY_WARNING => _($config['severity_name_2']),
        TRIGGER_SEVERITY_AVERAGE => _($config['severity_name_3']),
        TRIGGER_SEVERITY_HIGH => _($config['severity_name_4']),
        TRIGGER_SEVERITY_DISASTER => _($config['severity_name_5'])
    );
    if (is_null($severity)) {
    return $severities;
    }
    elseif (isset($severities[$severity])) {
        return $severities[$severity];
    }else {
        return _('Unknown');
    }
}

Костыль, понимаю. Буду рад, если подскажете, как иначе.
Далее ругался только на метод CWidget::addPageHeader(). Убрал строку:

$triggerWidget->addPageHeader(_('Interactive map'), get_icon('fullscreen', array('fullscreen' => $_REQUEST['fullscreen'])));

После этого карта запустилась, стала видна картинка.
В итоге я хочу работать с локальным OSM-сервером. Для этого в imap.js заменил tile.osm.org на адрес своего сервера. В отладчике браузера вижу, что картинки мои он тянет, но не те. По всей видимости, значение параметра _imap.settings.startCoordinates, которые я устанавливаю, никого не интересуют. А OSM-сервер содержит тайлы только одного города.