Pull to refresh

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

Reading time9 min
Views37K
Система мониторинга 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<br/>
 <br/>
//Основные настройки, не забудьте указать свои значения!<br/>
 <br/>
//1. Папка для хранения изображений<br/>
define('TMP_PATH', '/usr/local/share/zabbix/php/tmp/');<br/>
//2. URL веб-интерфейса Zabbix<br/>
define('ZABBIX_URL', 'http://monitoring.local/');<br/>
//3. Пользователь в Zabbix<br/>
define('ZABBIX_USER', 'mon');<br/>
//4. Пароль для Zabbix<br/>
define('ZABBIX_PW', 'qwerty');<br/>
//5. Пользователь в Cacti<br/>
define('CACTI_URL', 'http://monitoring.local/cacti/');<br/>
//6. Пользователь в Cacti<br/>
define('CACTI_USER', 'admin');<br/>
//7. Пароль для Cacti<br/>
define('CACTI_PW', 'qwerty');<br/>
//8. Ширина рабочего стола в пикселях<br/>
define('WALLPAPER_WIDTH', 1280);<br/>
//9. Высота рабочего стола в пикселях<br/>
define('WALLPAPER_HEIGHT', 1024);<br/>
//10. Ресурсы, выводимые на рабочий стол и их координаты. <br/>
// Координаты придется считать вручную.<br/>
$resources = array();<br/>
//Карта сети<br/>
$resources[] = array('url' => 'http://monitoring.local/map.php?noedit=1&sysmapid=2', 'x' => 280, 'y' => 0);<br/>
//График температуры<br/>
$resources[] = array('url' => 'http://monitoring.local/chart2.php?graphid=494&width=1138&period=86400', 'x' => 26, 'y' => 400);<br/>
//Веб-камера<br/>
$resources[] = array('url' => 'http://192.168.4.18/axis-cgi/jpg/image.cgi?resolution=320x240', 'x' => 960, 'y' => 690);<br/>
//График из cacti<br/>
$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);<br/>
 <br/>
//Конец настроек<br/>
//Ниже менять ничего не надо, если вы не уверены, что вы делаете.<br/>
 <br/>
$error = false;<br/>
 <br/>
//"Логинимся" скриптом в Zabbix<br/>
$ch = curl_init();<br/>
curl_setopt($ch, CURLOPT_URL, ZABBIX_URL . '/index.php');<br/>
curl_setopt($ch, CURLOPT_POST, 1);<br/>
curl_setopt($ch, CURLOPT_POSTFIELDS, array('form'=>'1', 'form_refresh'=>'1','name'=>ZABBIX_USER, 'password'=>ZABBIX_PW,'enter'=>'Enter'));<br/>
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);<br/>
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);<br/>
curl_setopt($ch, CURLOPT_COOKIEJAR, "./cookie.txt"); //Сохраняем куки в файл<br/>
curl_setopt($ch, CURLOPT_COOKIEFILE, "./cookie.txt");<br/>
 <br/>
$t = curl_exec($ch);<br/>
curl_close($ch);<br/>
 <br/>
 <br/>
//"Логинимся" скриптом в cacti. Удалите эти строчки, если вы не используете cacti<br/>
$ch = curl_init();<br/>
curl_setopt($ch, CURLOPT_URL, CACTI_URL . '/graph_image.php');<br/>
curl_setopt($ch, CURLOPT_POST, 1);<br/>
curl_setopt($ch, CURLOPT_POSTFIELDS, array('action'=>'login', 'login_username'=>CACTI_USER,'login_password'=>CACTI_PW));<br/>
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);<br/>
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);<br/>
curl_setopt($ch, CURLOPT_COOKIEJAR, "./cookie.txt");<br/>
curl_setopt($ch, CURLOPT_COOKIEFILE, "./cookie.txt");<br/>
 <br/>
$t = curl_exec($ch);<br/>
curl_close($ch);<br/>
 <br/>
//Получаем изображения<br/>
foreach($resources as $k => $res)<br/>
{<br/>
$ch = curl_init();<br/>
curl_setopt($ch, CURLOPT_URL, $res['url']);<br/>
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);<br/>
curl_setopt($ch, CURLOPT_COOKIEJAR, "./cookie.txt");<br/>
curl_setopt($ch, CURLOPT_COOKIEFILE, "./cookie.txt");<br/>
 <br/>
$file = curl_exec($ch);<br/>
if($file) file_put_contents(TMP_PATH . 'temp_img' . $k . '.tmp', $file);<br/>
else $error = true;<br/>
curl_close($ch);<br/>
}<br/>
 <br/>
//Создаем "обои" на рабочий стол<br/>
$wp = imagecreatetruecolor(WALLPAPER_WIDTH, WALLPAPER_HEIGHT);<br/>
 <br/>
