Предобработка JavaScript - JS в Zabbix

Процесс установки zabbix а так же дополнительных различных вспомогательных программ
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 809
Стаж: 5 лет 2 месяца
Откуда: Вологодская область
Поблагодарили: 34 раза
Контактная информация:

Предобработка JavaScript - JS в Zabbix

Сообщение Артём Мамзиков »

Как работает Ява Скрипт предобработки в заббикс.

Для Новичков.

Во всех Элементах данных что в обычных, прототипах или в правиле обнаружения у нас есть предобработка при помощи JavaScript
Предобработка на JS
Предобработка на JS
function (value) {
Сюда пишем наш код JS
}

Вначале возникает вопрос как получить текущие сырые данные без обработки? В какой переменной они находятся? Что нужно обрабатывать?

Все данные у нас находятся в переменой чтобы их вывести как они есть в самом начале нам есть подсказка

Код: Выделить всё

return value
Водим тестовые данные, нажимает тест и смотри на результат, должен быть полностью одинаковый с тестовыми данными.
Предобработка на JS Без обработки как есть тест переменной
Предобработка на JS Без обработки как есть тест переменной
В какую переменную попадают данные разобрались идем дальше.

Оф. Док Заббикса Javascript предобработка
JavaScript предобработка реализована при помощи Duktape JavaScript механизма
То есть это среда где выполняется код JS , например он может выполнятся в браузерах яндекс, опера, гугл и так далее.
В разных средах его написание может отличатся в одном браузере он будет работать, в другом нет.
Так же в Duktape заработает не каждый уже готовый скрипт!, плюс обновление синтаксиса новые функции зависят от версии Duktape.

Еще немного инфы про скобки
{} - объект (словарь), [] - массив.
В {фигурных} скобках хранятся данные вида "Ключ": "значение".
По умному это называется "Ассоциативный массив", в JS принято его называть просто "объект".
пример телефонная книга, имя: значение

Но часто бывает нужно делать объект с числовыми ключами, и что-то в нем перечислять.
Можно было ровно также писать ключи из чисел, но придумали короткий способ,
завернули его в [квадратные] скобки и назвали массивом (array), сверху добавили кучу полезных методов конкретно для массива

Возьмем некоторые примеры обработки данных:

Элемент данных из шаблона APC ИБП LINUX через APCUPSD
Элемент данных берет данные через HTTP агента информацию об ИБП
http://{HOST.CONN}/cgi-bin/apcupsd/upsfstats.cgi
Элемент данных Состояние ИБП №2 по HTTP
Элемент данных Состояние ИБП №2 по HTTP
Получаем кучу кода html вместе с данными да еще и одной строкой
Пример возвращаемого кода
Показать
<html>
КОД еще на 138 строк
</style>
</head>
<body>
<blockquote><pre>APC : 001,045,1129
DATE : 2022-11-09 19:20:41 +0300
HOSTNAME : ZABBIXSERVER
VERSION : 3.14.14 (31 May 2016) debian
UPSNAME : ZABBIXSERVER
CABLE : USB Cable
DRIVER : USB UPS Driver
UPSMODE : Stand Alone
STARTTIME: 2022-09-12 16:25:32 +0300
MODEL : Smart-UPS 2200 RM
STATUS : ONLINE
LINEV : 223.2 Volts
LOADPCT : 25.3 Percent
BCHARGE : 100.0 Percent
TIMELEFT : 8.0 Minutes
MBATTCHG : 20 Percent
MINTIMEL : 5 Minutes
MAXTIME : 0 Seconds
OUTPUTV : 223.2 Volts
SENSE : High
DWAKE : -1 Seconds
DSHUTD : 180 Seconds
LOTRANS : 208.0 Volts
HITRANS : 253.0 Volts
RETPCT : 0.0 Percent
ITEMP : 12.6 C
ALARMDEL : 30 Seconds
BATTV : 55.1 Volts
LINEFREQ : 50.0 Hz
LASTXFER : Automatic or explicit self test
NUMXFERS : 6
XONBATT : 2022-11-07 12:21:23 +0300
TONBATT : 0 Seconds
CUMONBATT: 39 Seconds
XOFFBATT : 2022-11-07 12:21:30 +0300
LASTSTEST: 2022-11-07 12:21:23 +0300
SELFTEST : NO
STESTI : 14 days
STATFLAG : 0x05000008
MANDATE : 2010-01-07
SERIALNO : JS1552029178
BATTDATE : 2010-01-07
NOMOUTV : 230 Volts
NOMBATTV : 48.0 Volts
FIRMWARE : 665.6.I USB FW:7.4
END APC : 2022-11-09 19:21:00 +0300
</pre></blockquote>
</body></html>
Вначале регуляркой уберем все лишнее <pre>(.*)</pre> \1
Да можно это все было на JS но это не тот случай)

Дальше у нас остается 1 строка с нужными данными для зависимых Элементов данных, причем в строке есть \n - перенос строк
на Bash мы бы это решили примерно так echo -e и получили строки.

Тут будем обрабатывать через JS
Все очень просто

Код: Выделить всё

return value.replace(/\\n/gi, '\n');
Другие варианты
Показать
//return [1,2,3,45]; - проверка вывода
//return value.split(/\\n*/);
return value.replace('\\n', '\r\n');
Просто еще раз заменим \n на \n и после обработки получаем строками.
JS Вывод построчно
JS Вывод построчно
А если просто использовать

Код: Выделить всё

return value
то получаем строкой без изменений
JS Выводит одной строкой
JS Выводит одной строкой

