Выводим состояние серверов из Zabbix на рабочий стол

Система мониторинга Zabbix предоставляет замечательные возможности по мониторингу серверов под управлением ОС AIX, Linux, *BSD, Windows, Mac OS X, сетевого оборудования, Web-приложений, а также любый железяк поддерживающих SNMP или хотя бы отвечающих на пинг. Zabbix бесплатен и распространяется по лицензии GPL. Серверная часть системы устанавливается только под *nix.

Можно настроить отсылку уведомлений на email, jabber, sms при наступлении нежелательных событий, как то падение сервера, чрезмерная загрузка процессора, отсутствие места на диске и т.п. Также существует веб-интерфейс с красивыми графиками и картой сети.
Но сисадмин, как известно, существо ленивое. Поэтому чтобы не лазить постоянно в веб-интерфейс целесообразно вывести некоторые графики и карту сети прямо на его рабочий стол.

Разнорабочий стол

В данной статье мы рассматриваем Windows XP/7 в качестве клиентской машины, но путем небольшого допиливания скрипт можно использовать и в Linux.

Принцип работы:
В Zabbix создаются необходимые графики и карта сети, которую мы хотим выводить на экран. PHP-скрипт раз в минуту обращается к Zabbix, получает от него эти изображения и генерирует из них один рисунок для рабочего стола. Рисунок помещается на веб-сервере. Другой скрипт на клиентской машине периодически скачивает этот рисунок и устанавливает его в качестве обоев.

Шаг 0. Устанавливаем и настраиваем Zabbix.
Этот вопрос уже разжёван в документации, на нем останавливаться не будем.
В статье используется версия 1.8.2. В более ранних версиях используются другие адреса картинок, поэтому если у вас Zabbix 1.4 или 1.6, вам необходимо будет внести коррективы в скрипт.

Шаг 1. Создаем в Zabbix необходимые графики и карты сети.
Этот шаг тоже не должен вызвать затруднений.
Графики можно создать на странице Configuration — Hosts, карту сети — в Maps.

Шаг 2. Пишем скрипт, генерирующий фоновую картинку рабочего стола.
Используем PHP, расширение сURL для получения картинок, библиотеки gd и ImageMagick для работы с изображениями.
Предварительно необходимо создать в Zabbix пользователя, под которым скрипт будет заходить в систему.
Скрипт также будет получать график загрузки WAN интерфейса роутера из cacti и изображение с веб-камеры в серверной. График в cacti кажется более наглядным, чем график Zabbix.
Результатом работы скрипта будет BMP-файл.

Скрипт не претендует на универсальность, но его легко переделать под свои нужды. Обязательно нужно изменить значения констант в начале файла на настройки для вашей системы.

<?php

//Основные настройки, не забудьте указать свои значения!

//1. Папка для хранения изображений
define(‘TMP_PATH’, ‘/usr/local/share/zabbix/php/tmp/’);
//2. URL веб-интерфейса Zabbix
define(‘ZABBIX_URL’, ‘http://monitoring.local/’);
//3. Пользователь в Zabbix
define(‘ZABBIX_USER’, ‘mon’);
//4. Пароль для Zabbix
define(‘ZABBIX_PW’, ‘qwerty’);
//5. Пользователь в Cacti
define(‘CACTI_URL’, ‘http://monitoring.local/cacti/’);
//6. Пользователь в Cacti
define(‘CACTI_USER’, ‘admin’);
//7. Пароль для Cacti
define(‘CACTI_PW’, ‘qwerty’);
//8. Ширина рабочего стола в пикселях
define(‘WALLPAPER_WIDTH’, 1280);
//9. Высота рабочего стола в пикселях
define(‘WALLPAPER_HEIGHT’, 1024);
//10. Ресурсы, выводимые на рабочий стол и их координаты.
// Координаты придется считать вручную.
$resources = array();
//Карта сети
$resources[] = array(‘url’ => ‘http://monitoring.local/map.php?noedit=1&sysmapid=2’, ‘x’ => 280, ‘y’ => 0);
//График температуры
$resources[] = array(‘url’ => ‘http://monitoring.local/chart2.php?graphid=494&width=1138&period=86400’, ‘x’ => 26, ‘y’ => 400);
//Веб-камера
$resources[] = array(‘url’ => ‘http://192.168.4.18/axis-cgi/jpg/image.cgi?resolution=320×240’, ‘x’ => 960, ‘y’ => 690);
//График из cacti
$resources[] = array(‘url’ => ‘http://monitoring.local/cacti/graph_image.php?local_graph_id=5&rra_id=0&view_type=tree&graph_start=’ . (time() 86400) . ‘&graph_end=’ . time(), ‘x’ => 357, ‘y’ => 690);

//Конец настроек
//Ниже менять ничего не надо, если вы не уверены, что вы делаете.

$error = false;

//»Логинимся» скриптом в Zabbix
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, ZABBIX_URL . ‘/index.php’);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, array(‘form’=>‘1’, ‘form_refresh’=>‘1’,‘name’=>ZABBIX_USER, ‘password’=>ZABBIX_PW,‘enter’=>‘Enter’));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_COOKIEJAR, «./cookie.txt»); //Сохраняем куки в файл
curl_setopt($ch, CURLOPT_COOKIEFILE, «./cookie.txt»);

$t = curl_exec($ch);
curl_close($ch);

//»Логинимся» скриптом в cacti. Удалите эти строчки, если вы не используете cacti
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, CACTI_URL . ‘/graph_image.php’);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, array(‘action’=>‘login’, ‘login_username’=>CACTI_USER,‘login_password’=>CACTI_PW));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_COOKIEJAR, «./cookie.txt»);
curl_setopt($ch, CURLOPT_COOKIEFILE, «./cookie.txt»);

