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&amp;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.