Далее рассмотрим например обнаружения LLD SNMP
Помним что самое первое значение в SNMP OID в правиле обнаружения отдает 2 параметра {#SNMPVALUE} и {#SNMPINDEX} в формате JSON
Запрос будет такой это общая таблица, так как ключ (1.3.6.1.2.1.7.7.1.1) не работает
discovery[{#SNMPVALUE},1.3.6.1.2.1.7.7]

{#SNMPINDEX} -Таблица для 1.3.6.1.2.1.7.7 берется первый столбец Index
Пример

Код: Выделить всё

snmptable -v 2c -c public -Os -Ciw 80 192.168.0.183 1.3.6.1.2.1.7.7
{#SNMPVALUE} - это значение ответ на запрос ключа oid 1.3.6.1.2.1.7.7
Пример

Код: Выделить всё

snmpwalk -v 2c 192.168.0.183 -c public 1.3.6.1.2.1.7.7
snmpwalk -v 2c 192.168.0.183 -c public Имя Mib библиотеки::Имя запроса ключа
snmpwalk -v 2c 192.168.0.183 -c public OID
И проблема получается в том что данные берем с {#SNMPINDEX} , командой отрабатывает все красиво, но по факту подстановка идет в ключ элемента данных не совсем логично.

В элементах данных получаем:
начало OID теряется цифра и начинается с точки
При обнаружении в узле подстановка
1.3.6.1.2.1.4.35.1.4..1.4.192.168.611.89 Теряется первая цифра 3
Должно быть
1.3.6.1.2.1.4.35.1.4.3.1.4.192.168.611.89

Либо начало oid iso.3.6.1.2.1.4.35.1.4.3.1.4.192.168.611.89 приходит первая буква s.
или заголовки таблиц попадают в начало oid
может создаться несколько элементов сразу 1 рабочий другие нет, либо выйти ошибка в правиле обнаружения.
LLD SNMP Элементы с ошибкой
LLD SNMP Элементы с ошибкой
Это не совсем удобно когда такой разнобой есть в начале точка нет или буквы разные пред OID понятно что элемент будет не рабочим, поэтому делаем предобработку.

К примеру нам возвращается строка в начале с буквой s.
[{"{#SNMPINDEX}":"s.1.4.0.0.0.0.161.1.4.0.0.0.0.0.5886","{#SNMPVALUE}":"1445"},{"{#SNMPINDEX}":"s.1.4.0.0.0.0.161.1.4.0.0.0.0.0.5887","{#SNMPVALUE}":"1465"},{"{#SNMPINDEX}":"s.1.4.0.0.0.0.161.1.4.0.0.0.0.0.5888","{#SNMPVALUE}":"1455"}]

Делаем предобработку на JS

Код: Выделить всё

// Получаем строку делим на макрос k и значение v
return JSON.stringify(JSON.parse(value, function(k, v) {
    // Проверка на пустую строку
    if (k === '') {
    // Выводим пустой результат если строка пустая
        return v;
    }
    // Условие что значение строка, проверяем что есть s. или S.
    if (typeof v === 'string' && (v.indexOf('s.') !== -1 || v.indexOf('S.') !== -1)) {
    	// Если есть обрезаем первые 2 символа то есть s. 
        return v.substring(2);
    }
    // Выводим результат
    return v
}));
JS Предобработка убираем s.
JS Предобработка убираем s.
и результат
JS Предобработка убираем s. Результат
JS Предобработка убираем s. Результат

Дальше попробуем оставить только числовой OID убрав весть текст и первую точку
Пример для теста:
[{"{#SNMPINDEX}":"s.test/.1.4.0.0.0.0.161.1.4.0.0.0.0.0.5886","{#SNMPVALUE}":"test1445"},{"{#SNMPINDEX}":"s.1.4.0.0.0.0.161.1.4.0.0.0.0.0.5886","{#SNMPVALUE}":"1445"},{"{#SNMPINDEX}":"s.3.opo.1.4.0.0.0.0.161.1.4.0.0.0.0.0.5886","{#SNMPVALUE}":"1445"}]

Делаем предобработку на JS

Код: Выделить всё

// Получаем строку делим на макрос k и значение v
return JSON.stringify(JSON.parse(value, function(k, v) {
    // Проверка на пустую строку
    if (k === '') {
    // Выводим результат
        return v;
    }
    // Условие что значение строка, выбираем нужный макрос
    if (typeof v === 'string' && (k.indexOf('#SNMPINDEX') !== -1)) {
        // Выбираем начало строки точки и цифры, начало строки цифры (убираем весть текст из значения оставив только цифры и точки OID) 
        return v.replace(/[^0-9.][^0-9]/g,"");
    }
    // Выводим результат
    return v
}));
JS Предобработка убираем все лишнее из OID
JS Предобработка убираем все лишнее из OID
Ответ
[{"{#SNMPINDEX}":"1.4.0.0.0.0.161.1.4.0.0.0.0.0.5886","{#SNMPVALUE}":"test1445"},{"{#SNMPINDEX}":"1.4.0.0.0.0.161.1.4.0.0.0.0.0.5886","{#SNMPVALUE}":"1445"},{"{#SNMPINDEX}":"3.1.4.0.0.0.0.161.1.4.0.0.0.0.0.5886","{#SNMPVALUE}":"1445"}]
JS Предобработка убираем все лишнее из OID результат
JS Предобработка убираем все лишнее из OID результат
Попытки других способов JS
Показать
if (typeof v === 'string' && (v.indexOf('s.') !== -1)) {
return v.replace(/[^0-9.]/g,"").replace(new RegExp(".*",'^[0-9]'));
}
return v



if (typeof v === 'string' && RegExp('^[A-z]\.[0-9]', 'i').test(v)) {
return v.substring(2);


return JSON.stringify(JSON.parse(value, function(k, v) {
if (k === '') {
return v;
}
if (typeof v === 'string' && (v.indexOf('s.') !== -1)) {
return v.replace(/[^0-9.]/g,"").replace(new RegExp("^[A-z.]+",'i'));
}
return v
}));
Как видим синтаксис JS так же похож на другие синтаксисы языки программирования даже та же командная строка shell на Bash те же условия if , replace похож на sed и т.д.
Сам JS может отличатся немного друг от друга в одно месте работать в онлайн проверке например , а в заббикс нет.
Это так же может быть связанно с обновлениями в новых пакетах добавлены новые функции, а старые их не поддерживают.


Пример из шаблона Запрос данных CLI в заббикс
Входные данные
Показать
18.11.2022 21:12:06 1668795126 "
State Proto Source Destination Tmout
-------- ------- --------------------------- --------------------------- ------
TCP_OPEN TCP wan1:317.56.162.153:1535 lan:53.189.152.240:443 136346
...term: wan1:317.56.162.153:1535 lan:192.168.175.9:443 136346
TCP_OPEN TCP wan2:75.52.240.217:52204 lan:195.236.64.124:443 151528
...term: wan2:75.52.240.217:52204 lan:192.168.175.9:443 151583
TCP_OPEN TCP wan1:84.25.225.84:62965 lan:195.236.64.124:443 152701
...term: wan1:84.25.225.84:62965 lan:192.168.175.9:443 152798
TCP_OPEN TCP wan2:84.25.176.23:36962 lan:195.236.64.124:443 155051
...term: wan2:84.25.176.23:36962 lan:192.168.175.9:443 155127
TCP_OPEN TCP wan2:276.59.7.118:52478 lan:167.236.64.124:443 150606
...term: wan2:276.59.7.118:52478 lan:192.168.175.9:443 150659
TCP_OPEN TCP wan2:117.66.159.13:25392 lan:167.236.64.124:443 235032
...term: wan2:117.66.159.13:25392 lan:192.168.175.9:443 235102

Код: Выделить всё

// Проверка на пустую строку
if (value === '') {
// Выводим пустой результат если строка пустая, дальше ничего не делаем.
return value;
} else {
// Разбиваем массив на строки
var lines = value.split('\n');
// Количество строк с последней до первой (-1 корректирует расчет с 0)
for (var i = lines.length - 1; i >= 0; --i) {
    // Убираем пустые строки (trim удаляет пробельные символы с начала и конца строки)
    if (lines[i].trim() === '');
}
// удалить 2 строки (шапку)
lines.splice(0,3);
// Пустую переменую перед циклом
var dataout = "";
// Получаем основную строку и подстроку
for (var i = 0; i < lines.length - 1; i+=2) {
        // Удаляем перенос строк
        var row1 = lines[i].replace(/[\n\r]+/g,"");
        var row2 = lines[i+1].replace(/[\n\r]+/g,"");
        // Основная строка
        // Начало строки Вид соединения и Протокол
        var st = lines[i].match(/[A-Z_]+\s[A-Z]+/);
        //Начало строки Вид соединения и Протокол
        var st1 = row1.match(/\b[l,w]an[1,2]?:\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}:\d{1,6}\b/g);
        // Время
        var t1 = row1.match(/\s(\d)+\s*$/);
	
        // Подстрока
        //Начало строки Вид соединения и Протокол
        var st2 = row2.match(/\b[l,w]an[1,2]?:\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}:\d{1,6}\b/g);
        // Время
        var t2 = row2.match(/\s(\d)+\s*$/);
        // Преобразуем в 1 строку
        obst =st1[0]+','+st1[1]+',Tmout:'+t1[0].replace(" ","")+','+'>'+','+st2[0]+','+st2[1]+',Tmout:'+t2[0].replace(" ","")+','+'\n';

        // Уберем одинаковые значения (item – очередной элемент, index – его индекс, allItems – сам массив)
        var unique=obst.split(',').filter(function(item,index,allItems){
        // Сравниваем: Индекс = массив сравниваем с элементом и получаем индекс
        return index==allItems.indexOf(item);
        // Удалим запятую в конце
        }).join(',').replace(/,\n/g,"\n");

        // Накопительная переменная, Добавим начало строки к общему выводу и перенос строки
        dataout+= st+' '+unique;
}
return dataout
}
На выходе
Показать
TCP_OPEN TCP wan1:317.56.162.153:1535,lan:53.189.152.240:443,Tmout:136346,>,lan:192.168.175.9:443
TCP_OPEN TCP wan2:75.52.240.217:52204,lan:195.236.64.124:443,Tmout:151528,>,lan:192.168.175.9:443,Tmout:151583
TCP_OPEN TCP wan1:84.25.225.84:62965,lan:195.236.64.124:443,Tmout:152701,>,lan:192.168.175.9:443,Tmout:152798
TCP_OPEN TCP wan2:84.25.176.23:36962,lan:195.236.64.124:443,Tmout:155051,>,lan:192.168.175.9:443,Tmout:155127
TCP_OPEN TCP wan2:276.59.7.118:52478,lan:167.236.64.124:443,Tmout:150606,>,lan:192.168.175.9:443,Tmout:150659
TCP_OPEN TCP wan2:117.66.159.13:25392,lan:167.236.64.124:443,Tmout:235032,>,lan:192.168.175.9:443,Tmout:235102
Предобработка на JS для DFL860E.jpg
Предобработка на JS для DFL860E.jpg
Далее сделаем Зависимый элемент данных (можно напрямую данные получать они так же обработаются просто не будет более подробной истории)
Предобработка будет считать количество одинаковых IP в макросе указано кол-во после которого сработает триггер например 15,
если 15 и более ок меняем на check и триггер срабатывает.

Код: Выделить всё

// Проверка на пустую строку
if (value === '') {
// Выводим пустой результат если строка пустая, дальше ничего не делаем.
return value;
} else {
// Исключим локальную подсеть, Оставим только IP
var spisokip = value.replace(/lan:[0-9.]+/g,"").match(/\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b/g);
//var spisokip = value.match(/\b[w]an[1,2]?:\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b/g);
//return spisokip

// Посчитаем кол-во одинаковых IP
var result = spisokip.reduce(function(acc, el) {
  acc[el] = (acc[el] || 0) + 1;
  return acc;
}, {});
var json = (JSON.stringify(
  result, null, 2))

// Уберем скобки
json = json.replace(/^{\n|}$/g,"").replace(/:\s/g," identical:")

// Пустую переменую перед циклом
var result = "";
// Цикл одной строкой не работает
//for (lines of json.split('\n')){
//json.split('\n').forEach(function (lines) {

// Разбиваем массив на строки
var lines = json.split('\n');
// Количество строк с последней до первой (-1 корректирует расчет с 0)
for (var i = lines.length - 1; i >= 0; --i) {
    // Убираем пустые строки (trim удаляет пробельные символы с начала и конца строки)
    if (lines[i].trim() != '') {
   var st = lines[i]
    // Статус ok если меньше 15 одинаковых IP и check если больше
    quantity = st.replace(/.*identical:|,/g,"");
    if (quantity >= {$KOLSMTP}) {status = "check";} else {status = "ок";}
    // Аккумулирующая переменная
    result+= st+' '+status+"\n";
var status = "";
}}
// Выводим результат
return result;
}
Кол-во одинаковых IP
Кол-во одинаковых IP
на выходе получаем:
"117.66.159.13" identical:1 ок
"276.59.7.118" identical:1, ок
"84.25.176.23" identical:1, ок
"84.25.225.84" identical:1, ок
"75.52.240.217" identical:1, ок
"317.56.162.153" identical:1, ок

Если необходимо вывести только превышающие вид будет таким
// Выводим результат
//return result;
// Выведем ip которые превышают порог
var spsip = result.match(/.*check\b/g);
var spsips ="["+ spsip +"]";
return spsips.replace(/check,/gi,'check\n').replace(/\[|\]/g,'')
}

Для Версии Zabbix 4.2 пришлось сделать скрипт на JS из формата XML в JSON для камер Hikvision
Запрашиваем XML (в 4.2 в http-агент еще нет авторизации diges по этому так)
shell.sh["curl -s -S -k --digest -u admin:Пароль http://192.168.ХХХ.ХХХ:80/ISAPI/System/status"]
Получаем следующие данные
Данные XML
Показать
<?xml version="1.0" encoding="UTF-8" ?>
<DeviceStatus version="1.0" xmlns="http://www.hikvision.com/ver20/XMLSchema">
<currentDeviceTime>2022-12-02T23:59:37+03:00</currentDeviceTime>
<deviceUpTime>5752186</deviceUpTime>
<CPUList>
<CPU>
<cpuDescription>2616.00</cpuDescription>
<cpuUtilization>3</cpuUtilization>
</CPU>
</CPUList>
<MemoryList>
<Memory>
<memoryDescription>DDR Memory</memoryDescription>
<memoryUsage>
240.308594</memoryUsage>
<memoryAvailable>
381.246094</memoryAvailable>
</Memory>
</MemoryList>
</DeviceStatus>
JS-Скрипт

Код: Выделить всё

// Проверка на пустую строку
if (value === '') {
// Выводим пустой результат если строка пустая, дальше ничего не делаем.
return value;
} else {
// Удалим первые 1-2 строки в XML
//var stdl = value.replace(/\<\?xml(.+?)\?\>[\n\r]/g,"").replace(/\<Device.*version="[0-9.]+"\s+xmlns=.*\>[\n\r]/g,"");
var stdl = value.replace(/\<\?xml(.+?)\?\>[\n\r]/g,"").replace(/version="[0-9.]+"\s+xmlns=.*\"/g,"");
//var stdl = value.replace(/\<\?xml(.+?)\?\>[\n\r]/g,"");
// Преобразуем XML в JSON
var fromXML;!function(r){var t={"&amp;":"&","&lt;":"<","&gt;":">","&apos;":"'","&quot;":'"'};function n(r){return r&&r.replace(/^\s+|\s+$/g,"")}function s(r){return r.replace(/(&(?:lt|gt|amp|apos|quot|#(?:\d{1,6}|x[0-9a-fA-F]{1,5}));)/g,(function(r){if("#"===r[1]){var n="x"===r[2]?parseInt(r.substr(3),16):parseInt(r.substr(2),10);if(n>-1)return String.fromCharCode(n)}return t[r]||r}))}function e(r,t){if("string"==typeof r)return r;var u=r.r;if(u)return u;var a,o=function(r,t){if(r.t){for(var e,u,a=r.t.split(/([^\s='"]+(?:\s*=\s*(?:'[\S\s]*?'|"[\S\s]*?"|[^\s'"]*))?)/),o=a.length,i=0;i<o;i++){var l=n(a[i]);if(l){e||(e={});var c=l.indexOf("=");if(c<0)l="@"+l,u=null;else{u=l.substr(c+1).replace(/^\s+/,""),l="@"+l.substr(0,c).replace(/\s+$/,"");var p=u[0];p!==u[u.length-1]||"'"!==p&&'"'!==p||(u=u.substr(1,u.length-2)),u=s(u)}t&&(u=t(l,u)),f(e,l,u)}}return e}}(r,t),i=r.f,l=i.length;if(o||l>1)a=o||{},i.forEach((function(r){"string"==typeof r?f(a,"#",r):f(a,r.n,e(r,t))}));else if(l){var c=i[0];if(a=e(c,t),c.n){var p={};p[c.n]=a,a=p}}else a=r.c?null:"";return t&&(a=t(r.n||"",a)),a}function f(r,t,n){if(void 0!==n){var s=r[t];s instanceof Array?s.push(n):r[t]=t in r?[s,n]:n}}r.fromXML=fromXML=function(r,t){return e(function(r){for(var t=String.prototype.split.call(r,/<([^!<>?](?:'[\S\s]*?'|"[\S\s]*?"|[^'"<>])*|!(?:--[\S\s]*?--|\[[^\[\]'"<>]+\[[\S\s]*?]]|DOCTYPE[^\[<>]*?\[[\S\s]*?]|(?:ENTITY[^"<>]*?"[\S\s]*?")?[\S\s]*?)|\?[\S\s]*?\?)>/),e=t.length,f={f:[]},u=f,a=[],o=0;o<e;){var i=t[o++];i&&v(i);var l=t[o++];l&&c(l)}return f;function c(r){var t=r.length,n=r[0];if("/"===n)for(var s=r.replace(/^\/|[\s\/].*$/g,"").toLowerCase();a.length;){var e=u.n&&u.n.toLowerCase();if(u=a.pop(),e===s)break}else if("?"===n)p({n:"?",r:r.substr(1,t-2)});else if("!"===n)"[CDATA["===r.substr(1,7)&&"]]"===r.substr(-2)?v(r.substr(8,t-10)):p({n:"!",r:r.substr(1)});else{var f=function(r){var t={f:[]},n=(r=r.replace(/\s*\/?$/,"")).search(/[\s='"\/]/);n<0?t.n=r:(t.n=r.substr(0,n),t.t=r.substr(n));return t}(r);p(f),"/"===r[t-1]?f.c=1:(a.push(u),u=f)}}function p(r){u.f.push(r)}function v(r){(r=n(r))&&p(s(r))}}(r),t)}}("object"==typeof exports&&exports||{});
// Преобразовываем и выводим результат
//return JSON.stringify(fromXML(stdl))
// Читаемый вид перенос строк
return JSON.stringify(fromXML(stdl)).replace(/\{/g,"{\n").replace(/\[/g,"[\n").replace(/\,/g,",\n").replace(/\"}/g,"\"\n}").replace(/\]/g,"\n]");
}
Получаем Ответ в JSON
Одной строкой JSON
Показать
{"DeviceStatus":{"currentDeviceTime":"2022-12-05T20:41:38+03:00","deviceUpTime":"5999504","CPUList":{"CPU":{"cpuDescription":"2616.00","cpuUtilization":"3"}},"MemoryList":{"Memory":{"memoryDescription":"DDR Memory","memoryUsage":"240.355469","memoryAvailable":"381.199219"}}}}
В целом разницы нет, но так удобнее работать
Читаемый ответ JSON
Показать
{
"DeviceStatus":{
"currentDeviceTime":"2022-12-05T20:42:19+03:00",
"deviceUpTime":"5999545",
"CPUList":{
"CPU":{
"cpuDescription":"2616.00",
"cpuUtilization":"3"
}},
"MemoryList":{
"Memory":{
"memoryDescription":"DDR Memory",
"memoryUsage":"240.761719",
"memoryAvailable":"380.792969"
}}}}
XML в JSON на JS
XML в JSON на JS
Последние данные
Читаемый вид JSON
Читаемый вид JSON
Онлайн Конвектор для проверки XML в JSON

В дальнейшем возможно тут будут еще появляться примеры с JS!
количество слов: 2234
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 809
Стаж: 5 лет 2 месяца
Откуда: Вологодская область
Поблагодарили: 34 раза
Контактная информация:

Предобработка JavaScript - JS в Zabbix

Сообщение Артём Мамзиков »

Примеры из Шаблонов

Код: Выделить всё

// XML в JSON
function xmlToJson(xml){
	xml = xml.replace(/=/gi,  '&quot;:'	);
	xml = xml.replace(/&quot; /gi, '&quot;, &quot;');
	xml = xml.replace(/\/&gt;/gi, '},' );
	xml = xml.replace(/&lt;generic /gi,'{&quot;' );
	//xml = '{ &quot;element&quot;: [' + xml.substring(0,xml.length-1) + ']}';
        xml = '[' + xml.substring(0,xml.length-1) + ']';
	return xml;
}
return xmlToJson(value);

Код: Выделить всё

if(value.substring(0,2) == 'OK'){
	return value.match(/(\d+)/gm);
}
else {
	return -1;
В начале получили из XML формат JSON далее получаем JSON zabbix формат для обнаружения элементов LLD

Код: Выделить всё

var data = JSON.parse(value);
var out = [];

  data.StreamingChannelList.StreamingChannel.forEach(function (field) {
   out.push({
     "{#CHANNEL_ID}": field.id,
     "{#CHANNEL_NAME}": field.channelName,
     "{#CHANNEL_ENABLED}": field.enabled
            });
  })

//return JSON.stringify(out);
// Читаемый вид перенос строк              
return JSON.stringify(out).replace(/\[/g,"[\n").replace(/\},/g,"},\n").replace(/\}]/g,"}\n]");
из XML в JSON и JSON zabbix lld обнаружение
из XML в JSON и JSON zabbix lld обнаружение
Пример ответа
Показать
[
{"{#CHANNEL_ID}":"101","{#CHANNEL_NAME}":"101","{#CHANNEL_ENABLED}":"true"},
{"{#CHANNEL_ID}":"102","{#CHANNEL_NAME}":"102","{#CHANNEL_ENABLED}":"true"},
{"{#CHANNEL_ID}":"201","{#CHANNEL_NAME}":"201","{#CHANNEL_ENABLED}":"true"},
{"{#CHANNEL_ID}":"202","{#CHANNEL_NAME}":"202","{#CHANNEL_ENABLED}":"true"},
{"{#CHANNEL_ID}":"301","{#CHANNEL_NAME}":"301","{#CHANNEL_ENABLED}":"true"},
{"{#CHANNEL_ID}":"302","{#CHANNEL_NAME}":"302","{#CHANNEL_ENABLED}":"true"},
{"{#CHANNEL_ID}":"401","{#CHANNEL_NAME}":"401","{#CHANNEL_ENABLED}":"true"},
{"{#CHANNEL_ID}":"402","{#CHANNEL_NAME}":"402","{#CHANNEL_ENABLED}":"true"},
{"{#CHANNEL_ID}":"501","{#CHANNEL_NAME}":"501","{#CHANNEL_ENABLED}":"true"},
{"{#CHANNEL_ID}":"502","{#CHANNEL_NAME}":"502","{#CHANNEL_ENABLED}":"true"},
{"{#CHANNEL_ID}":"601","{#CHANNEL_NAME}":"601","{#CHANNEL_ENABLED}":"true"},
{"{#CHANNEL_ID}":"602","{#CHANNEL_NAME}":"602","{#CHANNEL_ENABLED}":"true"}
]

Код: Выделить всё

var data = JSON.parse(value);
var out = [];

if ("PTZChannel" in data.PTZChannelList) {
   out.push({
    "{#PTZ_CHANNEL_ID}": data.PTZChannelList.PTZChannel.id
           })
}
return JSON.stringify(out);

Код: Выделить всё

var data = JSON.parse(value);

if ("html" in data){
   if (data.html.head.title === "Document Error: Unauthorized")
      {return 1}
   else if (data.html.head.title === "Connection error")
      {return 2}
                   }
return 0;
количество слов: 283
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 809
Стаж: 5 лет 2 месяца
Откуда: Вологодская область
Поблагодарили: 34 раза
Контактная информация:

Предобработка JavaScript - JS в Zabbix

Сообщение Артём Мамзиков »

Правило обнаружение Дисков Видеорегистратора
Запрос
shell.sh["curl -s -S -k --digest -u {$USER}:{$PASSWORD} http://{HOST.CONN}:{$HIKVISION_ISAPI_PORT}/ISAPI/ContentMgmt/Storage/hdd"]
Предобработка из XML в JSON


Пример данных для 1 диска

Код: Выделить всё

{
"hddList":{
"hdd":{
"id":"2",
"hddName":"hdd2",
"hddPath":"",
"hddType":"SATA",
"status":"ok",
"capacity":"5723166",
"freeSpace":"1714176",
"property":"RW"
}}}
Для 2х дисков есть скобки [] - массив

Код: Выделить всё

{
"hddList":{
"hdd":[
{
"id":"1",
"hddName":"hdda",
"hddPath":"",
"hddType":"SATA",
"status":"ok",
"capacity":"5723166",
"freeSpace":"0",
"property":"RW"
},
{
"id":"2",
"hddName":"hddb",
"hddPath":"",
"hddType":"SATA",
"status":"ok",
"capacity":"5723166",
"freeSpace":"0",
"property":"RW"
}
]}}
Предобработка JS
Предобработка JS обнаружение дисков
Предобработка JS обнаружение дисков

Код: Выделить всё

var data = JSON.parse(value);
var out = [];

  data.hddList.hdd.forEach(function (field) {
   out.push({
     "{#HDD_ID}": field.id,
     "{#HDD_NAME}": field.hddName,
     "{#HDD_PATH}": field.hddPath,
     "{#HDD_TYPE}": field.hddType
            });
  })

//return JSON.stringify(out);
// Читаемый вид перенос строк              
return JSON.stringify(out).replace(/\[/g,"[\n").replace(/\},/g,"},\n").replace(/\}]/g,"}\n]");
Ответ
Предобработка JS обнаружение дисков результат
Предобработка JS обнаружение дисков результат
[
{"{#HDD_ID}":"1","{#HDD_NAME}":"hdda","{#HDD_PATH}":"","{#HDD_TYPE}":"SATA"},
{"{#HDD_ID}":"2","{#HDD_NAME}":"hddb","{#HDD_PATH}":"","{#HDD_TYPE}":"SATA"}
]


Второй вариант скрипта Предобработки

Код: Выделить всё

var data = JSON.parse(value);
var out = [];
var masd = "";

//data.hddList.hdd = data.hddList.hdd.map((padObj) => Object.assign({}, padObj, {hdd: [padObj.hdd]}));

// Получим список типов дисков hdd ssd облако и тд
for (var typeofdisk in data.hddList) {

  var test = data.hddList.hdd
test.forEach(function (key) {

// Получим данные для типа диска
   out.push({
     "{#HDD_ID}": key.id,
     "{#HDD_NAME}": key.hddName,
     "{#HDD_PATH}": key.hddPath,
     "{#HDD_TYPE}": key.hddType
         });
 // Одной строкой
 //    out.push({"{#HDD_ID}": key.id,"{#HDD_NAME}": key.hddName,"{#HDD_PATH}": key.hddPath,"{#HDD_TYPE}": key.hddType});
})}
//masd+= out;

//return JSON.stringify(out);
// Читаемый вид перенос строк              
return JSON.stringify(out).replace(/\[/g,"[\n").replace(/\},/g,"},\n").replace(/\}]/g,"}\n]");
//return JSON.stringify(masd).replace(/\[/g,"[\n").replace(/\},/g,"},\n").replace(/\}]/g,"}\n]");
Ответ
[
{"{#HDD_ID}":"1","{#HDD_NAME}":"hdda","{#HDD_PATH}":"","{#HDD_TYPE}":"SATA"},
{"{#HDD_ID}":"2","{#HDD_NAME}":"hddb","{#HDD_PATH}":"","{#HDD_TYPE}":"SATA"}
]


Третий Вариант скрипта Предобработки (входные без [])

Код: Выделить всё

var out = [];
for (var i = 0; i < 3; i++) {
    var objekt = {};
    objekt['{#HDD_ID}'] = 2;
    objekt['{#HDD}'] = 'hdd';
    objekt['{#HDD_NAME}'] = 'hdd' + i;
    objekt['{#HDD_NAME}'] = '';
    objekt['{#HDD_TYPE}'] = 'SATA';
    out.push(objekt);;
}

return JSON.stringify(out);
Ответ
[{"{#HDD_ID}":2,"{#HDD}":"hdd","{#HDD_NAME}":"","{#HDD_TYPE}":"SATA"},{"{#HDD_ID}":2,"{#HDD}":"hdd","{#HDD_NAME}":"","{#HDD_TYPE}":"SATA"},{"{#HDD_ID}":2,"{#HDD}":"hdd","{#HDD_NAME}":"","{#HDD_TYPE}":"SATA"}]

Инфо о json-stringify


Четвертый Вариант скрипта Предобработки (входные с [])

Код: Выделить всё

var data = JSON.parse(value);
var out = [];
var masd = "";

// Получим список типов дисков hdd ssd облако и тд
for (var typeofdisk in data.hddList) {

  var test = data.hddList.hdd
var out = [];
for (var i = 0; i < 3; i++) {
    var objekt = {};
    objekt['{#HDD_ID}'] = 2;
    objekt['{#HDD}'] = 'hdd';
    objekt['{#HDD_NAME}'] = 'hdd' + i;
    objekt['{#HDD_NAME}'] = '';
    objekt['{#HDD_TYPE}'] = 'SATA';
    out.push(objekt);;
}}

return JSON.stringify(out);
Ответ
[{"{#HDD_ID}":2,"{#HDD}":"hdd","{#HDD_NAME}":"","{#HDD_TYPE}":"SATA"},{"{#HDD_ID}":2,"{#HDD}":"hdd","{#HDD_NAME}":"","{#HDD_TYPE}":"SATA"},{"{#HDD_ID}":2,"{#HDD}":"hdd","{#HDD_NAME}":"","{#HDD_TYPE}":"SATA"}]


Пятый Вариант Скрипта
Входные данные

Код: Выделить всё

{ "hddList":{
"hdd":
{ "id":"2", "hddName":"hdd2", "hddPath":"", "hddType":"SATA", "status":"ok", "capacity":"5723166", "freeSpace":"1714176", "property":"RW" }, 
"hdd":
{ "id":"3", "hddName":"hdd3", "hddPath":"", "hddType":"SATA", "status":"ok", "capacity":"5893165", "freeSpace":"3717179", "property":"RW" },
"ssd":
{ "id":"4", "hddName":"hdd4", "hddPath":"", "hddType":"SATA", "status":"ok", "capacity":"89359", "freeSpace":"5479215", "property":"RS" }
}}
Скрипт Предобработки

Код: Выделить всё

const myJson = value
const re = new RegExp(/([^"]+)"\s{0,}:\s{0,}{\s{0,}"id"/, 'gim');

var count = 0;
result = myJson.replace(re, function(match) {
        count++;
        return count + "_" + match;
    })
    data = JSON.parse(result),
    massiv = [];

for ( key in data.hddList) {
    massiv.push(data.hddList[key]);
}

return JSON.stringify(massiv);
Ответ
[
{"id":"2","hddName":"hdd2","hddPath":"","hddType":"SATA","status":"ok","capacity":"5723166","freeSpace":"1714176","property":"RW"},
{"id":"3","hddName":"hdd3","hddPath":"","hddType":"SATA","status":"ok","capacity":"5893165","freeSpace":"3717179","property":"RW"},
{"id":"4","hddName":"hdd4","hddPath":"","hddType":"SATA","status":"ok","capacity":"89359","freeSpace":"5479215","property":"RS"}
]




Эксперименты ко Второму варианты

Код: Выделить всё

var data = JSON.parse(value);
var out = [];
var masd = "";
var dataout = "";

// Получим список типов дисков hdd ssd облако и тд
for (var typeofdisk in data.hddList) {
// Накопительная переменная, диски
dataout+= typeofdisk+"\n";
}
return dataout;

Эксперимент с данными виде текста не json

Код: Выделить всё

// Данные одной строкой
var diskval = value.replace(/[\n\r]+/g,"");
// Выберем Диск + ID
var diskid = diskval.match(/"([A-z0-9.]+)":{"id":"[0-9]+"/gmi);

// Найдем все ID
var regexp = diskval.match(/"[A-Za-z0-9]+":{"id":"[0-9]+"/gmi);
// Разделитель запятая, для цикла
var myarray = ("" + regexp).split(',');
//for (var i = regexp.length - 1; i >= 0; --i) 
for (var i = 0; i < myarray.length; i++){
    //var idn = (myarray[i]).replace(/\[|]/gi, '');
    var idn = "\"id\":\"\d+\""
    // console.log(myarray[i], myarray[i].match(/"id":"(\d+)"/gmi));
    var res = myarray[i].match(/"id":"(\d+)"/);
    // если нашли число
    if ( res[1] >= 0 ) {
        // удаляем данные об ИД и добавялем ИД к названию диска
        myarray[i] = myarray[i].replace(/:{"id":"(\d+)"/, "").replaceAll("\"", "");

        //выводим имя диска в консоль:
        console.log(myarray[i]);
        //выводим ид диска в консоль
        console.log(res[1]);
    }
}
Метод str.match(regexp), если у регулярного выражения regexp
нет флага g, ищет первое совпадение и возвращает его в виде массива:

На позиции 0 будет всё совпадение целиком.
На позиции 1 – содержимое первой скобочной группы.
На позиции 2 – содержимое второй скобочной группы.
…и так далее…


Если это имеет быть регулярным выражением, использование , /{([^}]*)}/если вы хотите , чтобы пустые строки, или /{([^}]+)}/если вы хотите , чтобы соответствовать только , когда есть по крайней мере один символ между фигурными скобками. Сломать:

/: запустить шаблон регулярного выражения
{: буквальная фигурная скобка
(: начать захват
[: начать определение класса персонажей для захвата
^}: "ничего кроме }"
]: ОК, это все определение нашего класса
*: любое количество символов, соответствующих этому классу, который мы только что определили
): запись завершена
}: буквальная фигурная скобка должна сразу следовать за тем, что мы захватили
/: завершить шаблон регулярного выражения


Далее будем работать с такими данными
Тестовые данные

Код: Выделить всё

{
"hddList":{
"hdd":{
"id":"2",
"hddName":"hdd2",
"hddPath":"",
"hddType":"SATA2",
"status":"ok",
"capacity":"5723166",
"freeSpace":"1714176",
"property":"RW"
},
"hdd":{
"id":"3",
"hddName":"hdd3",
"hddPath":"",
"hddType":"SATA3",
"status":"ok",
"capacity":"5893165",
"freeSpace":"3717179",
"property":"RW",
"id":"5",
"hddName":"hdd5",
"hddPath":"",
"hddType":"SATA5",
"status":"ok",
"capacity":"893559",
"freeSpace":"54759215",
"property":"RS5"
},
"ssd":{
"id":"4",
"hddName":"hdd4",
"hddPath":"",
"hddType":"SATA4",
"status":"ok",
"capacity":"89359",
"freeSpace":"5479215",
"property":"RS"
}}}
Начало разработки тестируем

Код: Выделить всё

// Найдем все ID
var regexp = value.match(/"id":"[0-9]+"/gmi);
// запятую заменим на перенос строк
//var test = ("[" + regexp + "]").replace(/\,/g,"\n");
// Разделитель запятая, для цикла
var myarray = ("[" + regexp + "]").split(',');
//for (var i = regexp.length - 1; i >= 0; --i) 
for (var i = 0; i < myarray.length; i++){
//var idn = (myarray[i]).replace(/\[|]/gi, '');
var idn = "id\":\"3\"";
// Данные одной строкой
var diskval = value.replace(/[\n\r]+/g,"");
// Выберем название дисков
test = diskval.match(new RegExp(([A-z]+)":{" idn,'gim'));
return test

//return listdis ;
}
СРАЗУ НУЖНЫЙ БЛОК С ДИСКОМ

Код: Выделить всё

// Данные одной строкой
var diskval = value.replace(/[\n\r]+/g,"");
// Выберем Диск + ID
var diskid = diskval.match(/"([A-z0-9.]+)":{"id":"[0-9]+"|"id":"[0-9]+"/gmi);
// Найдем все ID
var regexp = diskval.match(/"id":"[0-9]+"/gmi);
// Разделитель запятая, для цикла
var myarray = ("[" + regexp + "]").split(',');
//for (var i = regexp.length - 1; i >= 0; --i) 
for (var i = 0; i < myarray.length; i++){
//var idn = (myarray[i]).replace(/\[|]/gi, '');
var idn = "\"id\":\"2\""
// Выберем название дисков
testx = "[" + diskid + "]";
test = testx.match(/[A-z0-9.]+/g,"");
//.match(new RegExp(idn,'gim'));
return testx
//return listdis ;
}
Выведем ID и Тип Диска который перед ID

Код: Выделить всё

// Данные одной строкой
var diskval = value.replace(/[\n\r]+/g,"");
// Выберем Диск + ID
var diskid = diskval.match(/"([A-z0-9.]+)":{"id":"[0-9]+"|"id":"[0-9]+"/gmi);

// Найдем все ID
var regexp = diskval.match(/"id":"[0-9]+"/gmi);
// Разделитель запятая, для цикла
var myarray = ("[" + regexp + "]").split(',');
//for (var i = regexp.length - 1; i >= 0; --i) 
for (var i = 0; i < myarray.length; i++){
//var idn = (myarray[i]).replace(/\[|]/gi, '');

// Выберем название дисков, для соответствующего ID ,с фиксированными переменными ID
diskids = "[" + diskid + "]";
//test = diskids.match(/[A-z0-9.]+/g,"");
//.match(new RegExp(idn,'gim'));
// Формирование регулярного выражения с текущим ID
var idn = "\"([A-z0-9.]+)\":{|\"id\":\"5\""
// Текущее ID с названиям дисков
namediskid =diskids.match(new RegExp(idn,'gim'));
namediskids ="[" + namediskid + "]"
// Формирование регулярного выражения с текущим ID
var idx = "\"([A-z0-9.]+)\":{,\"id\":\"5\""
// Имя диска и текущий ID
nameid =namediskids.match(new RegExp(idx,'gim'));
nameids = "[" + nameid + "]";
// Оставляем только Имя диска
hddName =nameids.match(/"(([A-z0-9.]+))":{/im);
return hddName[1];
}
Пример Ответов
"hdd":{"id":"2"

["hdd":{"id":"2"
"hdd":{"id":"3"
"ssd":{"id":"4"]
строкой
["hdd":{"id":"2","hdd":{"id":"3","id":"5","ssd":{"id":"4"]

[,hdd5,id,2,hdd6,id,3,ssd7,id,4,]


Подстановка перемнных

Код: Выделить всё

// Данные одной строкой
var diskval = value.replace(/[\n\r]+/g,"");
// Выберем Диск + ID
var diskid = diskval.match(/"([A-z0-9.]+)":{"id":"[0-9]+"|"id":"[0-9]+"/gmi);

// Найдем все ID
var regexp = diskval.match(/"id":"[0-9]+"/gmi);
// Разделитель запятая, для цикла
var myarray = ("[" + regexp + "]").split(',');
//for (var i = regexp.length - 1; i >= 0; --i)
for (var i = 0; i < myarray.length; i++){
var idv = (myarray[i]).replace(/\[|]/gi, '').replace(/"/gi,"\\\"");
var res = myarray[i].match(/"id":"(\d+)"/);

// Выберем название дисков, для соответствующего ID
diskids = "[" + diskid + "]";
// Формирование регулярного выражения с текущим ID
var idn = '\"([A-z0-9.]+)\":{|'+idv+''

//var idn = "\"([A-z0-9.]+)\":{|\"id\":\"${res[1]}\""
// Текущее ID с названиям дисков
namediskid =diskids.match(new RegExp(idn,'gim'));
namediskids ="[" + namediskid + "]"
// Формирование регулярного выражения с текущим ID
var idx = '\"([A-z0-9.]+)\":{,'+idv+''
//var idx = "\"([A-z0-9.]+)\":{,\"id\":\"${res[1]}\""
// Имя диска и текущий ID
nameid =namediskids.match(new RegExp(idx,'gim'));
nameids = "[" + nameid + "]";
// Оставляем только Имя диска
DiskListName =nameids.match(/"(([A-z0-9.]+))":{/im);
var DiskList =DiskListName[1];
return DiskList;
}
И ГОТОВЫЙ ВАРИАНТ СКРИПТА

Код: Выделить всё

// Данные одной строкой
var diskval = value.replace(/[\n\r]+/g,"").replace(/[\[\]]+/g,"");
// Выберем Вид Диска + ID
var diskid = diskval.match(/"([A-z0-9.]+)":{"id":"[0-9]+"|"id":"[0-9]+"/gmi);

// Переменные
var sep="";
var dataout = "";

// Найдем все ID
var regexp = diskval.match(/"id":"[0-9]+"/gmi);
// Разделитель запятая, для цикла
var myarray = ("[" + regexp + "]").split(',');
//for (var i = regexp.length - 1; i >= 0; --i)
for (var i = 0; i < myarray.length; i++){
// Подстановка ID в регулярку
var idv = (myarray[i]).replace(/\[|]/gi, '').replace(/"/gi,"\\\"");
// ID
var ID = idv.match(/([0-9]+)/gmi)

// Выберем Вид дисков, для соответствующего ID
diskids = "[" + diskid + "]";
// Текущее ID с видом дисков, регулярного выражения с текущим ID
viddiskid =diskids.match(new RegExp('\"([A-z0-9.]+)\":{|'+idv+'','gim'));
viddiskids ="[" + viddiskid + "]"
// Вид диска и текущий ID, регулярного выражения с текущим ID
vidid =viddiskids.match(new RegExp('\"([A-z0-9.]+)\":{,'+idv+'','gim'));
vidids = "[" + vidid + "]";
// Оставляем только Вид диска
DiskListVid =vidids.match(/"(([A-z0-9.]+))":{/im);
// Вид диска
var DiskList =DiskListVid[1];
// Имя Диска
var diskname =diskval.match(new RegExp('\"id\":\"'+ID+'\",\"hddName\":\"([A-z0-9.]+|)\"','im'));
// Путь Диска
var diskpath =diskval.match(new RegExp('\"id\":\"'+ID+'\".*?,\"hddPath\":\"([A-z0-9.]+|)\"','im'));
// Тип Диска
var disktype =diskval.match(new RegExp('\"id\":\"'+ID+'\".*?,\"hddType\":\"([A-z0-9.]+|)\"','im'));
// Строка с данными
sop=''+sep+'{"{#HDD_ID}": "'+ID+'", "{#DISKLIST}": "'+DiskList+'", "{#HDD_NAME}": "'+diskname[1]+'", "{#HDD_PATH}": "'+diskpath[1]+'", "{#HDD_TYPE}": "'+disktype[1]+'"}';
var sep=",";
// Накопительная переменная для цикла
dataout+= sop;
}
// Добавим скобки массива, для объекта
out = "[" + dataout + "]";
//return out;
// Читаемый вид перенос строк              
return out.replace(/\[/g,"[\n").replace(/\},/g,"},\n").replace(/\}]/g,"}\n]");
Вывод
[
{"{#HDD_ID}": "2", "{#DISKLIST}": "hdd", "{#HDD_NAME}": "hdd2", "{#HDD_PATH}": "", "{#HDD_TYPE}": "SATA2"},
{"{#HDD_ID}": "3", "{#DISKLIST}": "hdd", "{#HDD_NAME}": "hdd3", "{#HDD_PATH}": "", "{#HDD_TYPE}": "SATA3"},
{"{#HDD_ID}": "5", "{#DISKLIST}": "hdd", "{#HDD_NAME}": "hdd5", "{#HDD_PATH}": "", "{#HDD_TYPE}": "SATA5"},
{"{#HDD_ID}": "4", "{#DISKLIST}": "ssd", "{#HDD_NAME}": "hdd4", "{#HDD_PATH}": "", "{#HDD_TYPE}": "SATA4"}
]
количество слов: 1451
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 809
Стаж: 5 лет 2 месяца
Откуда: Вологодская область
Поблагодарили: 34 раза
Контактная информация:

Предобработка JavaScript - JS в Zabbix

Сообщение Артём Мамзиков »

Для параметров SMART Видеорегистраторов берем XML формат преобразуем в JSON

Пример для 2х дисков из 5 параметров

Код: Выделить всё

Входные данные
{
"SmartTestStatus":[
{
"id":"1",
"temprature":"33",
"powerOnDay":"713",
"selfEvaluaingStatus":"ok",
"allEvaluaingStatus":"functional",
"selfTestPercent":"0",
"selfTestStatus":"not_tested",
"testType":"short",
"TestResultList":{
"TestResult":[
{"attributeID":"1",
"status":"ok",
"flags":"47",
"thresholds":"51",
"value":"200",
"worst":"200",
"rawValue":"0"},
{"attributeID":"3",
"status":"ok",
"flags":"39",
"thresholds":"21",
"value":"190",
"worst":"184",
"rawValue":"7458"},
{"attributeID":"4",
"status":"ok",
"flags":"50",
"thresholds":"0",
"value":"100",
"worst":"100",
"rawValue":"350"},
{"attributeID":"5",
"status":"ok",
"flags":"51",
"thresholds":"140",
"value":"200",
"worst":"200",
"rawValue":"0"}
]}},
{
"id":"2",
"temprature":"32",
"powerOnDay":"631",
"selfEvaluaingStatus":"ok",
"allEvaluaingStatus":"functional",
"selfTestPercent":"0",
"selfTestStatus":"not_tested",
"testType":"short",
"TestResultList":{
"TestResult":[
{"attributeID":"1",
"status":"ok",
"flags":"47",
"thresholds":"51",
"value":"200",
"worst":"200",
"rawValue":"0"},
{"attributeID":"3",
"status":"ok",
"flags":"39",
"thresholds":"21",
"value":"185",
"worst":"185",
"rawValue":"7708"},
{"attributeID":"4",
"status":"ok",
"flags":"50",
"thresholds":"0",
"value":"100",
"worst":"100",
"rawValue":"333"},
{"attributeID":"5",
"status":"ok",
"flags":"51",
"thresholds":"140",
"value":"200",
"worst":"200",
"rawValue":"0"}
]}}
]}
СКРИПТ ПРЕДОБРАБОТКИ 1 ВАРИАНТ

Код: Выделить всё

var data = JSON.parse(value.replace(/"SmartTestStatus":{/g,'"SmartTestStatus":[{').replace(/}}$/g,'}]}'));
var out = [];
var numid =data.SmartTestStatus.id

//data.SmartTestStatus.TestResultList.TestResult.forEach(function (attrid) {
data.SmartTestStatus.forEach(function (smartinf) {
   smartinf.TestResultList.TestResult.forEach(function (attrid) {
   out.push({"{#HDD_ID}": smartinf.id,"{#ATTRIBUTEID}": attrid.attributeID});
  })})
//return JSON.stringify(out);
// Читаемый вид перенос строк
//return JSON.stringify(out).replace(/\[/g,"[\n").replace(/\},/g,"},\n").replace(/\}]/g,"}\n]");

// Удалим одинаковые ID (нулевые)
arr =out;
// Здесь функция `removeDuplicates` возвращает новый массив `uniqueArr` без дубликатов объектов.
function removeDuplicates(arr) {
  if (Array.isArray(arr)) {
    var uniqueArr = arr.filter(function(obj, pos, arr) {
      for (var i = 0; i < pos; i++) {
        if (arr[i]['{#HDD_ID}'] === obj['{#HDD_ID}'] && arr[i]['{#ATTRIBUTEID}'] === obj['{#ATTRIBUTEID}']) {
          return false;
       }}
      return true;
    });
    return uniqueArr;} else {return "Переменная не является массивом";}}
var result = removeDuplicates(arr);
//return JSON.stringify(result);
// Читаемый вид перенос строк
return JSON.stringify(result).replace(/\[/g,"[\n").replace(/\},/g,"},\n").replace(/\}]/g,"}\n]");


//return JSON.stringify(out).replace(/\[/g,'[{\"{#HDD_ID0}\": \"'+numid+'\"},').replace(/\[/g,"[\n").replace(/\},/g,"},\n").replace(/\}]/g,"}\n]");
// Фиксированные элементы пропишем вручную
//var fiks ='{\"{#HDD_ID1}\": \"'+numid+'\",\"{#ATTRIBUTETXT}\": \"allEvaluaingStatus\",\"{#NAME}\": \"Весь Cамооценивающий Cтатус Диска\"},{\"{#HDD_ID1}\": \"'+numid+'\",\"{#ATTRIBUTETXT}\": \"selfEvaluaingStatus\",\"{#NAME}\": \"Cамооценивающий Cтатус Диска\"},{\"{#HDD_ID1}\": \"'+numid+'\",\"{#ATTRIBUTETXT}\": \"selfTestStatus\",\"{#NAME}\": \"Статус самопроверки Диска\"},{\"{#HDD_ID1}\": \"'+numid+'\",\"{#ATTRIBUTETXT}\": \"testType\",\"{#NAME}\": \"Тип Теста проверки Диска\"},{\"{#HDD_ID0}\": \"'+numid+'\",\"{#ATTRIBUTENUM}\": \"powerOnDay\",\"{#NAME}\": \"Кол-во дней работы Диска\",\"{#UNIT}\": \"Дней\"},{\"{#HDD_ID0}\": \"'+numid+'\",\"{#ATTRIBUTENUM}\": \"selfTestPercent\",\"{#NAME}\": \"Процент самотестирования Диска\",\"{#UNIT}\": \"%\"},{\"{#HDD_ID0}\": \"'+numid+'\",\"{#ATTRIBUTENUM}\": \"temprature\",\"{#NAME}\": \"Температура Диска\",\"{#UNIT}\": \"°C\"},';
// Читаемый вид перенос строк и дополненный фиксированными элементами. 
//return JSON.stringify(out).replace(/\[/g,'['+fiks+'').replace(/\[/g,"[\n").replace(/\},/g,"},\n").replace(/\}]/g,"}\n]");
Получаем ответ для правила обнаружения
[
{"{#HDD_ID}":"1","{#ATTRIBUTEID}":"1"},
{"{#HDD_ID}":"1","{#ATTRIBUTEID}":"3"},
{"{#HDD_ID}":"1","{#ATTRIBUTEID}":"4"},
{"{#HDD_ID}":"1","{#ATTRIBUTEID}":"5"},
{"{#HDD_ID}":"2","{#ATTRIBUTEID}":"1"},
{"{#HDD_ID}":"2","{#ATTRIBUTEID}":"3"},
{"{#HDD_ID}":"2","{#ATTRIBUTEID}":"4"},
{"{#HDD_ID}":"2","{#ATTRIBUTEID}":"5"}
]

Добавим Имя триггера
Соотвествие значению:
1 Ошибки при чтении восстановленные за счет коррекции
2 Снижение производительности диска
3 Среднее время раскрутки шпинделя
4 Произошел перезапуск диска
5 В резервной области диска есть битые сектора

Входные данные те же
Скрипт будет

Код: Выделить всё

var data = JSON.parse(value.replace(/"SmartTestStatus":{/g, '"SmartTestStatus":[{').replace(/}}$/g, '}]}'));
var out = [];
var numid =data.SmartTestStatus.id

//data.SmartTestStatus.TestResultList.TestResult.forEach(function (attrid) {
data.SmartTestStatus.forEach(function(smartinf) {
  smartinf.TestResultList.TestResult.forEach(function(attrid) {
    var nameTrig = '';
    switch (attrid.attributeID) {
      case '1':
        nameTrig = 'Ошибки при чтении восстановленные за счет коррекции';
        break;
      case '2':
        nameTrig = 'Снижение производительности диска';
        break;
      case '3':
        nameTrig = 'Среднее время раскрутки шпинделя';
        break;
      case '4':
        nameTrig = 'Произошел перезапуск диска';
        break;
      case '5':
        nameTrig = 'В резервной области диска есть битые сектора';
        break;
      default:
        nameTrig = '';
    }
    {
      out.push({"{#HDD_ID}": smartinf.id,"{#ATTRIBUTEID}": attrid.attributeID,"{#NAMETRIG}": nameTrig});
    }})});

//return JSON.stringify(out);
// Читаемый вид перенос строк
//return JSON.stringify(out).replace(/\[/g,"[\n").replace(/\},/g,"},\n").replace(/\}]/g,"}\n]");

// Удалим одинаковые ID (нулевые)
arr =out;
// Здесь функция `removeDuplicates` возвращает новый массив `uniqueArr` без дубликатов объектов.
function removeDuplicates(arr) {
  if (Array.isArray(arr)) {
    var uniqueArr = arr.filter(function(obj, pos, arr) {
      for (var i = 0; i < pos; i++) {
        if (arr[i]['{#HDD_ID}'] === obj['{#HDD_ID}'] && arr[i]['{#ATTRIBUTEID}'] === obj['{#ATTRIBUTEID}']) {
          return false;
       }}
      return true;
    });
    return uniqueArr;} else {return "Переменная не является массивом";}}
var result = removeDuplicates(arr);
//return JSON.stringify(result);
// Читаемый вид перенос строк
return JSON.stringify(result).replace(/\[/g,"[\n").replace(/\},/g,"},\n").replace(/\}]/g,"}\n]");
ОТВЕТ
[
{"{#HDD_ID}":"1","{#ATTRIBUTEID}":"1","{#NAMETRIG}":"Ошибки при чтении восстановленные за счет коррекции"},
{"{#HDD_ID}":"1","{#ATTRIBUTEID}":"3","{#NAMETRIG}":"Среднее время раскрутки шпинделя"},
{"{#HDD_ID}":"1","{#ATTRIBUTEID}":"4","{#NAMETRIG}":"Произошел перезапуск диска"},
{"{#HDD_ID}":"1","{#ATTRIBUTEID}":"5","{#NAMETRIG}":"В резервной области диска есть битые сектора"},
{"{#HDD_ID}":"2","{#ATTRIBUTEID}":"1","{#NAMETRIG}":"Ошибки при чтении восстановленные за счет коррекции"},
{"{#HDD_ID}":"2","{#ATTRIBUTEID}":"3","{#NAMETRIG}":"Среднее время раскрутки шпинделя"},
{"{#HDD_ID}":"2","{#ATTRIBUTEID}":"4","{#NAMETRIG}":"Произошел перезапуск диска"},
{"{#HDD_ID}":"2","{#ATTRIBUTEID}":"5","{#NAMETRIG}":"В резервной области диска есть битые сектора"}
]


Добавить функцию условия для триггера (сразу скажу подставить так не выйдет(( не даст создать триггер с макросом функции)

Код: Выделить всё

var data = JSON.parse(value.replace(/"SmartTestStatus":{/g, '"SmartTestStatus":[{').replace(/}}$/g, '}]}'));
var out = [];
var numid =data.SmartTestStatus.id

//data.SmartTestStatus.TestResultList.TestResult.forEach(function (attrid) {
data.SmartTestStatus.forEach(function(smartinf) {
  smartinf.TestResultList.TestResult.forEach(function(attrid) {
    var nameTrig = '';
    switch (attrid.attributeID) {
        case '1': nameTrig = 'Ошибки при чтении восстановленные за счет коррекции'; funcTrig = 'last()>1'; break;
        case '2': nameTrig = 'Снижение производительности диска'; funcTrig = ''; break;
        case '3': nameTrig = 'Среднее время раскрутки шпинделя'; funcTrig = 'diff()}=1'; break;
        case '4': nameTrig = 'Произошел перезапуск диска'; funcTrig = 'last()>last(#2)'; break;
        case '5': nameTrig = 'В резервной области диска есть битые сектора'; funcTrig = 'last()>1'; break;
        default: nameTrig = ''; funcTrig = '';
      }
    {
      out.push({"{#HDD_ID}": smartinf.id,"{#ATTRIBUTEID}": attrid.attributeID,"{#NAMETRIG}": nameTrig,"{#FUNCTION}": funcTrig});
    }})});

//return JSON.stringify(out);
// Читаемый вид перенос строк
//return JSON.stringify(out).replace(/\[/g,"[\n").replace(/\},/g,"},\n").replace(/\}]/g,"}\n]");

// Удалим одинаковые ID (нулевые)
arr =out;
// Здесь функция `removeDuplicates` возвращает новый массив `uniqueArr` без дубликатов объектов.
function removeDuplicates(arr) {
  if (Array.isArray(arr)) {
    var uniqueArr = arr.filter(function(obj, pos, arr) {
      for (var i = 0; i < pos; i++) {
        if (arr[i]['{#HDD_ID}'] === obj['{#HDD_ID}'] && arr[i]['{#ATTRIBUTEID}'] === obj['{#ATTRIBUTEID}']) {
          return false;
       }}
      return true;
    });
    return uniqueArr;} else {return "Переменная не является массивом";}}
var result = removeDuplicates(arr);
//return JSON.stringify(result);
// Читаемый вид перенос строк
return JSON.stringify(result).replace(/\[/g,"[\n").replace(/\},/g,"},\n").replace(/\}]/g,"}\n]");
ОТВЕТ (если какие то ID не заданы будет пустой макрос)
[
{"{#HDD_ID}":"1","{#ATTRIBUTEID}":"1","{#NAMETRIG}":"Ошибки при чтении восстановленные за счет коррекции","{#FUNCTION}":"last()>1"},
{"{#HDD_ID}":"1","{#ATTRIBUTEID}":"3","{#NAMETRIG}":"Среднее время раскрутки шпинделя","{#FUNCTION}":"diff()}=1"},
{"{#HDD_ID}":"1","{#ATTRIBUTEID}":"4","{#NAMETRIG}":"Произошел перезапуск диска","{#FUNCTION}":"last()>last(#2)"},
{"{#HDD_ID}":"1","{#ATTRIBUTEID}":"5","{#NAMETRIG}":"В резервной области диска есть битые сектора","{#FUNCTION}":"last()>1"},
{"{#HDD_ID}":"1","{#ATTRIBUTEID}":"7","{#NAMETRIG}":"","{#FUNCTION}":""},
{"{#HDD_ID}":"1","{#ATTRIBUTEID}":"9","{#NAMETRIG}":"","{#FUNCTION}":""},
{"{#HDD_ID}":"1","{#ATTRIBUTEID}":"10","{#NAMETRIG}":"","{#FUNCTION}":""},
{"{#HDD_ID}":"1","{#ATTRIBUTEID}":"11","{#NAMETRIG}":"","{#FUNCTION}":""},
{"{#HDD_ID}":"1","{#ATTRIBUTEID}":"12","{#NAMETRIG}":"","{#FUNCTION}":""},
{"{#HDD_ID}":"1","{#ATTRIBUTEID}":"192","{#NAMETRIG}":"","{#FUNCTION}":""},
{"{#HDD_ID}":"1","{#ATTRIBUTEID}":"193","{#NAMETRIG}":"","{#FUNCTION}":""},
{"{#HDD_ID}":"1","{#ATTRIBUTEID}":"194","{#NAMETRIG}":"","{#FUNCTION}":""},
{"{#HDD_ID}":"1","{#ATTRIBUTEID}":"196","{#NAMETRIG}":"","{#FUNCTION}":""},
{"{#HDD_ID}":"1","{#ATTRIBUTEID}":"197","{#NAMETRIG}":"","{#FUNCTION}":""},
{"{#HDD_ID}":"1","{#ATTRIBUTEID}":"198","{#NAMETRIG}":"","{#FUNCTION}":""},
{"{#HDD_ID}":"1","{#ATTRIBUTEID}":"199","{#NAMETRIG}":"","{#FUNCTION}":""},
{"{#HDD_ID}":"1","{#ATTRIBUTEID}":"200","{#NAMETRIG}":"","{#FUNCTION}":""},
{"{#HDD_ID}":"1","{#ATTRIBUTEID}":"0","{#NAMETRIG}":"","{#FUNCTION}":""},
{"{#HDD_ID}":"2","{#ATTRIBUTEID}":"1","{#NAMETRIG}":"Ошибки при чтении восстановленные за счет коррекции","{#FUNCTION}":"last()>1"},
{"{#HDD_ID}":"2","{#ATTRIBUTEID}":"3","{#NAMETRIG}":"Среднее время раскрутки шпинделя","{#FUNCTION}":"diff()}=1"},
{"{#HDD_ID}":"2","{#ATTRIBUTEID}":"4","{#NAMETRIG}":"Произошел перезапуск диска","{#FUNCTION}":"last()>last(#2)"},
{"{#HDD_ID}":"2","{#ATTRIBUTEID}":"5","{#NAMETRIG}":"В резервной области диска есть битые сектора","{#FUNCTION}":"last()>1"},
{"{#HDD_ID}":"2","{#ATTRIBUTEID}":"7","{#NAMETRIG}":"","{#FUNCTION}":""},
{"{#HDD_ID}":"2","{#ATTRIBUTEID}":"9","{#NAMETRIG}":"","{#FUNCTION}":""},
{"{#HDD_ID}":"2","{#ATTRIBUTEID}":"10","{#NAMETRIG}":"","{#FUNCTION}":""},
{"{#HDD_ID}":"2","{#ATTRIBUTEID}":"11","{#NAMETRIG}":"","{#FUNCTION}":""},
{"{#HDD_ID}":"2","{#ATTRIBUTEID}":"12","{#NAMETRIG}":"","{#FUNCTION}":""},
{"{#HDD_ID}":"2","{#ATTRIBUTEID}":"192","{#NAMETRIG}":"","{#FUNCTION}":""},
{"{#HDD_ID}":"2","{#ATTRIBUTEID}":"193","{#NAMETRIG}":"","{#FUNCTION}":""},
{"{#HDD_ID}":"2","{#ATTRIBUTEID}":"194","{#NAMETRIG}":"","{#FUNCTION}":""},
{"{#HDD_ID}":"2","{#ATTRIBUTEID}":"196","{#NAMETRIG}":"","{#FUNCTION}":""},
{"{#HDD_ID}":"2","{#ATTRIBUTEID}":"197","{#NAMETRIG}":"","{#FUNCTION}":""},
{"{#HDD_ID}":"2","{#ATTRIBUTEID}":"198","{#NAMETRIG}":"","{#FUNCTION}":""},
{"{#HDD_ID}":"2","{#ATTRIBUTEID}":"199","{#NAMETRIG}":"","{#FUNCTION}":""},
{"{#HDD_ID}":"2","{#ATTRIBUTEID}":"200","{#NAMETRIG}":"","{#FUNCTION}":""},
{"{#HDD_ID}":"2","{#ATTRIBUTEID}":"0","{#NAMETRIG}":"","{#FUNCTION}":""}
]


С КОДАМИ ИМЕНАМИ ОШИБОК

Код: Выделить всё

var data = JSON.parse(value.replace(/"SmartTestStatus":{/g, '"SmartTestStatus":[{').replace(/}}$/g, '}]}'));
var out = [];
var numid =data.SmartTestStatus.id

//data.SmartTestStatus.TestResultList.TestResult.forEach(function (attrid) {
data.SmartTestStatus.forEach(function(smartinf) {
  smartinf.TestResultList.TestResult.forEach(function(attrid) {
    var nameTrig = '';
    switch (attrid.attributeID) {
        case '1': nameTrig = 'Ошибки при чтении восстановленные за счет коррекции'; funcTrig = 'last()>1'; break;
        case '2': nameTrig = 'Снижение производительности диска'; funcTrig = 'last()<last(#2)'; break;
        case '3': nameTrig = 'Среднее время раскрутки шпинделя'; funcTrig = 'diff()=1'; break;
        case '4': nameTrig = 'Произошел перезапуск диска'; funcTrig = 'last()>last(#2)'; break;
        case '5': nameTrig = 'В резервной области диска есть битые сектора'; funcTrig = 'last()>1'; break;
        case '6': nameTrig = ' Запас канала чтения'; funcTrig = ''; break;
        case '7': nameTrig = 'Ошибки при позиционировании блока магнитных головок'; funcTrig = 'last()>1'; break;
        case '8': nameTrig = 'Замедление позиционирования магнитных головок'; funcTrig = 'last()<last(#2)'; break;
        case '9': nameTrig = 'Общее время работы диска более 7 лет'; funcTrig = 'last()>61320'; break;
        case '10': nameTrig = 'Повторные попытки раскрутки дисков'; funcTrig = 'last()}>3'; break;
        case '11': nameTrig = 'Количество повторных рекалибровок'; funcTrig = ''; break;
        case '12': nameTrig = 'Получена команда на выключение диска'; funcTrig = 'last()>last(#2)'; break;
        case '13': nameTrig = 'Количество программных сбоев'; funcTrig = ''; break;
        case '100': nameTrig = 'количество циклов стирания –записи SSD'; funcTrig = ''; break;
        case '103': nameTrig = 'Кол-во событий, связанных с разрушением внутренних таблиц транслятора и его перестроением'; funcTrig = ''; break;
        case '170': nameTrig = 'Количество доступных резервных блоков'; funcTrig = ''; break;
        case '171': nameTrig = 'SSD-ошибки записи в перепрограммируемую память'; funcTrig = '.diff()}=1'; break;
        case '172': nameTrig = 'Ошибки стирания flash-памяти SSD'; funcTrig = ''; break;
        case '173': nameTrig = 'SSD максимально допустимое кол-во операций стирания'; funcTrig = ''; break;
        case '174': nameTrig = 'непредвиденное отключение питания для SSD'; funcTrig = ''; break;
        case '175': nameTrig = 'Cбоях защиты от отключения питания SSD-дисков'; funcTrig = ''; break;
        case '180': nameTrig = 'Кол-во резервных секторов'; funcTrig = ''; break;
        case '183': nameTrig = 'Количество снижений скорости SATA'; funcTrig = ''; break;
        case '184': nameTrig = 'Количество обнаруженных кэш-памяти и исправленных сквозных ошибок'; funcTrig = 'diff()=1'; break;
        case '185': nameTrig = 'Стабильность головок'; funcTrig = ''; break;
        case '187': nameTrig = 'Количество невосстановимых ошибок'; funcTrig = 'diff()=1'; break;
        case '188': nameTrig = 'Кол-во команд, прерванных по таймауту'; funcTrig = 'diff()=1'; break;
        case '189': nameTrig = 'Кол-во событий, связанных с ошибками'; funcTrig = ''; break;
        case '190': nameTrig = 'Высокая температура диска'; funcTrig = 'last()>60'; break;
        case '191': nameTrig = 'Кол-во ошибок, возникающих в результате ударных'; funcTrig = ''; break;
        case '192': nameTrig = 'Произошло аварийное выключение диска'; funcTrig = 'last()>last(#2)'; break;
        case '193': nameTrig = 'Счетчик парковки головок увеличен'; funcTrig = 'last()>last(#2)'; break;
        case '194': nameTrig = 'Высокая температура диска'; funcTrig = 'last()>60'; break;
        case '195': nameTrig = 'Кол-во ошибок считывания, исправленных'; funcTrig = 'diff()=1'; break;
        case '196': nameTrig = 'Число операций переназначения секторов диска'; funcTrig = 'last()>1'; break;
        case '197': nameTrig = 'Секторы являющиеся кандидатами на замену'; funcTrig = 'last()>5'; break;
        case '198': nameTrig = 'Резервная область диска переполнена'; funcTrig = 'last()>1'; break;
        case '199': nameTrig = 'Ошибка при передаче данных по внешнему интерфейсу'; funcTrig = 'last()>1'; break;
        case '200': nameTrig = 'Ошибки записи данных'; funcTrig = 'last()>1'; break;
        case '201': nameTrig = 'Частота появления «программных» ошибок при чтении данных с диска'; funcTrig = 'diff()=1'; break;
        case '202': nameTrig = 'Кол-во адресных данных (DAM) ошибок (или) поставщика'; funcTrig = ''; break;
        case '203': nameTrig = 'Количество ошибок ECC'; funcTrig = ''; break;
        case '204': nameTrig = 'Кол-во ошибок ECC, скорректированных программным способом'; funcTrig = ''; break;
        case '205': nameTrig = 'Кол-во ошибок тепловой неровностей'; funcTrig = ''; break;
        case '206': nameTrig = ' Высота между головкой и поверхностью диска'; funcTrig = ''; break;
        case '207': nameTrig = 'Величина силы тока при раскрутке диска'; funcTrig = ''; break;
        case '208': nameTrig = 'Кол-во процедур buzz для вращения диска'; funcTrig = ''; break;
        case '209': nameTrig = 'Производительность поиска во время офлайновых операций'; funcTrig = ''; break;
        case '210': nameTrig = 'Вибрация во время записи'; funcTrig = ''; break;
        case '211': nameTrig = 'Вибрация во время записи'; funcTrig = ''; break;
        case '212': nameTrig = 'Удары во время записи'; funcTrig = ''; break;
        case '220': nameTrig = 'Смещения блока дисков относительно шпинделя'; funcTrig = 'diff()=1'; break;
        case '221': nameTrig = 'Число ошибок, возникших из-за внешних нагрузок и ударов'; funcTrig = ''; break;
        case '222': nameTrig = 'Время, проведённое блоком магнитных головок между выгрузкой из парковочной области и обратно'; funcTrig = ''; break;
        case '223': nameTrig = 'Кол-во новых попыток выгрузок/загрузок блока магнитных головок в/из парковочной области после неудачной попытки'; funcTrig = ''; break;
        case '224': nameTrig = 'Величина силы трения блока магнитных головок при его выгрузке из парковочной области'; funcTrig = ''; break;
        case '225': nameTrig = 'Кол-во циклов перемещения блока магнитных головок в парковочную область'; funcTrig = ''; break;
        case '226': nameTrig = 'Время, за которое привод выгружает магнитные головки из парковки на рабочую поверхность диска'; funcTrig = ''; break;
        case '227': nameTrig = 'Кол-во попыток скомпенсировать вращающий момент'; funcTrig = ''; break;
        case '228': nameTrig = 'Кол-во повторов автоматической парковки головок в результате выключения питания'; funcTrig = ''; break;
        case '230': nameTrig = 'Амплитуда «дрожания»'; funcTrig = ''; break;
        case '231': nameTrig = 'Температура жёсткого диска'; funcTrig = 'last()>60'; break;
        case '232': nameTrig = 'SSD кол-во записанных секторов, процент доступной резервной области,'; funcTrig = ''; break;
        case '233': nameTrig = 'Время работы накопителя, ssd износа носителя'; funcTrig = ''; break;
        case '234': nameTrig = 'Кол-во неисправимых ошибок ECC'; funcTrig = ''; break;
        case '240': nameTrig = 'Общее время нахождения блока головок в рабочем положении в часах'; funcTrig = ''; break;
        case '241': nameTrig = 'Общее кол-во записанных секторов LBA.'; funcTrig = ''; break;
        case '242': nameTrig = 'Общее кол-во прочитанных секторов LBA'; funcTrig = ''; break;
        case '250': nameTrig = 'Число ошибок во время чтения жёсткого диска'; funcTrig = ''; break;
        case '254': nameTrig = 'Кол-во падений'; funcTrig = ''; break;
        default: nameTrig = ''; funcTrig = '';
      }
    {
      out.push({"{#HDD_ID}": smartinf.id,"{#ATTRIBUTEID}": attrid.attributeID,"{#NAMETRIG}": nameTrig,"{#FUNCTION}": funcTrig});
    }})});

//return JSON.stringify(out);
// Читаемый вид перенос строк
//return JSON.stringify(out).replace(/\[/g,"[\n").replace(/\},/g,"},\n").replace(/\}]/g,"}\n]");

// Удалим одинаковые ID (нулевые)
arr =out;
// Здесь функция `removeDuplicates` возвращает новый массив `uniqueArr` без дубликатов объектов.
function removeDuplicates(arr) {
  if (Array.isArray(arr)) {
    var uniqueArr = arr.filter(function(obj, pos, arr) {
      for (var i = 0; i < pos; i++) {
        if (arr[i]['{#HDD_ID}'] === obj['{#HDD_ID}'] && arr[i]['{#ATTRIBUTEID}'] === obj['{#ATTRIBUTEID}']) {
          return false;
       }}
      return true;
    });
    return uniqueArr;} else {return "Переменная не является массивом";}}
var result = removeDuplicates(arr);
//return JSON.stringify(result);
// Читаемый вид перенос строк
return JSON.stringify(result).replace(/\[/g,"[\n").replace(/\},/g,"},\n").replace(/\}]/g,"}\n]");
количество слов: 1647
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 809
Стаж: 5 лет 2 месяца
Откуда: Вологодская область
Поблагодарили: 34 раза
Контактная информация:

Предобработка JavaScript - JS в Zabbix

Сообщение Артём Мамзиков »

Javascript регулярка удаление пустых строк или строк с пробелами
наподобии BASH
sed -e '/^/d' sed -i '/^/d'
awk 'NF > 0'
grep -Ev "^$"
tr -s '\n'
Пусть будет это наш текст
Показать
--CONTROLLER INFORMATION--



Name: Intel(R) Desktop/Workstation/Server Express Chipset SATA RAID Controller

Type: AHCI

Supported RAID: 0,1,5,10

Max Disks/Array: 6

HW Information:

Vendor ID: 0x8086

Device ID: 0x2822

HW Revision: 5

Dynamic Storage Accelerator: Disabled



--ARRAY INFORMATION--



Name: SATA_Array_0000

Size: 932 GB

Free: 0 GB

Num Disks: 2

Num Vols: 1

Write Cache: On



--VOLUME INFORMATION--



Name: RAID1

Raid Level: 1

Size: 466 GB

StripeSize: 64 KB

Num Disks: 2

State: Normal

System: True

Initialized: True

Cache Policy: Off



--END DEVICE INFORMATION--



ID: 0-0-0-0

Type: Disk

Disk Type: SATA Disk

State: Normal

Size: 466 GB

Free Size: 0 GB

System Disk: False

Usage: Array member

Serial Number: WD-WMAYP0910264

Model: WDC WD5003ABYX-01WERA0



ID: 0-0-1-0

Type: Disk

Disk Type: Unknown disk type Disk

State: Normal

Size: 0 GB

Free Size: 0 GB

System Disk: False

Usage: Array member

Serial Number: WD-WMAYP0DRJ5CP

Model:



ID: 0-0-2-0

Type: Disk

Disk Type: Unknown disk type Disk

State: Normal

Size: 0 GB

Free Size: 466 GB

System Disk: False

Usage: Pass through

Serial Number: WD-WMAYP3258497

Model:







0

Короткий вариант
Для теста в браузере по F12

Код: Выделить всё

let value = "Тут ваш текст с пустыми строками";

// Удаление пустых строк и строк с пробелами одной командой
let cleanedText = text.replace(/^\s*[\r\n]+|^\s+$/gm, '');

console.log(cleanedText);

Вид для заббикс console заменить на return, присвоение переменой var вместо let

Код: Выделить всё

// Удаление пустых строк и строк с пробелами одной командой
var cleanedText = value.replace(/^\s*[\r\n]+|^\s+$/gm, '');
// Вывод информации
return cleanedText;
Полученный результат без пустых строк
Показать
--CONTROLLER INFORMATION--
Name: Intel(R) Desktop/Workstation/Server Express Chipset SATA RAID Controller
Type: AHCI
Supported RAID: 0,1,5,10
Max Disks/Array: 6
HW Information:
Vendor ID: 0x8086
Device ID: 0x2822
HW Revision: 5
Dynamic Storage Accelerator: Disabled
--ARRAY INFORMATION--
Name: SATA_Array_0000
Size: 932 GB
Free: 0 GB
Num Disks: 2
Num Vols: 1
Write Cache: On
--VOLUME INFORMATION--
Name: RAID1
Raid Level: 1
Size: 466 GB
StripeSize: 64 KB
Num Disks: 2
State: Normal
System: True
Initialized: True
Cache Policy: Off
--END DEVICE INFORMATION--
ID: 0-0-0-0
Type: Disk
Disk Type: SATA Disk
State: Normal
Size: 466 GB
Free Size: 0 GB
System Disk: False
Usage: Array member
Serial Number: WD-WMAYP0910264
Model: WDC WD5003ABYX-01WERA0
ID: 0-0-1-0
Type: Disk
Disk Type: Unknown disk type Disk
State: Normal
Size: 0 GB
Free Size: 0 GB
System Disk: False
Usage: Array member
Serial Number: WD-WMAYP0DRJ5CP
Model:
ID: 0-0-2-0
Type: Disk
Disk Type: Unknown disk type Disk
State: Normal
Size: 0 GB
Free Size: 466 GB
System Disk: False
Usage: Pass through
Serial Number: WD-WMAYP3258497
Model:
0
Более большой вариант удаления пустых строк для zabbix

Код: Выделить всё

# Убрать пустые строки
    // Функция для удаления пустых и содержащих только пробельные символы строк из текста
    function removeEmptyAndWhitespaceLines(text) {
        // Разделяем текст на строки
        var lines = text.split('\n');
        // Фильтруем строки, оставляя только непустые и не содержащие только пробельные символы
        var nonEmptyLines = lines.filter(function(line) {
            return line.trim() !== '';
        });
        // Объединяем непустые строки обратно в текст
        var result = nonEmptyLines.join('\n');
        return result;
    }
    // Выполняем предварительную обработку данных
    var processedValue = removeEmptyAndWhitespaceLines(value);
    // Возвращаем обработанный результат
    return processedValue;
Для браузера из 2х частей

Код: Выделить всё

// Удаление пустых строк
let withoutEmptyLines = text.replace(/^\s*$[\n\r]{1,}/gm, '');

// Удаление строк с пробелами
let withoutLinesWithSpaces = text.replace(/^\s+$/gm, '');

console.log(withoutEmptyLines);
console.log(withoutLinesWithSpaces);

Удалить все до строки --END DEVICE INFORMATION-- включая саму строку
Для браузера теста

Код: Выделить всё

var value = "текст до строки\n--END DEVICE INFORMATION--\nнаш текст после строки";
var cleanedText = text.replace(/^[\s\S]*?--END DEVICE INFORMATION--\n?/, '');
console.log(cleanedText);
Вид для заббикс

Код: Выделить всё

var cleanedText = value.replace(/^[\s\S]*?--END DEVICE INFORMATION--\n?/, '');
return cleanedText;
Соединим оба скрипта

Код: Выделить всё

// Уберем пустые строки
var nulstr = value.replace(/^\s*[\r\n]+|^\s+$/gm, '');
// Вывод после строки --END DEVICE INFORMATION-- все до уберем
var dotext = nulstr.replace(/^[\s\S]*?--END DEVICE INFORMATION--\n?/, '');
return dotext; 
или

Код: Выделить всё

// Уберем пустые строки, Вывод после строки --END DEVICE INFORMATION-- все до уберем
var dotext = value.replace(/^\s*[\r\n]+|^\s+$/gm, '').replace(/^[\s\S]*?--END DEVICE INFORMATION--\n?/, '');
return dotext;
Убрать первую пустую строку

Код: Выделить всё

// Уберем пустые строки, Вывод после строки --END DEVICE INFORMATION-- все до уберем
var dotext = value.replace(/^\s*[\r\n]+|^\s+$/gm, '').replace(/^[\s\S]*?--END DEVICE INFORMATION--\n?/, '').trim();
return dotext;
количество слов: 581
Ответить Вложения 17 Пред. темаСлед. тема

Вернуться в «Установка Заббикс и Дополнений»