if(!$error)<br/>
{<br/>
//Все в порядке<br/>
 <br/>
//Заливаем синим фоном<br/>
$bg = imagecolorallocate($wp, 58, 110, 165);<br/>
imagefill($wp, 0, 0, $bg);<br/>
 <br/>
//Добавляем картинки<br/>
$images = array();<br/>
foreach($resources as $k => $res)<br/>
{<br/>
$im = imagecreatefromfile(TMP_PATH . 'temp_img' . $k . '.tmp');<br/>
if(!$im)<br/>
{<br/>
$error = true;<br/>
break;<br/>
}<br/>
imagecopy($wp, $im, $res['x'], $res['y'], 0, 0, imagesx($im), imagesy($im));<br/>
imagedestroy($im);<br/>
} <br/>
imagepng($wp, TMP_PATH . 'temp_fin.png'); <br/>
}<br/>
 <br/>
if($error)<br/>
{<br/>
//Если произошла ошибка, заливаем рабочий стол серым цветом<br/>
$bg = imagecolorallocate($wp, 192, 192, 192);<br/>
imagefill($wp, 0, 0, $bg);<br/>
}<br/>
 <br/>
//Конфертируем полученный PNG файл в BMP с помощью ImageMagick<br/>
$imgk = new Imagick(TMP_PATH . 'temp_fin.png');<br/>
$imgk->pingImage(TMP_PATH . 'temp_fin.png');<br/>
$imgk->readImage(TMP_PATH . 'temp_fin.png');<br/>
$imgk->setImageCompression(imagick::COMPRESSION_NO);<br/>
$imgk->setImageFormat("bmp");<br/>
$imgk->writeImage(TMP_PATH . 'wp.bmp');<br/>
 <br/>
 <br/>
//Функция открытия изображения в зависимости от его типа с сайта php.net<br/>
function imagecreatefromfile($path)<br/>
{<br/>
    $info = @getimagesize($path);   <br/>
    if(!$info) return false;<br/>
 <br/>
    $functions = array(<br/>
        IMAGETYPE_GIF => 'imagecreatefromgif',<br/>
        IMAGETYPE_JPEG => 'imagecreatefromjpeg',<br/>
        IMAGETYPE_PNG => 'imagecreatefrompng',<br/>
        IMAGETYPE_WBMP => 'imagecreatefromwbmp',<br/>
        IMAGETYPE_XBM => 'imagecreatefromwxbm',<br/>
        );<br/>
 <br/>
    if(!$functions[$info[2]]) return false;<br/>
 <br/>
    if(!function_exists($functions[$info[2]])) return false;<br/>
 <br/>
    return $functions[$info[2]]($path);<br/>
}<br/>
?>


Шаг 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<br/>
Set oXMLHTTP = CreateObject("MSXML2.XMLHTTP") <br/>
oXMLHTTP.Open "GET""http://monitoring.local/tmp/wp.bmp", 0'адрес сайта <br/>
oXMLHTTP.Send<br/>
On Error Goto 0 <br/>
 <br/>
Set oADOStream = CreateObject("ADODB.Stream") <br/>
oADOStream.Mode = 3 <br/>
oADOStream.Type = 1 <br/>
oADOStream.Open <br/>
oADOStream.Write oXMLHTTP.responseBody <br/>
oADOStream.SaveToFile "C:\\wp.bmp", 2'куда файл сохранять<br/>
Set oXMLHTTP = Nothing<br/>
Set oADOStream = Nothing<br/>
 <br/>
 <br/>
Dim WshShell<br/>
Set WshShell = WScript.CreateObject("Wscript.Shell")<br/>
WshShell.RegWrite "HKCU\Control Panel\Desktop\Wallpaper""""C:\\wp.bmp"""<br/>
WshShell.Run "%windir%\System32\RUNDLL32.EXE user32.dll,UpdatePerUserSystemParameters", 1, True<br/>
 <br/>
Set WshShell = Nothing


Windows Vista/Windows 7
Здесь ситуация сложнее. Для смены обоев необходимо вызвать WinAPI функцию. VBScript этого сделать не может, поэтому нам придется написать небольшую программку на C++.
Идея взята отсюда.
В конце статьи есть ссылка на скомпилированный exe-шник, но на всякий случай привожу исходный код:
#include <windows.h><br/>
#include <stdio.h><br/>
#include <iostream><br/>
int main(int argc, char **argv)<br/>
{<br/>
if(argc == 0) return 1;<br/>
SystemParametersInfo( SPI_SETDESKWALLPAPER, 0(PVOID)argv[1], SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );<br/>
return 0;<br/>
}<br/>
 

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

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

Готово!

Файлы проекта — zabbix_wallpaper.zip.
Tags:
Hubs:
+24
Comments20

Articles