Как работает скрипт разбор
Из Службы в Процесс Open Hardware Monitor
Разновидности Open Hardware Monitor и другие похожие утилиты
LibreHardwareMonitor
hwmonitor-pro Windows: Rainmeter, GPU-Z, HWiNFO, AIDA64, Core Temp, Hardinfo, Sidebar Diagnostics, Real Temp.
MAC: iStat Menus, smcFanControl, Fan Control, AIDA64.
НОВАЯ ВЕРСИЯ 3.5 В ОТДЕЛЬНОЙ ВЕТКЕ Скрипт + Шаблон для Windows LLD Hardware Monitor
Авто Создание Триггеров, зависимостей, Графиков
Обнаруживаем все доступные датчик для Windows с помощью Open Hardware Monitor через скрипт который лежит на Zabbix Server. Шаблон зацепленный к узлу создает элементы которые доступны для проверки на узле с windows , далее напрямую запрашивается значение данного элемента прямо с узла. (Скрипт нужен только для обнаружения элементов)
Программка должна работать в виде службы Open Hardware Monitor (и закрыт сам Open Hardware Monitor.exe файл после настройки может мешать передаче данных службы) Ниже будет как сделать в виде службы.
Перезалил 16.12.2020 (добавлен шаблон и скрипт 3.4.1 для работы с портами кому нужно указать в макросе узла нужный порт)
Скачать Шаблон + Скрипт Скачать Шаблоны и скрипты
Скачиваем скрипт ложим его на заббикс сервер в моем случае путь такой
/usr/local/share/zabbix/externalscripts
Делаем импорт шаблона - Добавляем к узлу шаблон На удаленных узлах должен быть агент и OHM виде службы.
Скрипт работает на запрос CMD следующего запроса:
wmic.exe /NAMESPACE:\\root\OpenHardwareMonitor PATH Sensor
Далее мы получаем таблицу и работает с ней выбирая нужные нам столбцы Подробнее Команда WMIC – выполнить сценарий WMI в командной строке
Identifier Index InstanceId Max Min Name Parent ProcessId SensorType Value
/lpc/it8620e/voltage/0 0 3872 1,38 1,284 Voltage #1 /lpc/it8620e 6805950c-324c-4724-8f79-308e888c3472 Voltage 1,356
/amdcpu/0/clock/2 2 3854 4200,022 4000,004 CPU Core #2 /amdcpu/0 6805950c-324c-4724-8f79-308e888c3472 Clock 4100,015
/ram/load/0 0 3864 95,32287 42,7315 Memory /ram 6805950c-324c-4724-8f79-308e888c3472 Load 60,58934
/amdcpu/0/clock/3 3 3855 4200,021 4099,883 CPU Core #3 /amdcpu/0 6805950c-324c-4724-8f79-308e888c3472 Clock 4100,015
/amdcpu/0/load/2 2 3845 100 4,6875 CPU Core #2 /amdcpu/0 6805950c-324c-4724-8f79-308e888c3472 Load 56,25
/lpc/it8620e/voltage/3 3 3875 1,848 1,848 Voltage #4 /lpc/it8620e 6805950c-324c-4724-8f79-308e888c3472 Voltage 1,848
/ram/data/0 0 3865 3,319126 1,487904 Used Memory /ram 6805950c-324c-4724-8f79-308e888c3472 Data 2,109711
/lpc/it8620e/voltage/6 6 3878 2,232 2,22 Voltage #7 /lpc/it8620e 6805950c-324c-4724-8f79-308e888c3472 Voltage 2,232
/lpc/it8620e/voltage/4 4 3876 1,992 1,98 Voltage #5 /lpc/it8620e 6805950c-324c-4724-8f79-308e888c3472 Voltage 1,992
/amdcpu/0/load/7 7 3850 100 0 CPU Core #7 /amdcpu/0 6805950c-324c-4724-8f79-308e888c3472 Load 17,1875
/lpc/it8620e/control/0 0 3840 0 0 Fan Control #1 /lpc/it8620e 6805950c-324c-4724-8f79-308e888c3472 Control 0
/amdcpu/0/load/8 8 3851 100 0 CPU Core #8 /amdcpu/0 6805950c-324c-4724-8f79-308e888c3472 Load 9,677422
/amdcpu/0/clock/8 8 3860 4200,015 1400,004 CPU Core #8 /amdcpu/0 6805950c-324c-4724-8f79-308e888c3472 Clock 4100,015
/amdcpu/0/clock/4 4 3856 4200,022 4000,013 CPU Core #4 /amdcpu/0 6805950c-324c-4724-8f79-308e888c3472 Clock 4100,015
/amdcpu/0/load/3 3 3846 100 0 CPU Core #3 /amdcpu/0 6805950c-324c-4724-8f79-308e888c3472 Load 35,9375
/amdcpu/0/clock/5 5 3857 4200,02 1400,004 CPU Core #5 /amdcpu/0 6805950c-324c-4724-8f79-308e888c3472 Clock 4100,015
/amdcpu/0/load/4 4 3847 100 6,153846 CPU Core #4 /amdcpu/0 6805950c-324c-4724-8f79-308e888c3472 Load 50
/lpc/it8620e/voltage/5 5 3877 2,232 2,22 Voltage #6 /lpc/it8620e 6805950c-324c-4724-8f79-308e888c3472 Voltage 2,232
/amdcpu/0/load/0 0 3852 100 16,99219 CPU Total /amdcpu/0 6805950c-324c-4724-8f79-308e888c3472 Load 30,59336
/lpc/it8620e/control/2 2 3842 0 0 Fan Control #3 /lpc/it8620e 6805950c-324c-4724-8f79-308e888c3472 Control 0
/amdcpu/0/clock/1 1 3853 4200,022 4099,883 CPU Core #1 /amdcpu/0 6805950c-324c-4724-8f79-308e888c3472 Clock 4100,015
/amdcpu/0/clock/0 0 3862 200,0044 199,9943 Bus Speed /amdcpu/0 6805950c-324c-4724-8f79-308e888c3472 Clock 200,0007
/lpc/it8620e/voltage/1 1 3873 1,5 1,488 Voltage #2 /lpc/it8620e 6805950c-324c-4724-8f79-308e888c3472 Voltage 1,5
/lpc/it8620e/control/1 1 3841 0 0 Fan Control #2 /lpc/it8620e 6805950c-324c-4724-8f79-308e888c3472 Control 0
/lpc/it8620e/fan/0 0 3884 2385,159 2335,64 Fan #1 /lpc/it8620e 6805950c-324c-4724-8f79-308e888c3472 Fan 2368,421
/ram/data/1 1 3866 1,99408 0,1628571 Available Memory /ram 6805950c-324c-4724-8f79-308e888c3472 Data 1,372272
/lpc/it8620e/voltage/8 8 3880 2,784 2,784 VBat /lpc/it8620e 6805950c-324c-4724-8f79-308e888c3472 Voltage 2,784
/lpc/it8620e/temperature/1 1 3882 55 38 Temperature #2 /lpc/it8620e 6805950c-324c-4724-8f79-308e888c3472 Temperature 43
/lpc/it8620e/temperature/0 0 3881 34 33 Temperature #1 /lpc/it8620e 6805950c-324c-4724-8f79-308e888c3472 Temperature 33
/hdd/0/load/0 0 3870 39,86851 39,85644 Used Space /hdd/0 6805950c-324c-4724-8f79-308e888c3472 Load 39,86786
/lpc/it8620e/voltage/2 2 3874 2,052 2,04 Voltage #3 /lpc/it8620e 6805950c-324c-4724-8f79-308e888c3472 Voltage 2,04
/amdcpu/0/load/1 1 3844 100 3,125 CPU Core #1 /amdcpu/0 6805950c-324c-4724-8f79-308e888c3472 Load 31,25
/amdcpu/0/clock/6 6 3858 4200,016 1400,004 CPU Core #6 /amdcpu/0 6805950c-324c-4724-8f79-308e888c3472 Clock 4100,015
/amdcpu/0/temperature/0 0 3861 52,75 32,5 Core #1 - #8 /amdcpu/0 6805950c-324c-4724-8f79-308e888c3472 Temperature 34,125
/amdcpu/0/load/5 5 3848 100 0 CPU Core #5 /amdcpu/0 6805950c-324c-4724-8f79-308e888c3472 Load 14,28571
/amdcpu/0/clock/7 7 3859 4200,016 1400,004 CPU Core #7 /amdcpu/0 6805950c-324c-4724-8f79-308e888c3472 Clock 4100,015
/amdcpu/0/load/6 6 3849 100 0 CPU Core #6 /amdcpu/0 6805950c-324c-4724-8f79-308e888c3472 Load 30,15873
/lpc/it8620e/voltage/7 7 3879 3,312 3,312 Standby +3.3V /lpc/it8620e 6805950c-324c-4724-8f79-308e888c3472 Voltage 3,312
/hdd/0/temperature/0 0 3869 31 29 Temperature /hdd/0 6805950c-324c-4724-8f79-308e888c3472 Temperature 30
/lpc/it8620e/temperature/2 2 3883 69 48 Temperature #3 /lpc/it8620e 6805950c-324c-4724-8f79-308e888c3472 Temperature 50
Столбцы
Identifier - путь до устройства датчика
Index - индекс повторяются
*InstanceId - идентификатор_экземпляра ИД
Max - максимальные значения
Min - минимальное значение
*Name - Имя датчика
Parent - родитель сокращенный (неполный путь) путь от Identifier
Processid - ИД Процесса
*SensorType - Вид датчика (Voltage Напряжение V;
Clock время MHz;
Load загрузка %;
Data Данные GB;
Control управление %,
Fan вентилятор RPM;
Temperature температура C
*Value - показатели значения
[key] string ProcessId;
[key] string InstanceId;
string SensorType;
string Identifier;
string Parent;
string Name;
real32 Value;
real32 Min;
real32 Max;
sint32 Index;
Нам надо для заббикса
Имя: Датчик $SensorType $Name
Единица измерения: $SensorTyp
Новая группа элементов данных: $SensorTyp
zabbix_get -s IP-Хоста -k system.run["WMIC.exe /NAMESPACE:\\\root\OpenHardwareMonitor PATH Sensor"]
Запрос всей таблицы датчиков (сенсоров)
WMIC.exe /NAMESPACE:\\root\OpenHardwareMonitor PATH Sensor
Запрос железа
WMIC.exe /NAMESPACE:\\root\OpenHardwareMonitor PATH Hardware
CMD
В индификатор можно подставить данные из первого столбца а ответ мы хотим из 2х столбцов
WMIC /NAMESPACE:\\root\OpenHardwareMonitor PATH Sensor WHERE "Identifier='/amdcpu/0/temperature/0'" GET Max, Min
Max Min
56,75 31,75
Получаем имя датчика для ИД 3882
WMIC.exe /NAMESPACE:\\root\OpenHardwareMonitor PATH Sensor WHERE "InstanceId='3882'" GET Name
Name
Temperature #2
Получаем категорию/группу датчиков для ИД 3882
WMIC.exe /NAMESPACE:\\root\OpenHardwareMonitor PATH Sensor WHERE "InstanceId='3882'" GET SensorType
SensorType
Temperature
Сюда подставить ID 3882 датчика и получим значение из последнего столбца
WMIC /NAMESPACE:\\root\OpenHardwareMonitor PATH Sensor WHERE "InstanceId='3882'" GET Value
Value
49
Запросы из терминала Linux на заббикс сервере через команду zabbix_get -s
Запрос всей таблицы (где есть кавычки " ставим до слешь \)
zabbix_get -s 172.16.121.7 -k system.run["WMIC.exe /NAMESPACE:\\\root\OpenHardwareMonitor PATH Sensor"]
Запрос железа
zabbix_get -s 172.16.121.7 -k system.run["WMIC.exe /NAMESPACE:\\\root\OpenHardwareMonitor PATH Hardware"]
Пример как будет выглядеть элемент узла запрос для id датчика 3882
zabbix_get -s 172.16.121.7 -p 10050 -k system.run['WMIC /NAMESPACE:\\root\OpenHardwareMonitor PATH Sensor WHERE "InstanceId='3882'" GET Value']
Ответ надо сделать пред обработку (обрезать слева Value) и останется ток значение
Value
43
Получаем число без обрезки Шаблоне нужно выбрать с плавающей точкой, иначе длинные числа выходят как строка если выбрать целое положительное значение
root@ZABBIXSERVER:~# zabbix_get -s 172.16.121.7 -p 10050 -k wmi.get["root\OpenHardwareMonitor","SELECT Value FROM Sensor WHERE "InstanceId='3882'""]
45.000000
Специфичные ключи элементов данных для Windows
Пример запроса из стандартных средств производитель материнки
root@ZABBIXSERVER:~# zabbix_get -s 172.16.121.7 -p 10050 -k wmi.get["root\cimv2","SELECT Vendor FROM Win32_ComputerSystemProduct"]
Gigabyte Technology Co., Ltd.
Элемент для шаблона заббикс
Рабочий
wmi.get[root\OpenHardwareMonitor,SELECT Value FROM Sensor WHERE InstanceId=3882]
Имя Датчик {#SENSORTYPE} Имя {#NAME} ИД {#ID}
Тип Zabbix agent
Ключ wmi.get[root\OpenHardwareMonitor,SELECT Value FROM Sensor WHERE InstanceId={#ID}]
Тип Информации Числовой с плавающей точкой
Единица измерения {#SENSORTYPE} интервал обновления 300
Было бы не плохо присвоить группы из переменой {#SENSORTYPE} но нет переменные для групп не работают
Элемент тестовый не работает в шаблоне
WMIC.exe["/NAMESPACE:\\\root\OpenHardwareMonitor PATH Sensor WHERE \"InstanceId=3882\" GET Value"]
WMIC.exe["/NAMESPACE:\\\root\OpenHardwareMonitor PATH Sensor WHERE \"InstanceId={#InstanceId}\" GET Value"]
чтобы прошли кавычки " в команду, надо их передать со слешем \" вот так, иначе они экранируют строку от пробелов
Сделать предобработку убрав слово Value и переход на новую строку \n чтобы получить значение
powershell
get-wmiobject msacpi_thermalzonetemperature -namespace "root/wmi"
так же можно скачать утилиту WMI Code Creator - утилита просмотра 900КБ
и просмотреть данные и составить команды
Можно конечно запрашивать данные напрямую без доп программ через wmic , но тогда команды будут разными, на разные группы элементов и разное железо или вообще в целом индивидуальные. Это не удобно тут же уже собрано все в одном месте в OpenHardwareMonitor в бесплатной с открытым исходном коде программке. Так же можете взять за образец и запилить скрипт по другую программку.
Пример прямой команды wmic /namespace:\\root\wmi PATH MSAcpi_ThermalZoneTemperature get CurrentTemperature
В 2х статьях ниже можно посмотреть как сделать openhardwaremonito в виде службы, в первом подробно во вторам само ставится скриптом.
Изначально было сделано и остается мониторинг через эту же утилиту но скрипт лежит на узле и работает при помощи powershell Спасибо данному разработчику данной статьи Zabbix: LLD-мониторинг железа под Windows на PowerShell
Так же написан скрипт который уже сам все ставить для powershell остается только раскомментировать датчики убрав в именах # данной программки Установка Агента Zabbix + Аппаратное обеспечение Windows
Захотелось сделать без использования powershell на основе cmd и скриптов на самом узле упростить в некотором роде задачу по сбору температуры в основном и других доп данных (хотя некоторые уже и так с агента известны например по загрузке проца и оперативки)
Что мы хотим получить:?
Самое главное это 3 столбец с ID (InstanceId) с помощь его мы сможем узнать напрямую одной командой значение Value
Далее мы же хотим знать к какой группе относится датчик и что это за датчик? Для этого используем предпоследний столбец 9 SensorType
Последний параметр Хотим знать имя датчика, а то данные есть, а откуда они что за датчик это у нас 6 столбец Name
Проблемы которые мы получаем в том что таблица состоит из пробелов без табуляции и это пол беды вся проблема в 6 столбце Name так как в именах есть пробелы и awk думает что это следующий столбец
На выходе из таблицы мы должны получить следующий вид результата например для узла 172.16.121.7
Запускаем скрипт ./OHM.sh 172.16.121.7 discovery Или можно включить фильтрацию по решетке если решетка есть в имени (строке данную строку пропускаем для этого в скрипте нужно закоментировать одну строку и раскоментировать другую!
#obrtabl=$(echo "${get}" 2>/dev/null|awk NR\>1|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3" "$6" "$9}')
obrtabl=$(echo "${get}" 2>/dev/null|awk NR\>1|sed -E '/#/d'|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3" "$6" "$9}')
Использована команда |sed -E '/#/d' - которая пропускает все строки с # и не выводит их # А если нужно выбрать только строки с определеными параметрами например температуру напряжение
obrtabl=$(echo "${get}" 2>/dev/null|awk NR\>1|grep -E 'Temperature|Voltage'|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3" "$6" "$9}')
Использована команда |grep -E 'Temperature|Voltage'| - пишите сюда какие строки нужно оставить с каким содержанием слова Нам нужно получить данные следующего вида из скрипта
Подробнее о Низкоуровневое обнаружение (LLD)
{"{#INSTANCEID}":"3872", "{#NAME}":"Voltage #1", "{#SENSORTYPE}":"Voltage"},
{"{#INSTANCEID}":"3854", "{#NAME}":"CPU Core #2", "{#SENSORTYPE}":"Clock"},
{"{#INSTANCEID}":"3864", "{#NAME}":"Memory", "{#SENSORTYPE}":"Load"},
{"{#INSTANCEID}":"3855", "{#NAME}":"CPU Core #3", "{#SENSORTYPE}":"Clock"},
{"{#INSTANCEID}":"3845", "{#NAME}":"CPU Core #2", "{#SENSORTYPE}":"Load"},
{"{#INSTANCEID}":"3875", "{#NAME}":"Voltage #4", "{#SENSORTYPE}":"Voltage"},
{"{#INSTANCEID}":"3865", "{#NAME}":"Used Memory", "{#SENSORTYPE}":"Data"},
{"{#INSTANCEID}":"3878", "{#NAME}":"Voltage #7", "{#SENSORTYPE}":"Voltage"},
{"{#INSTANCEID}":"3876", "{#NAME}":"Voltage #5", "{#SENSORTYPE}":"Voltage"},
{"{#INSTANCEID}":"3850", "{#NAME}":"CPU Core #7", "{#SENSORTYPE}":"Load"},
{"{#INSTANCEID}":"3840", "{#NAME}":"Fan Control #1", "{#SENSORTYPE}":"Control"},
{"{#INSTANCEID}":"3851", "{#NAME}":"CPU Core #8", "{#SENSORTYPE}":"Load"},
{"{#INSTANCEID}":"3860", "{#NAME}":"CPU Core #8", "{#SENSORTYPE}":"Clock"},
{"{#INSTANCEID}":"3856", "{#NAME}":"CPU Core #4", "{#SENSORTYPE}":"Clock"},
{"{#INSTANCEID}":"3846", "{#NAME}":"CPU Core #3", "{#SENSORTYPE}":"Load"},
{"{#INSTANCEID}":"3857", "{#NAME}":"CPU Core #5", "{#SENSORTYPE}":"Clock"},
{"{#INSTANCEID}":"3847", "{#NAME}":"CPU Core #4", "{#SENSORTYPE}":"Load"},
{"{#INSTANCEID}":"3877", "{#NAME}":"Voltage #6", "{#SENSORTYPE}":"Voltage"},
{"{#INSTANCEID}":"3852", "{#NAME}":"CPU Total", "{#SENSORTYPE}":"Load"},
{"{#INSTANCEID}":"3842", "{#NAME}":"Fan Control #3", "{#SENSORTYPE}":"Control"},
{"{#INSTANCEID}":"3853", "{#NAME}":"CPU Core #1", "{#SENSORTYPE}":"Clock"},
{"{#INSTANCEID}":"3862", "{#NAME}":"Bus Speed", "{#SENSORTYPE}":"Clock"},
{"{#INSTANCEID}":"3873", "{#NAME}":"Voltage #2", "{#SENSORTYPE}":"Voltage"},
{"{#INSTANCEID}":"3841", "{#NAME}":"Fan Control #2", "{#SENSORTYPE}":"Control"},
{"{#INSTANCEID}":"3884", "{#NAME}":"Fan #1", "{#SENSORTYPE}":"Fan"},
{"{#INSTANCEID}":"3866", "{#NAME}":"Available Memory Data", "{#SENSORTYPE}":"Data"},
{"{#INSTANCEID}":"3880", "{#NAME}":"VBat", "{#SENSORTYPE}":"Voltage"},
{"{#INSTANCEID}":"3882", "{#NAME}":"Temperature #2", "{#SENSORTYPE}":"Temperature"},
{"{#INSTANCEID}":"3881", "{#NAME}":"Temperature #1", "{#SENSORTYPE}":"Temperature"},
{"{#INSTANCEID}":"3870", "{#NAME}":"Used Space", "{#SENSORTYPE}":"Load"},
{"{#INSTANCEID}":"3874", "{#NAME}":"Voltage #3", "{#SENSORTYPE}":"Voltage"},
{"{#INSTANCEID}":"3844", "{#NAME}":"CPU Core #1", "{#SENSORTYPE}":"Load"},
{"{#INSTANCEID}":"3858", "{#NAME}":"CPU Core #6", "{#SENSORTYPE}":"Clock"},
{"{#INSTANCEID}":"3861", "{#NAME}":"Core #1 - #8", "{#SENSORTYPE}":"Temperature"},
{"{#INSTANCEID}":"3848", "{#NAME}":"CPU Core #5", "{#SENSORTYPE}":"Load"},
{"{#INSTANCEID}":"3859", "{#NAME}":"CPU Core #7", "{#SENSORTYPE}":"Clock"},
{"{#INSTANCEID}":"3849", "{#NAME}":"CPU Core #6", "{#SENSORTYPE}":"Load"},
{"{#INSTANCEID}":"3879", "{#NAME}":"Standby +3.3V", "{#SENSORTYPE}":"Voltage"},
{"{#INSTANCEID}":"3869", "{#NAME}":"Temperature", "{#SENSORTYPE}":"Temperature"},
{"{#INSTANCEID}":"3883", "{#NAME}":"Temperature #3", "{#SENSORTYPE}":"Temperature"}
]}
Небольшое отличие 3 версии от 4 в примерах но это не суть Пример для одной строки данных можно Важно переменная прописывается заглавными буквами иначе Заббикс сервер не примет
{"data":[
{"{#ИМЯ ПЕРЕМЕННОЙ}":"Данные переменной", "{#NAME}":"Voltage #1", "{#SENSORTYPE}":"Voltage"}
]}
или можно так для одной переменной с данными
{"data":[
{"{#ИМЯ ПЕРЕМЕННОЙ}":"Данные переменной"}
]}
Первая Версия Скрипта OHM.sh
Плюсы + данной версии
1 раз делаем запрос на хост получаем всю таблицу
Делаем сразу обработку оставляя 3 нужных нам столбца
В цикл уже для построчной обработки нам попадает всего 3 столбца (массив данных меньше проще обрабатывать)
Минус -
Нельзя допускать более одного пробела в имени датчика! Если будет 2 пробела в имени датчика сместится последний 9 столбец т е это будет 8 или 7 и в 6 столбце будет не полное имя. (Почему так потому что между 2 таблицами как раз таки есть только 2 пробела Index InstanceId Max и если настроить параметр скрипта чтоб он начинал учитывать от 3х пробелов столбцы эти 2 столбца вылетают поэтому тут заданно от 2х пробелов sed -E 's/ (
Почему нельзя сделать так запросить предпоследний столбец через $(NF-1) (можно 9 так $(NF-2)но последняя строка, с таблицы работает не так как надо т е когда делаем табуляцию добавляется еще что то в конец таблицы и выходит не NF-1 ,а NF-2. А на последней строке этого нет и для нее надо NF-1)
Так что не делайте по 2 пробела в имени и у вас все будет Хорошо с этим скриптом)))
Так же нельзя использовать переменную для групп все датчики попадают в одну группу
Триггер придется создавать вручную для элементов или сделать получать только температурные датчики и задать триггер, но для меня это не удобно так как тут и проц каждое ядро и материнка и жесткий. Я делаю вручную все ядра температуры в один триггер и если хотя один превысит сработает триггер всего один. По графикам та же ситуация либо на каждый элемент авто создание либо вручную на группу элементов.
При копирования скрипта проверить 2 пробела 's/ (
#2019/11/28 v1.0
#При работе скрипта вся нагрузка выполнения ложится на ресурсы железа Заббикс Сервера!
#Скрипт мониторинга для OpenHardwareMonitor с LLD для Zabbix (серверный вариант)
# Автор Мамзиков Артём Андреевич Описание по скрипту Скрипт + Шаблон для Windows LLD Open Hardware Monitor
#Автообнаружение параметров из OpenHardwareMonitor
#Ключ: discovery , info
# $1 - это IP и порт узла подключаемого агента
# $2 - Поиск элементов вывод JSON data, info
IFS=$'\n'
JSON="{\"data\":["
SEP=""
if [[ $2 = "discovery" ]]
then
get=`zabbix_get -s $1 -k system.run["WMIC.exe /NAMESPACE:\\\\\root\OpenHardwareMonitor PATH Sensor"]`
# если требуется включение " двойных кавычек, то они должны быть экранированы обратной наклонной чертой \ потому так много слешей верху нужно по сути 2
# Запуск переменной get команды OpenHardwareMonitor
# Если ошибка в черную дыру | удаление первой строки шапки таблицы | Поиск строк более чем 2 пробела, за которой следовал не пробел,
# добавил разделители табуляции, обработка первой строки данных | вывод 3 6 и 9 (можно 9 так $(NF-2)но последняя строка с таблицы работает не так как надо) стoлбцов
obrtabl=$(echo "${get}" 2>/dev/null|awk NR\>1|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3" "$6" "$9}')
# Если нужно не выводить поиск элементов в которых именах присутствует # раскомментировать строку ниже, а выше закомментировать
#obrtabl=$(echo "${get}" 2>/dev/null|awk NR\>1|sed -E '/#/d'|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3" "$6" "$9}')
# А если нужно выбрать только строки с определеными параметрами например температуру напряжение
obrtabl=$(echo "${get}" 2>/dev/null|awk NR\>1|grep -E 'Temperature|Voltage'|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3" "$6" "$9}')
#Вывод для тестов настроек
#echo "${get}"
#echo "${obrtabl}"
fi
for element in $(echo "${obrtabl}" 2>/dev/null);
# 1 шаг Перебор строк в таблице в переменную element если ошибка отправка в черную дыру
do
# 2 шаг каждый столбец идет для своей переменной
# Получаем Идентифика́торы номера ID датчиков первый столбец
InstanceId=`echo "${element}"|awk '{print $1}'`
# Получаем имена датчиков средний 2 столбец самый муторный из-за пробелов)
Name=$(echo "${element}"|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $2}'|sed 's/[ \t]*$//')
# Получаем категорию/группу датчиков последний столбец
SensorType=`echo "${element}" |awk '{print $(NF)}'`
JSON=$JSON"$SEP\n{\"{#ID}\":\"$InstanceId\", \"{#NAME}\":\"$Name\", \"{#SENSORTYPE}\":\"$SensorType\"}"
SEP=", "
done
# Выводим результат в json data
JSON=$JSON"\n]}"
echo -e $JSON
# Получение полной информации всей таблицы ./OHM.sh[{HOST.CONN},info] смысла в этом особого нет конечно, так как данные постоянно меняются смысл например запрашивать раз в сутки весь листинг но пусть будет)
#else
if [[ $2 = "info" ]]
then
get=`zabbix_get -s $1 -k system.run["WMIC.exe /NAMESPACE:\\\\\root\OpenHardwareMonitor PATH Sensor"]`
for out in $get
do
echo "${out}"
done
#elif [[ $2 = "maxtemp" ]]
#then
#get1= запрос с фильтраций только температура
#maxc= выбор максимального значения по температуре
#for out in $maxc
#do
#do
#echo $out
#done
fi
сделано так get=`zabbix_get -s $1 -k system.run["WMIC.exe /NAMESPACE:\\\\\root\OpenHardwareMonitor PATH Sensor"]`
Далее проблема с обработкой таблицы 6 столбца
$(echo "${get}" 2>/dev/null|awk NR\>1|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3" "$6" "$9}')
Если на get в ответ пришло 2 ошибка то 2>/dev/null все черную дыру) дальше ничего не делаем, если все гуд то
awk NR\>1 - удаляем первую строку шапку таблицы наименование столбцов
sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;' | cat -vt - Поиск строк более чем 2 пробела, за которой следовал не пробел, добавил разделители табуляции, обработка первой строки данных Подсмотрено тут
с включеной -e опции
sed 's/было/стало/g' преобразование текста
s/ - тут 2 пробела
/t - горизонтальная табуляция;
подсмотрено тут)
|awk -F\\t '{print $3" "$6" "$9}' -Вывод 3 6 и 9 таблицы
Почему нельзя сделать так запросить предпоследний столбец через $(NF-1) (можно 9 так $(NF-2)но последняя строка, с таблицы работает не так как надо т е когда делаем табуляцию добавляется еще что то в конец таблицы и выходит не NF-1 ,а NF-2. А на последней строке этого нет и для нее надо NF-1)
$(NF) - последний столбец $(NF-1) - предпоследний и т.д.
Так же была попытка сделать так жестко задать ширину столбцов Обратите внимание на 2 пробела между 2 таблицами!
Identifier Index InstanceId Max Min Name Parent ProcessId SensorType Value
10 + 18 5 + 2 10+2 3 + 7 3+8 4+14 6 +8 9+29 10+3 5+3?
Ширина столбов с пробелами
1 28 символов
2 7 символов
3 12 символов
4 10 символов
5 11 символов
6 18 символов
7 14 символов
8 38 символов
9 13 символов
10 8 символов
get1=$(echo "${get}" 2>/dev/null|awk NR\>1|awk 'BEGIN{FIELDWIDTHS="28 7 12 10 11 18 14 38 13 8"}{print $3" "$6" "$9}')
Но как показала практика опять же 6 столбец отличается в ширине где имя длине столбец расширяется и жестко заданные поля уже не подходят(
Далее вариант был а не расчитать ли ширину каждого столбца с пробелами для каждого хоста индивидуально и передать переменными
#awk NR==1|awk '{print $1}'|wc -m)
#kss=$ awk '{print $1" "$2" "length() }') "$1" "$2" "$3" "$4" "$5" "$6" "$7" "$8" "$9" "$10"
#get1=$(echo "${get}" 2>/dev/null|awk NR\>1|awk 'BEGIN{FIELDWIDTHS="$kss"}{print $3" "$6" "$9}')
Но тут получилось высчитать число символов все строки, число текста все строки без пробелов, число названия одной какой то таблицы но чтоб посчитать каждый столбец с пробелами ширину нет.
Можно было попробовать узнать пробелы после имен таблиц высчитать пробелы сложить их с длиной имен получить ширину столбцов циклами но слишком много операция ради такого действия.
Вообщем пришли к такому решению описанному выше
$(echo "${get}" 2>/dev/null|awk NR\>1|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3" "$6" "$9}')
Далее запускается цикл for обработки построчно и передачу в переменные и формирование общей data
fi
for element in $(echo "${obrtabl}" 2>/dev/null);
# 1шаг Перебор строк в таблице в переменную element если ошибка отправка в черную дыру
do
# 2шаг каждый столбец идет для своей переменной
# Получаем Индифиционные номера ID датчиков первый столбец
InstanceId=`echo "${element}"|awk '{print $1}'`
# Получаем имена датчиков средний 2 столбец самый муторный из-за пробелов)
Name=$(echo "${element}"|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $2}'sed '|s/[ \t]*$//')
sed 's/[ \t]*$//' -Удалить все пробелы и символы табуляции в конце каждой строки файла (смотрите примечание по табуляции в конце документа) или можно убрать все пробелы удалить в имени все слитно будет tr -d ' '
разные примеры команд
# Получаем категорию/группу датчиков последний столбец
SensorType=`echo "${element}" |awk '{print $(NF)}'`
JSON=$JSON"$SEP{\"{#InstanceId}\":\"$InstanceId\", \"{#Name}\":\"$Name\", \"{#SensorType}\":\"$SensorType\"}"
SEP=", "
done
# Выводим результат в json data
JSON=$JSON"]}"
echo $JSON
Не создавались элементы писал что уже существует не шли переменные хотя вроде data выходила нормальной оказалось бонально
Cannot create item: item already exists
Надо было заглавными
Было JSON=$JSON"$SEP\n{\"{#InstanceId}\":\"$InstanceId\", \"{#Name}\":\"$Name\", \"{#SensorType}\":\"$SensorType\"}"
стало JSON=$JSON"$SEP\n{\"{#ID}\":\"$InstanceId\", \"{#NAME}\":\"$Name\", \"{#SENSORTYPE}\":\"$SensorType\"}"
В элементе wmi.get[root\OpenHardwareMonitor,SELECT Value FROM Sensor WHERE InstanceId={#ID}]
Было выставлено целое положительно число заработали не все элементы, выдало что строка, где длинное значение вылечилось значение с плавающей точкой.
Скрипт V 2.0
#2019/11/28 v2.0
#При работе скрипта вся нагрузка выполнения ложится на ресурсы железа Заббикс Сервера!
#Скрипт мониторинга для OpenHardwareMonitor с LLD для Zabbix (серверный вариант)
#Автообнаружение параметров из OpenHardwareMonitor
#Ключ: discovery
# $1 - это IP и порт узла подключаемого агента
# $2 - Поиск элементов вывод JSON data, info
IFS=$'\n'
JSON="{\"data\":["
SEP=""
if [[ $2 = "discovery" ]]
then
get=`zabbix_get -s $1 -k system.run["WMIC.exe /NAMESPACE:\\\\\root\OpenHardwareMonitor PATH Sensor"]`
# если требуется включение " двойных кавычек, то они должны быть экранированы обратной наклонной чертой \ потому так много слешей верху нужно по сути 2
# Запуск переменной get команды OpenHardwareMonitor
# Если ошибка в черную дыру | удаление первой строки шапки таблицы | Оставляем только 3 таблицу с ID InstanceId
obrtabl=$(echo "${get}" 2>/dev/null|awk NR\>1|awk '{print $3}')
# Если нужно не выводить поиск элементов в которых именах присутствует # раскомментировать строку ниже, а выше закомментировать
#obrtabl=$(echo "${get}" 2>/dev/null|awk NR\>1|awk '{print $3}')
#Вывод для тестов настроек
#echo "${get}"
#echo "${obrtabl}"
fi
for element in $(echo "${obrtabl}" 2>/dev/null);
# 1 шаг Перебор строк в таблице в переменную element если ошибка отправка в черную дыру
do
# 2 шаг для каждого ID элемента запрашиваем имя и категорию
# Получаем Идентифика́торы номера ID датчиков первый столбец
InstanceId=`echo "${element}"|awk '{print $1}'`
# Получаем имена датчиков
Name=`zabbix_get -s $1 -k system.run["WMIC.exe /NAMESPACE:\\\\\root\OpenHardwareMonitor PATH Sensor WHERE "InstanceId=${InstanceId}" GET Name"]`
# Получаем категорию/группу датчиков
SensorType=`zabbix_get -s $1 -k system.run["WMIC.exe /NAMESPACE:\\\\\root\OpenHardwareMonitor PATH Sensor WHERE "InstanceId=${InstanceId}" GET SensorType"]`
JSON=$JSON"$SEP{\"{#InstanceId}\":\"$InstanceId\", \"{#Name}\":\"$Name\", \"{#SensorType}\":\"$SensorType\"}"
SEP=", "
done
# Выводим результат в json data
JSON=$JSON"]}"
echo $JSON
# Получение полной информации всей таблицы ./OHM.sh[{HOST.CONN},info] смысла в этом особого нет конечно, так как данные постоянно меняются смысл например за$
#else
#if [[ $2 = "info" ]]
#then
#get=`zabbix_get -s $1 -k system.run["WMIC.exe /NAMESPACE:\\\\\root\OpenHardwareMonitor PATH Sensor"]`
#for out in $get
#do
#echo "${out}"
#done
#elif [[ $2 = "maxtemp" ]]
#then
#get1=
#maxc=
#for out in $maxc
#do
#do
#echo $out
#done
#fi
Тут мы получим Имена: Тип оборудования и Имя оборудования будет более понятно в элементе что есть что но понятно это дает немного нагрузки на доп обработку скриптом тут уже вам решать использовать V1.0 или V3.0
Используются обе таблицы Sensor (как в скрипте V1.0) и добавлена 2 таблица Hardware
В начале скрипта запрашиваем обе таблицы, Hardware обрабатываем и оставляем 1 2 4 столбцы.
Далее будем сравнивать из 1 таблицы Sensor Столбец Parent , а во 2 таблице Hardware столбец Identifier
В цикл добавляем из первой таблицы Sensor Столбец Parent
Далее в цикл
добавляем вывод 2 таблицы Hardware в ней ищем строки содержащие $Parent и оставляем 1 столбец
так же делаем для (4) в нашем же случае это 3 столбец он же последний, он содержит пробелы в именах по этому делаем не учитывать один пробел все аналогично первому столбцу.
#2019/12/03 v3.0
#При работе скрипта вся нагрузка выполнения ложится на ресурсы железа Заббикс Сервера!
#Скрипт мониторинга для OpenHardwareMonitor с LLD для Zabbix (серверный вариант)
# Автор Мамзиков Артём Андреевич Описание по скрипту Скрипт + Шаблон для Windows LLD Open Hardware Monitor
#Автообнаружение параметров из OpenHardwareMonitor
#Ключ: discovery , info
# $1 - это IP и порт узла подключаемого агента
# $2 - Поиск элементов вывод JSON data, info
IFS=$'\n'
JSON="{\"data\":["
SEP=""
if [[ $2 = "discovery" ]]
then
get=`zabbix_get -s $1 -k system.run["WMIC.exe /NAMESPACE:\\\\\root\OpenHardwareMonitor PATH Sensor"]`
# если требуется включение " двойных кавычек, то они должны быть экранированы обратной наклонной чертой \ потому так много слешей верху нужно по сути 2
# Запуск переменной get команды OpenHardwareMonitor
# Запрос имен и типа железа
gethd=`zabbix_get -s $1 -k system.run["WMIC.exe /NAMESPACE:\\\\\root\OpenHardwareMonitor PATH Hardware"]`
# Оставляем нужные нам слобцы по железу (делаем между ними 2 пробела)
obrtablhd=$(echo "${gethd}" 2>/dev/null|awk NR\>1|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $1" "$2" "$4}')
# Если ошибка в черную дыру | удаление первой строки шапки таблицы | Поиск строк более чем 2 пробела, за которой следовал не пробел,
# добавил разделители табуляции, обработка первой строки данных | вывод 3 6 и 9 (можно 9 так $(NF-2)но последняя строка с таблицы работает не так как надо) стoлбцов
obrtabl=$(echo "${get}" 2>/dev/null|awk NR\>1|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3" "$6" "$7" "$9}')
# Если нужно не выводить поиск элементов в которых именах присутствует # раскомментировать строку ниже, а выше закомментировать
#obrtabl=$(echo "${get}" 2>/dev/null|awk NR\>1|sed -E '/#/d'|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3" "$6" "$7" "$9}')
# А если нужно выбрать только строки с определеными параметрами например температуру напряжение
#obrtabl=$(echo "${get}" 2>/dev/null|awk NR\>1|grep -E 'Temperature|Voltage'|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3" "$6" "$7" "$9}')
#Вывод для тестов настроек
#echo "${get}"
#echo "${obrtabl}"
#echo "${obrtablhd}"
fi
for element in $(echo "${obrtabl}" 2>/dev/null);
# 1 шаг Перебор строк в таблице в переменную element если ошибка отправка в черную дыру
do
# 2 шаг каждый столбец идет для своей переменной
# Получаем Идентифика́торы номера ID датчиков первый столбец
InstanceId=`echo "${element}"|awk '{print $1}'`
# Получаем имена датчиков средний 2 столбец самый муторный из-за пробелов)
Name=$(echo "${element}"|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $2}'|sed 's/[ \t]*$//')
# Получаем категорию/группу датчиков последний столбец
SensorType=`echo "${element}" |awk '{print $(NF)}'`
# Получаем Parent для подстановки имен железа
Parent=`echo "${element}"|awk '{print $(NF-1)}'`
# Получаем Тип оборудования
HardwareType=`echo "${obrtablhd}"|grep -E "${Parent}"|awk '{print $1}'`
# Получаем имя железа (NF или $3)
Namehd=$(echo "${obrtablhd}"|grep -E "${Parent}"|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $(NF)}'|sed 's/[ \t]*$//')
JSON=$JSON"$SEP\n{\"{#ID}\":\"$InstanceId\", \"{#NAME}\":\"$Name\", \"{#SENSORTYPE}\":\"$SensorType\", \"{#HARDTYPE}\":\"$HardwareType\", \"{#HARDNAME}\":\"$Namehd\"}"
SEP=", "
done
# Выводим результат в json data
JSON=$JSON"\n]}"
echo -e $JSON
# Получение полной информации всей таблицы ./OHM.sh[{HOST.CONN},info] смысла в этом особого нет конечно, так как данные постоянно меняются смысл например запрашивать раз в сутки весь листинг но пусть будет)
#else
if [[ $2 = "info" ]]
then
get=`zabbix_get -s $1 -k system.run["WMIC.exe /NAMESPACE:\\\\\root\OpenHardwareMonitor PATH Sensor"]`
for out in $get
do
echo "${out}"
done
#elif [[ $2 = "maxtemp" ]]
#then
#get1= запрос с фильтраций только температура
#maxc= выбор максимального значения по температуре
#for out in $maxc
#do
#do
#echo $out
#done
fi
# Запрос имен и типа железа таблицы
gethd=`zabbix_get -s $1 -k system.run["WMIC.exe /NAMESPACE:\\\\\root\OpenHardwareMonitor PATH Hardware"]`
# Оставляем нужные нам слобцы 1 2 и 4 по железу (делаем между ними 2 пробела)
obrtablhd=$(echo "${gethd}" 2>/dev/null|awk NR\>1|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $1" "$2" "$4}')
переменая = выводим таблица железом еасли ошибка в черную дыру | вырезаем шапку таблицы |учтываем столбцы от 2х пробелов делаем табуляцию | выводим 1 2 и 4 столбец
Дальше уже учитаваем их как 1 2 и 3 столбец
Добавляем 7 столбец в вывод сенсора
obrtabl=$(echo "${get}" 2>/dev/null|awk NR\>1|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3" "$6" "$7" "$9}')
Добавляем в цикл for
# Получаем Parent для подстановки имен железа
Parent=`echo "${element}"|awk '{print $(NF-1)}'` выводим предпоследний $7 столбец построчно
и для второй таблицы
# Получаем Тип оборудования
HardwareType=`echo "${obrtablhd}"|grep -E "${Parent}"|awk '{print $1}'`
Переменая = вывод 2 таблицы железа 3х столбцов | поиск строк содержащие данные из 7 столбца совпали | выводим построчно 1 столбец 2 таблицы железа
# Получаем имя железа (NF или $3)
Namehd=$(echo "${obrtablhd}"|grep -E "${Parent}"|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $(NF)}'|sed 's/[ \t]*$//')
Переменая = вывод 2 таблицы железа 3х столбцов | поиск строк содержащие данные из 7 столбца совпали |добавляем табуляцию для структуры таблицы так как в столбце в именах есть пробелы учитываем для таблицы от 2х пробелов | выводим построчно 3 последний столбец 2 таблицы железа
Добавляем элементы вывод
JSON=$JSON"$SEP\n{\"{#ID}\":\"$InstanceId\", \"{#NAME}\":\"$Name\", \"{#SENSORTYPE}\":\"$SensorType\", \"{#HARDTYPE}\":\"$HardwareType\", \"{#HARDNAME}\":\"$Namehd\"}"
Все остальное идентично скрипту V1.0
Скрипт версии 3.1 Добавлено унаследовать родитель для датчиков если он есть
#2019/12/04 v3.1
#При работе скрипта вся нагрузка выполнения ложится на ресурсы железа Заббикс Сервера!
#Скрипт мониторинга для OpenHardwareMonitor с LLD для Zabbix (серверный вариант)
# Автор Мамзиков Артём Андреевич Описание по скрипту Скрипт + Шаблон для Windows LLD Open Hardware Monitor
#Автообнаружение параметров из OpenHardwareMonitor
#Ключ: discovery , info
# $1 - это IP и порт узла подключаемого агента
# $2 - Поиск элементов вывод JSON data, info
IFS=$'\n'
JSON="{\"data\":["
SEP=""
if [[ $2 = "discovery" ]]
then
get=`zabbix_get -s $1 -k system.run["WMIC.exe /NAMESPACE:\\\\\root\OpenHardwareMonitor PATH Sensor"]`
# если требуется включение " двойных кавычек, то они должны быть экранированы обратной наклонной чертой \ потому так много слешей верху нужно по сути 2
# Запуск переменной get команды OpenHardwareMonitor
# Запрос имен и типа железа
gethd=`zabbix_get -s $1 -k system.run["WMIC.exe /NAMESPACE:\\\\\root\OpenHardwareMonitor PATH Hardware"]`
# Оставляем нужные нам слобцы по железу (делаем между ними 2 пробела)
obrtablhd=$(echo "${gethd}" 2>/dev/null|awk NR\>1|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $1" "$2" "$4}')
# Выбираем родителя датчика который показывает параметры смотрим 2 и 5 таблицу
tablparent=$(echo "${gethd}" 2>/dev/null|awk NR\>1|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $2" "$5}')
# Если ошибка в черную дыру | удаление первой строки шапки таблицы | Поиск строк более чем 2 пробела, за которой следовал не пробел,
# добавил разделители табуляции, обработка первой строки данных | вывод 3 6 и 9 (можно 9 так $(NF-2)но последняя строка с таблицы работает не так как надо) стoлбцов
obrtabl=$(echo "${get}" 2>/dev/null|awk NR\>1|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3" "$6" "$7" "$9}')
# Если нужно не выводить поиск элементов в которых именах присутствует # раскомментировать строку ниже, а выше закомментировать
#obrtabl=$(echo "${get}" 2>/dev/null|awk NR\>1|sed -E '/#/d'|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3" "$6" "$7" "$9}')
# А если нужно выбрать только строки с определеными параметрами например температуру напряжение
#obrtabl=$(echo "${get}" 2>/dev/null|awk NR\>1|grep -E 'Temperature|Voltage'|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3" "$6" "$7" "$9}')
#Вывод для тестов настроек
#echo "${get}"
#echo "${obrtabl}"
#echo "${obrtablhd}"
fi
for element in $(echo "${obrtabl}" 2>/dev/null);
# 1 шаг Перебор строк в таблице в переменную element если ошибка отправка в черную дыру
do
# 2 шаг каждый столбец идет для своей переменной
# Получаем Идентифика́торы номера ID датчиков первый столбец
InstanceId=`echo "${element}"|awk '{print $1}'`
# Получаем имена датчиков средний 2 столбец самый муторный из-за пробелов)
Name=$(echo "${element}"|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $2}'|sed 's/[ \t]*$//')
# Получаем категорию/группу датчиков последний столбец
SensorType=`echo "${element}" |awk '{print $(NF)}'`
# Получаем Parent для подстановки имен железа
Parent=`echo "${element}"|awk '{print $(NF-1)}'`
# Получаем Тип оборудования
HardwareType=`echo "${obrtablhd}"|grep -E "${Parent}"|awk '{print $1}'`
# Получаем имя железа (NF или $3)
Namehd=$(echo "${obrtablhd}"|grep -E "${Parent}"|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $(NF)}'|sed 's/[ \t]*$//')
# Выявляем родителя чипа датчиков если он есть
# Берем со 2 таблицы 2 и 4 столбец (хотя в 4 попадет 5) в сравнении со столбцом-7 1-таблицы получаем ответ 4 столбца 2 таблицы
sopost=`echo "${tablparent}"|grep -E "${Parent}"|awk '{print $2}'`
# Во второй таблице ищем соответсвие к имени из параметра выше
roditel=$(echo "${obrtablhd}"|grep -E "${sopost}"|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $(NF)}'|sed 's/[ \t]*$//')
# Тип родителя
rodtip=`echo "${obrtablhd}"|grep -E "${sopost}"|awk '{print $1}'`
JSON=$JSON"$SEP\n{\"{#ID}\":\"$InstanceId\", \"{#NAME}\":\"$Name\", \"{#SENSORTYPE}\":\"$SensorType\", \"{#HARDTYPE}\":\"$HardwareType\", \"{#HARDNAME}\":\"$Namehd\", \"{#RODITEL}\":\"$roditel\", \"{#RODTIP}\":\"$rodtip\"}"
SEP=", "
done
# Выводим результат в json data
JSON=$JSON"\n]}"
echo -e $JSON
# Получение полной информации всей таблицы ./OHM.sh[{HOST.CONN},info] смысла в этом особого нет конечно, так как данные постоянно меняются смысл например запрашивать раз в сутки весь листинг но пусть будет)
#else
if [[ $2 = "info" ]]
then
get=`zabbix_get -s $1 -k system.run["WMIC.exe /NAMESPACE:\\\\\root\OpenHardwareMonitor PATH Sensor"]`
for out in $get
do
echo "${out}"
done
#elif [[ $2 = "maxtemp" ]]
#then
#get1= запрос с фильтраций только температура
#maxc= выбор максимального значения по температуре
#for out in $maxc
#do
#do
#echo $out
#done
fi
# Выбираем родителя датчика который показывает параметры смотрим 2 и 5 столбцы 2 таблицы железа
tablparent=$(echo "${gethd}" 2>/dev/null|awk NR\>1|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $2" "$5}')
В цикл добавлено
# Выявляем родителя чипа датчиков если он есть
# Берем со 2 таблицы 2 и 4 столбец (хотя в 4 попадет 5) в сравнении со столбцом-7 1-таблицы получаем ответ 4 столбца 2 таблицы
sopost=`echo "${tablparent}"|grep -E "${Parent}"|awk '{print $2}'`
# Во второй таблице ищем соответсвие к имени из параметра выше
roditel=$(echo "${obrtablhd}"|grep -E "${sopost}"|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $(NF)}'|sed 's/[ \t]*$//')
# Тип родителя
rodtip=`echo "${obrtablhd}"|grep -E "${sopost}"|awk '{print $1}'`
sopost= выводим 2 таблицу с железом 2 и 5 стобец, ищем стороки в цикле совпадающие с 1 таблицей 7 столбцом Parent и выводим совпадения столбца 2. Т.е. это 2 таблица железа столбец 5 (Parent) сюдаже попадет последний столбец если предыдущий пустой но это нам не мешает
roditel= выводим 2 таблица железа 1 2 и 4 столбец ищем там совпадения из sopost (это у нас таже таблица столбец Parent сам собой он совпасть не может так как 5 столбец не выводится) далее у нас в именах есть пробелы опять применяем табуляцию и найденые совпадения выводи послдений столбец это у нас Name таблицы железа обрезаем в конце пробел
rodtip= выводим 2 таблица железа 1 2 и 4 столбец ищем там совпадения из sopost (это у нас таже таблица столбец Parent сам собой он совпасть не может так как 5 столбец не выводится) и выводим совпадения показать 1 столбец таблицы 2 железа
Все это у нас в цикле перебирается для каждого ID первой таблицы
Ну и добавляем это все вывод Получаем более полную картину что от куда, но и нагрузка возрастает на обработку
JSON=$JSON"$SEP\n{\"{#ID}\":\"$InstanceId\", \"{#NAME}\":\"$Name\", \"{#SENSORTYPE}\":\"$SensorType\", \"{#HARDTYPE}\":\"$HardwareType\", \"{#HARDNAME}\":\"$Namehd\", \"{#RODITEL}\":\"$roditel\", \"{#RODTIP}\":\"$rodtip\"}"
возможно это был глюк один номер id на 2 проца но разные ид процесса сейчас уже все отображается корректно но зависимость добавлена на такой случай. Изменения в шаблоне 03.2020 добавлено прототип группы в прототипе элемента