Zabbix для экспорта графических файлов (.PNG)
Моя цель:
Я хотел бы извлечь графики, связанные с хостами в формате .png. Мое исследование GOOGLE говорит, что у нас нет Zabbix API, разработанного для выполнения этой задачи. Поэтому несколько блогов сообщили пользователю Chart2.php и CURL. Может кто-нибудь объяснить мне, как это сделать (подробные шаги)?
Примечание: Извините, никогда не работал на php или на curl
Когда я попытался
curl https://example.com/zabbix/chart2.php?graphid=1552&width=300&height=300
Получил это, но ссылка не работает
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>302 Found</title>
</head><body>
<h1>Found</h1>
<p>The document has moved <a href="/zabbix/openid?graphid=1552&modauthopenid.referrer=https%3A%2F%2Fexample.com%2Fzabbix%2Fchart2.php%3Fgraphid%3D1552">here</a>.</p>
<hr>
<address>Apache/2.2.3 (Red Hat) Server at example.com Port 80</address>
</body></html>
Также как я могу включить это с моим вызовом zabbix api (JAVA)?
Ответы
Ответ 1
Это работает с обычной аутентификацией пароля, вам нужно адаптировать его к openid, который я не использую, и, безусловно, вам придется изменить параметры, чтобы это работало с curl.
1. wget --save-cookies=z.coo -4 --keep-session-cookies -O - -S --post-data='name=(a zabbix username)&password=(password)&enter=Enter' 'http://example.com/zabbix/index.php?login=1'
2. wget -4 --load-cookies=z.coo -O result.png 'http://example.com/zabbix/chart2.php?graphid=410&width=1778&period=102105&stime=20121129005934'
первая отправляет аутентификацию и сохраняет cookie. второй загружает тот же файл cookie и извлекает png.
Вы обязательно должны реализовать его без использования оболочки, но на языке ваших предпочтений и в zabbix JSON-RPC API, из которых уже существует множество клиентских библиотек.
Хотя AFAIK вам все равно придется входить в систему, чтобы получить графическое изображение. По крайней мере, на данный момент.
РЕДАКТИРОВАТЬ: https://support.zabbix.com/browse/ZBXNEXT-562 является тот, кто проголосует (или начинает работать над ним)
Ответ 2
Добавление к вышесказанному, если вы используете Zabbix 2.0, данные cURL POST немного изменились.
Замените следующее:
1. wget --save-cookies=z.coo -4 --keep-session-cookies -O - -S --post-data='name=(a zabbix username)&password=(password)&enter=Enter' 'http://example.com/zabbix/index.php?login=1'
Со следующим:
1. wget --save-cookies=z.coo -4 --keep-session-cookies -O - -S --post-data='name=(a zabbix username)&password=(password)&enter=Sign in&autologin=1&request=' 'http://example.com/zabbix/index.php?login=1'
Ответ 3
Zabbix позволяет извлекать требуемые данные с помощью одной команды wget, которая вызывает перенаправление HTTP после входа в систему.
wget --post-data='name=(username)&password=(password)&enter=Enter&request=http%3A%2F%2Fexample.com%2Fzabbix%2Fchart2.php%3Fgraphid%3D410%26width%3D1778%26period%3D102105%26stime%3D20121129005934' -O (image file) 'http://example.com/index.php?login=1'
Не забудьте ввести url-значение параметра request
.
Если вы хотите иметь последний период, установите stime
в какое-то далекое будущее. "20200101000000" хорошо работает для меня.
Протестировано с помощью Zabbix 1.8.11.
Ответ 4
В некоторых случаях вы не можете или не хотите использовать wget
. Оказывается, вам не нужен взлом входа, чтобы читать файлы cookie и устанавливать их при загрузке изображения. Вам нужен только идентификатор сеанса Zabbix (также называемый auth string), который вы получаете при входе в систему с помощью API. Теперь вы можете просто использовать его для установки одного файла cookie с именем zbx_sessionid
и вызвать URL-адрес, предоставляющий вам изображение.
В Java:
private byte[] getPng(ZabbixUser user, URL pngUrl) throws IOException
{
HttpURLConnection conn = (HttpURLConnection) pngUrl.openConnection();
conn.setRequestProperty("Cookie", "zbx_sessionid=" + user.getSessionid());
try (InputStream is = conn.getInputStream()) {
return toByteArray(is);
}
}
private static byte[] toByteArray(InputStream is) throws IOException
{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] byteChunk = new byte[4096];
int n;
while ((n = is.read(byteChunk)) > 0) {
baos.write(byteChunk, 0, n);
}
return baos.toByteArray();
}
ZabbixUser
- это немного модель, которую я создал для хранения результата входа, который вы получаете при входе в систему "userData": true
. Результирующий объект будет содержать sessionid
.