$t = curl_exec($ch);
curl_close($ch);

//Получаем изображения
foreach($resources as $k => $res)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $res[‘url’]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_COOKIEJAR, «./cookie.txt»);
curl_setopt($ch, CURLOPT_COOKIEFILE, «./cookie.txt»);

$file = curl_exec($ch);
if($file) file_put_contents(TMP_PATH . ‘temp_img’ . $k . ‘.tmp’, $file);
else $error = true;
curl_close($ch);
}

//Создаем «обои» на рабочий стол
$wp = imagecreatetruecolor(WALLPAPER_WIDTH, WALLPAPER_HEIGHT);

if(!$error)
{
//Все в порядке

//Заливаем синим фоном
$bg = imagecolorallocate($wp, 58, 110, 165);
imagefill($wp, 0, 0, $bg);

//Добавляем картинки
$images = array();
foreach($resources as $k => $res)
{
$im = imagecreatefromfile(TMP_PATH . ‘temp_img’ . $k . ‘.tmp’);
if(!$im)
{
$error = true;
break;
}
imagecopy($wp, $im, $res[‘x’], $res[‘y’], 0, 0, imagesx($im), imagesy($im));
imagedestroy($im);
}
imagepng($wp, TMP_PATH . ‘temp_fin.png’);
}

if($error)
{
//Если произошла ошибка, заливаем рабочий стол серым цветом
$bg = imagecolorallocate($wp, 192, 192, 192);
imagefill($wp, 0, 0, $bg);
}

//Конфертируем полученный PNG файл в BMP с помощью ImageMagick
$imgk = new Imagick(TMP_PATH . ‘temp_fin.png’);
$imgk->pingImage(TMP_PATH . ‘temp_fin.png’);
$imgk->readImage(TMP_PATH . ‘temp_fin.png’);
$imgk->setImageCompression(imagick::COMPRESSION_NO);
$imgk->setImageFormat(«bmp»);
$imgk->writeImage(TMP_PATH . ‘wp.bmp’);

//Функция открытия изображения в зависимости от его типа с сайта php.net
function imagecreatefromfile($path)
{
$info = @getimagesize($path);
if(!$info) return false;

$functions = array(
IMAGETYPE_GIF => ‘imagecreatefromgif’,
IMAGETYPE_JPEG => ‘imagecreatefromjpeg’,
IMAGETYPE_PNG => ‘imagecreatefrompng’,
IMAGETYPE_WBMP => ‘imagecreatefromwbmp’,
IMAGETYPE_XBM => ‘imagecreatefromwxbm’,
);

if(!$functions[$info[2]]) return false;

if(!function_exists($functions[$info[2]])) return false;

return $functions[$info[2]]($path);
}
?>

Шаг 3. Добавляем скрипт в крон
Желательно хранить скрипт в каталоге, который не опубликован на сайте. Иначе скрипт можно будет запускать из браузера, да и файл с куки можно будет утащить.
Добавляем скрипт в крон:
# echo "*/1 * * * * root /usr/local/bin/php /usr/local/share/zabbix/get_image.php > /dev/null 2>&1" >> /etc/crontab
Zabbix по умолчанию обновляет данные раз в 30 секунд, так что обновление картинки можно сделать раз в минуту.

Шаг 4. Устанавливаем на клиентской машине скрипт автоматической смены обоев.
Создадим VBS-скрипт:
Для Windows XP

Dim res
Set oXMLHTTP = CreateObject(«MSXML2.XMLHTTP»)
oXMLHTTP.Open «GET»«http://monitoring.local/tmp/wp.bmp», 0‘адрес сайта
oXMLHTTP.Send
On Error Goto 0

Set oADOStream = CreateObject(«ADODB.Stream»)
oADOStream.Mode = 3
oADOStream.Type = 1
oADOStream.Open
oADOStream.Write oXMLHTTP.responseBody
oADOStream.SaveToFile «C:wp.bmp», 2‘куда файл сохранять
Set oXMLHTTP = Nothing
Set oADOStream = Nothing

Dim WshShell
Set WshShell = Wscript.CreateObject(«Wscript.Shell»)
WshShell.RegWrite «HKCUControl PanelDesktopWallpaper»«»«C:wp.bmp»«»
WshShell.Run «%windir%System32RUNDLL32.EXE user32.dll,UpdatePerUserSystemParameters», 1, True

Set WshShell = Nothing

Windows Vista/Windows 7
Здесь ситуация сложнее. Для смены обоев необходимо вызвать WinAPI функцию. VBscript этого сделать не может, поэтому нам придется написать небольшую программку на C++.
Идея взята отсюда.
В конце статьи есть ссылка на скомпилированный exe-шник, но на всякий случай привожу исходный код:

#include <windows.h>
#include <stdio.h>
#include <iostream>
int main(int argc, char **argv)
{
if(argc == 0) return 1;
SystemParametersInfo( SPI_SETDESKWALLPAPER, 0(PVOID)argv[1], SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
return 0;
}

Теперь необходимо в VBS скрипте для Windows XP заменить строку
WshShell.Run "%windir%System32RUNDLL32.EXE user32.dll,UpdatePerUserSystemParameters", 1, True
на
WshShell.Run "C:wallpaper.exe C:wp.bmp", 1, True

Шаг 5. Добавляем VBS скрипт в планировщик задач
Необходимо запускать скрипт раз в минуту.

Готово!

Файлы проекта — zabbix_wallpaper.zip.

Источник: http://habrahabr.ru/blogs/sysadm/104460/

Share