Как стать автором
Обновить

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

Время на прочтение9 мин
Количество просмотров37K
Система мониторинга 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.
Теги:
Хабы:
Всего голосов 32: ↑28 и ↓4+24
Комментарии20

Публикации

Истории

Работа

Ближайшие события

One day offer от ВСК
Дата16 – 17 мая
Время09:00 – 18:00
Место
Онлайн
Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн
Антиконференция X5 Future Night
Дата30 мая
Время11:00 – 23:00
Место
Онлайн
Конференция «IT IS CONF 2024»
Дата20 июня
Время09:00 – 19:00
Место
Екатеринбург