Скрипт + Шаблон для Windows LLD Hardware Monitor

Мониторинг Железа
Датчики температур
Кулера
Диски
Напряжение
и т.д.
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 367
Стаж: 2 года 9 месяцев
Откуда: Вологодская область
Контактная информация:

Скрипт + Шаблон для Windows LLD Hardware Monitor

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

Аппаратное обеспечение LLD V3.5 PORT Windows HardwareMonitor
С помощью утилит OpenHardwareMonitor, LibreHardwareMonitor, hwmonitor (Либо аналогичных программ) какой-то одной или сразу несколько

В предыдущий ветке для 1 программы, более подробно как работает и т.д. Скрипт + Шаблон для Windows LLD Open Hardware Monitor
Изменения:
V3.0 Добавлена информация о железе
V3.1 Добавлено унаследовать родитель для датчиков если он есть
V3.2 Вывод имени материнской платы для всех элементов
V3.3 (разделены процессоры если их больше 1 сделан вывод материнской платы)
V3.4 Добавлено единицы измерения в зависимости от категории датчика
V3.5 Поддержка сразу нескольких программ, Перекодировка Русских слов из windows в utf-8, переменные по умолчанию, фильтра добавляемых элементов в макросах, при необходимости можно задать свой порт в макросе узла.

У hwmonitor я не нашел wmi так что данная программа не работает с zabbix!


Работа через внешнюю проверку , скрипт на заббикс сервере HM.sh
При работе скрипта вся нагрузка выполнения ложится на ресурсы железа Заббикс Сервера!
Скрипт лежит (у вас может быть другой путь) /usr/local/share/zabbix/externalscripts HM.sh

СКАЧАТЬ
Шаблон + Скрипт LLD Hardware Monitor.zip
Шаблон + Скрипт LLD Hardware Monitor.zip
(32.21 КБ) 20 скачиваний
Изменено 10.11.2021 (Целое число для максимальной температуры)

Требования!
1. На сервере заббикса должен быть установлен zabbix_get, на заббикс агенте разрешено выполнение удаленных команд!
2. На удаленный Хост (узел) который будет мониториться должна(ы) быть запущенна HardwareMonitor виде процесса или службы и Заббикс Агент
3. ВАЖНО!!! между словами в имени должен быть всего 1 пробел в утилите HardwareMonitor (более одного пробела слово будет относится к другому столбцу и все столбцы данной строки сместятся и данные имени элемента будут не верны)
Требования для Hardware Monitor
Показать
Для x86(32) использовать версию OpenHardwareMonitor.exe 0.8 требование .NET Framework версии 2.0
Начиная с версии OpenHardwareMonitor.exe 0.9.5
Приложение перенесено на .NET Framework версии 4.5 (новое минимальное требование). Только для 64 битных систем.

LibreHardwareMonitor зависит от .NET Framework 2.0, 4.5.2, 5.0
Обновление с 0.8.7 до 0.8.8 вводит зависимость от NvAPIWrapper, которая не работает в x86 в среде x64.
ограничение nvapi: https://github.com/falahati/NvAPIWrappe ... cs#L54-L65,
вероятно, не исправимо

HWMonitor и HWMonitor PRO
Версия PRO сканирует скорость сетевого адаптера, тогда как классическая версия - нет.
В остальном две программы имеют одинаковые возможности мониторинга.
Pro версия 30 дней бесплатно, после требует лицензии!

Макросы
Для использования с NAT когда ip один порты различны в узлах
На узле к которому подключен шаблон в разделе макросы {$HOST.PORTS} укажите номер порта который используете, по умолчанию в шаблоне 10050

{$PUTHM} Указать название используемой программы на хосте или сразу несколько через ;
root\OpenHardwareMonitor;root\LibreHardwareMonitor;root\hwmonitor по умолчанию задана OHM

{$FILTRHM} -Какие датчики показывать, по умолчанию все .*
{$HIDEHM} -Какие датчики скрыть из вывода, по умолчанию пропустить все ^$

Clock\|Load\|Control\|Temperature\|Data\|Fan\|Voltage\|Throughput или имена элементов для точного имени ставьте пробел после имени

{$KODR} -кодировка windows cp1251 или cp866 по умолчанию cp866

Системные макросы
{HOST.CONN} - IP DNS Узла
{HOST.HOST} - Имя Узла

Приоритет Макросов Узел - Шаблон - Глобальные , при необходимости задаем макросы свои в узле они будут приоритетнее.
Команды проверок
Показать
В Первую очередь проверяем на Хосте Windows работу в cmd
На примере OpenHardwareMonitor
Запрос датчиков WMIC.exe /NAMESPACE:\\root\OpenHardwareMonitor PATH Sensor
Запрос железа WMIC.exe /NAMESPACE:\\root\OpenHardwareMonitor PATH Hardware
Если таблицы с данными есть все ОК!
Идем дальше

На заббикс сервере через команду zabbix_get -s
Запрос всей таблицы (где есть кавычки " ставим до слешь \)
zabbix_get -s 192.168.175.8 -k system.run["WMIC.exe /NAMESPACE:\\\root\OpenHardwareMonitor PATH Sensor"]

Запрос железа
zabbix_get -s 192.168.175.8 -k system.run["WMIC.exe /NAMESPACE:\\\root\OpenHardwareMonitor PATH Hardware"]
Если таблицы с данными есть все ОК!
Идем дальше

Проверяем работу скрипта
Проверка ответа сразу 2х программ
./HM3.5.sh 192.168.175.8 10050 discovery "root\LibreHardwareMonitor;root\OpenHardwareMonitor"
или 3х
./HM3.5.2.sh 192.168.175.8 10050 discovery "root/HWMonitor;root\OpenHardwareMonitor;root\LibreHardwareMonitor" ".*" "^$" cp866 "21Program"

Проверка фильтра выбранных датчиков
./HM3.5.sh 192.168.175.8 10050 discovery "root\LibreHardwareMonitor;root\OpenHardwareMonitor" "Temperature"

Проверка фильтра исключения элементов
./HM3.5.sh 192.168.175.8 10050 discovery "root\LibreHardwareMonitor;root\OpenHardwareMonitor" ".*" "Download Speed"

Кодировка cmd
./HM3.5.sh 192.168.175.8 10050 discovery "root\LibreHardwareMonitor;root\OpenHardwareMonitor" ".*" "^$" cp866 "ИМЯ Узла"

Запрос процессов
./HM3.5.4.sh 192.168.175.8 10050 processes "root/HWMonitor;root\OpenHardwareMonitor;root\LibreHardwareMonitor" ".*" "^$" cp866 "21Program"

Листинг таблицы Инфо
./HM3.5.sh 192.168.175.8 10050 info "root\LibreHardwareMonitor;root\OpenHardwareMonitor" ".*" "^$" cp866 "ИМЯ Узла"

Максимальная температура
./HM3.5.sh 192.168.175.8 10050 maxtemp "root\LibreHardwareMonitor;root\OpenHardwareMonitor" ".*" "^$" cp866 "ИМЯ Узла"

Если получаем данные в ответ все ОК, цепляем шаблон к узлу, прописываем макросы если не обходимо, правило обнаружения проверить сейчас, должны создастся элементы данных.
Сравниваем данные что у нас уже есть в Zabbix и что возьмем из Hardware Monitor
Clock\Часы в MHz
***Bus Speed частота системной шины, на которой работает процессор
***CPU Core - текущая частота работы ядра процессора

-Load\Загрузка в %
***CPU Total - сумарная Зарузка на процессор всех ядер-------------------------Элемент system.cpu.load[percpu,avg1] Загрузка процессора (1 мин в среднем)
***CPU Core #1 - конкретная Загрузка на 1 ядро------------------------------------Элемент ?
***+Memory - Загрузка(использование оперативной памяти)------------------------Элемент vm.memory.size[pused] Используемая память RAM в%
***+Virtual Memory - Загрузка(использование файла подкачки памяти)-----------Элемент system.swap.size[,pfree] Свободное место подкачки в файле %
***Used Space - Используемое Пространство (занято на) Диске(физически)-----------------Элемент vfs.fs.size[{#FSNAME},pused] Использовано место на диске {#FSNAME} (в процентах) раздельно по C D
***Write Activity - активная запись на диск (Физический для дисков)--------------------------Элемент perf_counter_en[\234({#DISKNUMLET})\204] Общей загруженность записью Физического диска в % {#DISKNUMLET} perf_counter_en[\236({#FSNAME})\204] Общей загруженность записью Логического диска в % {#FSNAME}
***Total Activity - Общая Активность Диска (Физический для дисков)------------------------Элемент perf_counter_en[\234_Tota\204] Общей загруженность записью Физических дисков в % perf_counter_en[\236_Tota\204] Общей загруженность записью Логического диска в % {#FSNAME}
***Network Utilization - Использование Сети (суммарная нагрузка на порт)----Элемент net.if.total[{#IFNAME}] Сумарный сетевой трафик {#IFNAME} не в % , в байтах или пакетах net.if.total[{#IFNAME},packets]

Control\Контроль в %
***Fan Control #1

+ Temperature\Температура в °C
***CPU Core - Текущая температура ядра
***CPU Distance to TjMax - обратная температура от 100 (при 30 °C значит 70 °C) Distance to TJ Max - показывает сколько осталось запаса до критической температуры, при которой процессор начнет уходить в троттлинг (снижать частоту)

-Data\Данные в GB
***Memory Used - Используемая (оперативная) память--------------------------------Элемент vm.memory.size[used] Используемая память RAM
***Memory Available - Доступная (оперативная) память--------------------------------Элемент vm.memory.size[available] Доступная RAM память
***Virtual Memory Used - Используемая Виртуальная Память (файл подкачки)--Элемент system.swap.size[,used] Используется места в файле подкачки
***Virtual Memory Available - Доступная Виртуальная Память (файл подкачки)--Элемент system.swap.size[,free] Свободное место подкачки
***Data Uploaded - Загруженные Данные (Сеть) ----------------------------------------Элемент net.if.out[{#IFNAME}] Исходящий сетевой трафик {#IFNAME}
***Data Downloaded - Загруженные данные (Сеть)--------------------------------------Элемент net.if.in[{#IFNAME}] Входящий сетевой трафик {#IFNAME}

+ Fan\Кулера в RPM
***Fan - Кулер обороты (скорость вращения)

+ Voltage\Напряжение в V
***VBat - Батарейка биос (текущее напряжение, заряд)
***Vcore
***DIMM - питание оперативной память
***+3.3V - Напряжение линии 3В
***+5V - Напряжение линии 5В
***+12V - Напряжение линии 12В
***И другие

-Throughput\Пропускная способность в KB/s
***Upload Speed - Скорость выгрузки отправки-------------Элемент net.if.out[{#IFNAME}] Исходящий сетевой трафик {#IFNAME}
***Download Speed - Скорость (загрузки) скачивания -----Элемент net.if.in[{#IFNAME}] Входящий сетевой трафик {#IFNAME}

Например мы хотим оставить данные
{$FILTRHM} Clock\|Temperature\|Fan\|Voltage
Исключить данные (ещё обратную температуру TjMax)
{$HIDEHM} Load\|Control\|Data\|Throughput\|TjMax

Так же можно Фильтровать данные стандартно Правило обнаружения вкладка Фильтры
Её можно задать в шаблоне
Либо в Узле под конкретный узел создать.
Так же можно создать глобальные регулярные выражения
Администрирование - Общие - Регулярные выражения
Более подробно Низкоуровневое обнаружение

Визуально OpenHardwareMonitor, LibreHardwareMonitor, hwmonitor похожи между собой
OpenHardwareMonitor, LibreHardwareMonitor, hwmonitor
OpenHardwareMonitor, LibreHardwareMonitor, hwmonitor
ШАБЛОН Аппаратное обеспечение LLD V3.5 PORT Windows HardwareMonitor
Аппаратное обеспечение LLD V3.5 PORT Windows HardwareMonitor
Аппаратное обеспечение LLD V3.5 PORT Windows HardwareMonitor
Обычные Элементы Аппаратное обеспечение LLD V3.5 PORT Windows HardwareMonitor
Обычные Элементы Аппаратное обеспечение LLD V3.5 PORT Windows HardwareMonitor
Обычные Элементы Аппаратное обеспечение LLD V3.5 PORT Windows HardwareMonitor
Обнаружение датчиков
Обнаружение датчиков
Обнаружение датчиков
Прототип элемента данных Аппаратное обеспечение LLD V3.5 PORT Windows HardwareMonitor
Прототип элемента данных Аппаратное обеспечение LLD V3.5 PORT Windows HardwareMonitor
Прототип элемента данных Аппаратное обеспечение LLD V3.5 PORT Windows HardwareMonitor
Прототипы триггеров Аппаратное обеспечение
Прототипы триггеров Аппаратное обеспечение
Прототипы триггеров Аппаратное обеспечение
Обнаружение процессов HardwareMonitor
Обнаружение процессов HardwareMonitor
Обнаружение процессов HardwareMonitor
СКРИПТ HM3.5.4.SH
Скрипт HM3.5.4
Скрипт HM3.5.4
HM3.5.4.sh
Показать
#!/bin/bash
#2021/09/20 v3.5.4
#При работе скрипта вся нагрузка выполнения ложится на ресурсы железа Заббикс Сервера!
#Скрипт мониторинга для HardwareMonitor с LLD для Zabbix (серверный вариант)
# Автор Мамзиков Артём Андреевич Описание по скрипту viewtopic.php?f=48&t=71&p=121#p121

#Автообнаружение параметров из HardwareMonitor и его разновидностей (OpenHardwareMonitor, LibreHardwareMonitor, hwmonitor)

# Объявим входные переменные(variable) и если входная переменная пустая задаем дефолтные настройки для некоторых переменных
IP=$1
PORT=${2:-10050}
BLOCSCRIPT=$3
PUT="${4:-root\OpenHardwareMonitor}"
FILTR=${5:-.*}
HIDE=${6:-^$}
KODR="${7:-cp866}"
HOSTNAME=$8

# Проверка входных переменных, вывод в лог что пришло с узлов
STV=$(date "+%F %T")
#echo $STV $IP $PORT $BLOCSCRIPT $PUT $FILTR $HIDE $KODR >> HWLog

IFS=$'\n'
SL='\\\'

if [[ $BLOCSCRIPT = "discovery" ]]
then
# Проверка нескольких путей ПО на 1 хосте, делим через ;
IFS=';' read -ra sumdir < <(echo "${PUT}")
# Печать разделенной строки
for puti in "${sumdir[@]}"
do
# Для создания ключа нам надо название ПО
shopt -s nocasematch #shopt - приводим к одному регистру
if [[ ${puti} == *Open* ]]; then Emkey="root"${SL}"OpenHardwareMonitor"
elif [[ ${puti} == *Libre* ]]; then Emkey="root"${SL}"LibreHardwareMonitor"
elif [[ ${puti} == *HWM* ]]; then Emkey="root"${SL}"HMMonitor"
shopt -u nocasematch
else Emkey="${puti}"; fi

get=`zabbix_get -s $IP -p $PORT -k system.run["WMIC.exe /NAMESPACE:"${SL}""${puti}" PATH Sensor"]|iconv -f "${KODR}" -t utf8`
# если требуется включение " двойных кавычек, то они должны быть экранированы обратной наклонной чертой \ потому так много слешей верху нужно по сути 2
# Запуск переменной get команды OpenHardwareMonitor |Сетевые карточки могут содержать русское название по этому декодируем из cp866 или cp1251

# Запрос имен и типа железа
gethd=`zabbix_get -s $IP -p $PORT -k system.run["WMIC.exe /NAMESPACE:"${SL}""${puti}" PATH Hardware"]|iconv -f "${KODR}" -t utf8`

# Оставляем нужные нам столбцы по железу (делаем между ними 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 пробела)
obrhartabl=$(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" "$5" "$6}')

# Выбираем родителя датчика который показывает параметры смотрим 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 -n '/'$FILTR'/Ip'|sed -e '/'$HIDE'/d'|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3" "$6" "$7" "$8" "$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" "$8" "$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" "$8" "$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-2)}'`
# Добавление проверки по ИД для серверов 2 процессора иначе оба имени попадают в один ответ(
Processid=`echo "${element}"|awk '{print $(NF-1)}'`

# Получаем Тип оборудования работа со 2 таблицей
HardwareType=`echo "${obrhartabl}"|grep -E "${Parent}".*"${Processid}"|awk '{print $1}'`
# Получаем имя железа (NF-1 или $3)
Namehd=$(echo "${obrhartabl}"|grep -E "${Parent}".*"${Processid}"|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3}'|sed 's/[ \t]*$//')

# Выявляем родителя чипа датчиков если он есть
# Берем со 2 таблицы 2 и 5 столбец (хотя в 5 попадет 6) в сравнении со столбцом-7 1-таблицы получаем ответ 5 столбца 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}'`

case $SensorType in
*Clock*)
UINTS="MHz"
;;
*Load*|*Control*)
UINTS="%"
;;
*Temperature*)
UINTS="°C"
;;
*Data*)
UINTS="GB"
;;
*Fan*)
UINTS="RPM"
;;
*Voltage*)
UINTS="V"
;;
*Throughput*)
UINTS="KB/s"
;;
esac

# Модель Материнской платы выводить всегда mainboard
#mainboard=$(echo "${obrhartabl}"|grep -E Mainboard.*/mainboard.*"${Processid}"|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3}'|sed 's/[ \t]*$//')

# если есть родитель в не учитываем материнку выйдет как родитель
if [ -z "${roditel}" ]; then
mainboard=$(echo "${obrhartabl}"|grep -E Mainboard.*/mainboard.*/Motherboard.*/motherboard.*"${Processid}"|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3}'|sed 's/[ \t]*$//')
else
mainboard=
fi

JSON=$JSON"$SEP\n{\"{#EMKEY}\":\"$Emkey\", \"{#ID}\":\"$InstanceId\", \"{#NAME}\":\"$Name\", \"{#SENSORTYPE}\":\"$SensorType\", \"{#UINTS}\":\"$UINTS\", \"{#HARDTYPE}\":\"$HardwareType\", \"{#HARDNAME}\":\"$Namehd\", \"{#RODITEL}\":\"$roditel\", \"{#RODTIP}\":\"$rodtip\", \"{#MAINBOARD}\":\"$mainboard\"}"
SEP=", "
done

# Проверка на ошибки, так как для 1 узла одновременно могут быть указаны несколько программ одна из них может давать ошибку в этом случае от другой программы JONS не примется, поэтому скрываем ошибки
# Ответы с хоста|Преобразуем в 1 строку|Ищем регуляркой ошибки, если найдено выводим ERROR и убираем из вывода HW с ошибкой. А ошибки отправляем траппером в элемент "Ошибки Правила Обнаружения HM"|Скрыть вывод
check=$(echo "${get}""${gethd}"|tr -d '\r\n'| sed -n 's/No Instance(s) Available.*\|Node.*\|ERROR.*\|Invalid.*\|fatal:.*\|команда не найдена.*/ERROR/Ip')
# Указываем IP или DNS Заббикс сервера, по умолчанию должно работать localhost так как скрипт находится на самом сервере заббикс.
IPZBXSERVER=localhost
# Очистить строки если ошибка в ПО, по имени программы удалим строки из вывода содержащие ее.; отправить траппер с ошибкой.
if [[ ${check} == *ERROR* ]]; then hwnamep=$(echo "${Emkey}"|sed -e 's/^.*\\//g');JSON=$(echo -e $JSON|sed -e '/'$hwnamep.*'/d');zabbix_sender -z $IPZBXSERVER -p 10051 -s "${HOSTNAME}" -k errordiscoveryhm -o ""${hwnamep}" "${get}"" > /dev/null;fi

done

# Выводим результат в json
JSON="["$JSON"\n]"
echo -e "${JSON}"


elif [[ $BLOCSCRIPT = "processes" ]]
then
# Проверка нескольких путей ПО на 1 хосте, делим через ;
IFS=';' read -ra sumdir < <(echo "${PUT}")
# Печать разделенной строки
for puti in "${sumdir[@]}"
do
# Для создания ключа нам нужно название ПО
shopt -s nocasematch #shopt - приводим к одному регистру
if [[ ${puti} == *Open* ]]; then namehw="OpenHardwareMonitor"
elif [[ ${puti} == *Libre* ]]; then namehw="LibreHardwareMonitor"
elif [[ ${puti} == *HWM* ]]; then namehw="HMMonitor";fi
shopt -u nocasematch

# Накопительная переменная для нескольких циклов имен процесса.
HWNAME=$HWNAME"$SEP\n{\"{#NAMEHW}\":\"$namehw\"}"
SEP=", "
done
# Выводим результат
HWNAME="["$HWNAME"\n]"
echo -e "${HWNAME}"
fi


# Получение полной информации всей таблицы ./OHM.sh[{HOST.CONN},info] смысла в этом особого нет конечно, так как данные постоянно меняются смысл например запрашивать раз в сутки весь листинг но пусть будет)
if [[ $BLOCSCRIPT = "info" ]]
then
# Проверка нескольких путей ПО на 1 хосте, делим через ;
IFS=';' read -ra sumdir < <(echo "${PUT}")
# Печать разделенной строки
for puti in "${sumdir[@]}"
do
get=`zabbix_get -s $IP -p $PORT -k system.run["WMIC.exe /NAMESPACE:"${SL}""${puti}" PATH Sensor"]|iconv -f "${KODR}" -t utf8`
out=$out echo -e "\n${puti}\n""${get}"
done
echo -e "${out}"

elif [[ $BLOCSCRIPT = "maxtemp" ]]
then
# Проверка нескольких путей ПО на 1 хосте, делим через ;
IFS=';' read -ra sumdir < <(echo "${PUT}")
# Печать разделенной строки
for puti in "${sumdir[@]}"
do
# Запрашиваем таблицу|перекодируем|выбираем строки с температурой|показать столбец значения|Исключаем обратную температуру|Вывод только числового значения|Сортировка от меньшего к большему|вывод последней строки
maxtemperature=`zabbix_get -s $IP -p $PORT -k system.run["WMIC.exe /NAMESPACE:"${SL}""${puti}" PATH Sensor"]|iconv -f "${KODR}" -t utf8|sed -n '/'Temperature'/Ip'|sed -e '/'TjMax'/d'|awk '{print $(NF-1)}'|sed -E 's/\.[0-9]+|\,[0-9]+//g'|egrep -o '[0-9]+'|sort -n| tail -n1`
# Для нескольких ПО
maxtemp=$maxtemp"\n${maxtemperature}"
done
# Выводим максимальный результат
echo -e "${maxtemp}"|sort -n| tail -n1
fi
HM3.5.4 раздельный вывод обнаружения процессов
HM3.5.4 раздельный вывод обнаружения процессов
HM3.5.4 раздельный вывод обнаружения процессов
Триггеры Можно создать вручную когда элементы обнаружились
Пример
Триггеры вручную по температуре
Триггеры вручную по температуре
Графики
проще на дашборте добавляем График и делаем его по регулярному выражению например * Temperature : CPU *
Либо создаём вручную в узле, если сделать прототипом для каждого элемента будет свой график.
График по регулярке
График по регулярке
Пример последние данные сразу с 2х программ
Пример последних данных
Пример последних данных

Если процесс остановился Автоматический запуск Действием (либо перестали идти данные перезапуск)
Перезапуск Процесса HardwareMonitor
A or B or C or D or E or F
Условия
Подпись Имя
A Имя триггера содержит Процесс OpenHardwareMonitor
B Имя триггера содержит Процесс LibreHardwareMonitor
C Имя триггера содержит Процесс HMMonitor Удалить
D Имя триггера содержит Нет Данных HM-LLD-JONS-data
E Имя триггера содержит HighTemp CPU
F Имя триггера содержит ExtremHighTemp CPU
Перезапуск Процесса HardwareMonitor
Перезапуск Процесса HardwareMonitor
Операции
Длительность шага операции по умолчанию 1m
Приостановить операции для подавленных проблем V

1 Выполнить удаленные команды на текущем узле сети Незамедлительно
Шаги 1 1
Тип операции Удаленная команда
Цель Текущий узел сети
Тип пользовательский скрипт
Zabbix Агент
SCHTASKS /End /TN "\{EVENT.TAGS}\Startup"
SCHTASKS /End /TN "{EVENT.TAGS}"
TASKKILL /IM {EVENT.TAGS}.exe /T /F

2 Выполнить удаленные команды на текущем узле сети 00:01:00
SCHTASKS /Run /I /TN "\{EVENT.TAGS}\restart-hm.bat"
SCHTASKS /Run /TN "restart-hm.bat"

3 Выполнить удаленные команды на текущем узле сети 00:02:00
SCHTASKS /Run /I /TN "\{EVENT.TAGS}\restart-hm.bat"
SCHTASKS /Run /TN "restart-hm.bat"

4 Выполнить удаленные команды на текущем узле сети 00:03:00
SCHTASKS /Run /I /TN "\{EVENT.TAGS}\restart-hm.bat"
SCHTASKS /Run /TN "restart-hm.bat"
Перезапуск Процесса HardwareMonitor Операции
Перезапуск Процесса HardwareMonitor Операции
История изменения
Показать
Ошибка на скрипте 3.5.0-3.5.3
Ошибка на скрипте 3.5.0-3.5.3
Ошибка на скрипте 3.5.0-3.5.3
вывод в одном jons данных и имени процесса не является уникальным
[
{"{#NAMEHW}":"OpenHardwareMonitor.exe"},
{"{#EMKEY}":"root\OpenHardwareMonitor", "{#ID}":"3872",........
]
Элементы создаются все хорошо но правило обнаружения ругается
Cannot create item: item with the same key "wmi.get[{#EMKEY},SELECT Value FROM Sensor WHERE InstanceId={#ID}]" already exists.
Cannot create item: item with the same key "proc.num[{#NAMEHW}]" already exists.
мол ключ уже есть

Почему сразу на 3х версиях ? Понятно же с 1 что так нельзя) изначально не проверено на узлах переделывался вывод его последовательность, скрытие ошибок и т.п.

Сравнение выводов таблиц и отображение русского названия сетевого адаптера
Open Libre HardwereMonitor Hardware
Open Libre HardwereMonitor Hardware
Open Libre HardwereMonitor Hardware
Open Libre HardwereMonitor
Open Libre HardwereMonitor
Open Libre HardwereMonitor

3.5.0 - выдает данные, не отправляет и не скрывает ошибки, показывает программы для всех процессов даже если нет данных для них
HM3.5.0.sh
Показать
#!/bin/bash
#2021/09/11 v3.5.0
#При работе скрипта вся нагрузка выполнения ложится на ресурсы железа Заббикс Сервера!
#Скрипт мониторинга для HardwareMonitor с LLD для Zabbix (серверный вариант)
# Автор Мамзиков Артём Андреевич Описание по скрипту viewtopic.php?f=48&t=71&p=121#p121

#Автообнаружение параметров из HardwareMonitor и его разновидностей (OpenHardwareMonitor, LibreHardwareMonitor, hwmonitor)

# Объявим входные переменные(variable) и если входная переменная пустая задаем дефолтные настройки для некоторых переменных
IP=$1
PORT=${2:-10050}
BLOCSCRIPT=$3
PUT="${4:-root\OpenHardwareMonitor}"
FILTR=${5:-.*}
HIDE=${6:-^$}
KODR="${7:-cp866}"
HOSTNAME=$8

# Проверка входных переменных, вывод в лог что пришло с узлов
STV=$(date "+%F %T")
#echo $STV $IP $PORT $BLOCSCRIPT $PUT $FILTR $HIDE $KODR >> HWLog

IFS=$'\n'
SL='\\\'

if [[ $BLOCSCRIPT = "discovery" ]]
then
# Проверка нескольких путей ПО на 1 хосте, делим через ;
IFS=';' read -ra sumdir < <(echo "${PUT}")
# Печать разделенной строки
for puti in "${sumdir[@]}"
do
# Для создания ключа нам надо название ПО
shopt -s nocasematch #shopt - приводим к одному регистру
if [[ ${puti} == *Open* ]]; then Emkey="root\OpenHardwareMonitor"
elif [[ ${puti} == *Libre* ]]; then Emkey="root\LibreHardwareMonitor"
elif [[ ${puti} == *HWM* ]]; then Emkey="root\HMMonitor"
shopt -u nocasematch
else Emkey="${puti}"; fi

get=`zabbix_get -s $IP -p $PORT -k system.run["WMIC.exe /NAMESPACE:"${SL}""${puti}" PATH Sensor"]|iconv -f "${KODR}" -t utf8`
# если требуется включение " двойных кавычек, то они должны быть экранированы обратной наклонной чертой \ потому так много слешей верху нужно по сути 2
# Запуск переменной get команды OpenHardwareMonitor |Сетевые карточки могут содержать русское название по этому декодируем из cp866 или cp1251

# Запрос имен и типа железа
gethd=`zabbix_get -s $IP -p $PORT -k system.run["WMIC.exe /NAMESPACE:"${SL}""${puti}" PATH Hardware"]|iconv -f "${KODR}" -t utf8`

# Оставляем нужные нам слобцы по железу (делаем между ними 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 пробела)
obrhartabl=$(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" "$5" "$6}')

# Выбираем родителя датчика который показывает параметры смотрим 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 -n '/'$FILTR'/Ip'|sed -e '/'$HIDE'/d'|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3" "$6" "$7" "$8" "$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" "$8" "$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" "$8" "$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-2)}'`
# Добавление проверки по ИД для серверов 2 процессора иначе оба имени попадают в один ответ(
Processid=`echo "${element}"|awk '{print $(NF-1)}'`

# Получаем Тип оборудования работа со 2 таблицей
HardwareType=`echo "${obrhartabl}"|grep -E "${Parent}".*"${Processid}"|awk '{print $1}'`
# Получаем имя железа (NF-1 или $3)
Namehd=$(echo "${obrhartabl}"|grep -E "${Parent}".*"${Processid}"|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3}'|sed 's/[ \t]*$//')

# Выявляем родителя чипа датчиков если он есть
# Берем со 2 таблицы 2 и 5 столбец (хотя в 5 попадет 6) в сравнении со столбцом-7 1-таблицы получаем ответ 5 столбца 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}'`

case $SensorType in
*Clock*)
UINTS="MHz"
;;
*Load*|*Control*)
UINTS="%"
;;
*Temperature*)
UINTS="°C"
;;
*Data*)
UINTS="GB"
;;
*Fan*)
UINTS="RPM"
;;
*Voltage*)
UINTS="V"
;;
*Throughput*)
UINTS="KB/s"
;;
esac

# Модель Материнской платы выволить всегда mainboard
#mainboard=$(echo "${obrhartabl}"|grep -E Mainboard.*/mainboard.*"${Processid}"|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3}'|sed 's/[ \t]*$//')

# если есть родитель в не учитываем материнку выйдет как родитель
if [ -z "${roditel}" ]; then
mainboard=$(echo "${obrhartabl}"|grep -E Mainboard.*/mainboard.*/Motherboard.*/motherboard.*"${Processid}"|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3}'|sed 's/[ \t]*$//')
else
mainboard=
fi

JSON=$JSON"$SEP\n{\"{#EMKEY}\":\"$Emkey\", \"{#ID}\":\"$InstanceId\", \"{#NAME}\":\"$Name\", \"{#SENSORTYPE}\":\"$SensorType\", \"{#UINTS}\":\"$UINTS\", \"{#HARDTYPE}\":\"$HardwareType\", \"{#HARDNAME}\":\"$Namehd\", \"{#RODITEL}\":\"$roditel\", \"{#RODTIP}\":\"$rodtip\", \"{#MAINBOARD}\":\"$mainboard\"}"
SEP=", "
done
# От начала строки любые символы допоследнего \ выводим имя процесса и добавляем окончание в конце строки
namehw=$(echo "${Emkey}"|sed -e 's/^.*\\//g; s/$/.exe/')
# Накопительная переменная для нескольки циклов имен, Добавим к выводу имя процесса
HWNAME=$HWNAME"\n{\"{#NAMEHW}\":\"$namehw\"},"

done

# Добавим к выводу имя процесса
JSON=$HWNAME$JSON
# Выводим результат в json data
JSON="["$JSON"\n]"
echo -e $JSON
fi


# Получение полной информации всей таблицы ./OHM.sh[{HOST.CONN},info] смысла в этом особого нет конечно, так как данные постоянно меняются смысл например запрашивать раз в сутки весь листинг но пусть будет)
if [[ $BLOCSCRIPT = "info" ]]
then
# Проверка нескольких путей ПО на 1 хосте, делим через ;
IFS=';' read -ra sumdir < <(echo "${PUT}")
# Печать разделенной строки
for puti in "${sumdir[@]}"
do
get=`zabbix_get -s $IP -p $PORT -k system.run["WMIC.exe /NAMESPACE:"${SL}""${puti}" PATH Sensor"]|iconv -f "${KODR}" -t utf8`
out=$out echo -e "\n${puti}\n""${get}"
done
echo -e "${out}"

elif [[ $BLOCSCRIPT = "maxtemp" ]]
then
# Проверка нескольких путей ПО на 1 хосте, делим через ;
IFS=';' read -ra sumdir < <(echo "${PUT}")
# Печать разделенной строки
for puti in "${sumdir[@]}"
do
# Запрашиваем таблицу|перекодируем|выбираем строки с температурой|показать столбец значения|Исключаем обратную температуру|Вывод только числового значения|Сортировка от меньшего к большему|вывод последней строки
maxtemperature=`zabbix_get -s $IP -p $PORT -k system.run["WMIC.exe /NAMESPACE:"${SL}""${puti}" PATH Sensor"]|iconv -f "${KODR}" -t utf8|sed -n '/'Temperature'/Ip'|sed -e '/'TjMax'/d'|awk '{print $(NF-1)}'|egrep -o '[0-9]+'|sort -n| tail -n1`
# Для нескольких ПО
maxtemp=$maxtemp"\n${maxtemperature}"
done
# Выводим максимальный результат
echo -e "${maxtemp}"|sort -n| tail -n1
fi
Скачать
HM3.5.0.zip
HM3.5.0.zip
(3.77 КБ) 5 скачиваний
Вывод с данной версии скрипта
HM3.5.0
HM3.5.0
HM3.5.0
Если одна из программ не установлена или не работает передаем ошибки и скрываем их из вывода
Пример ошибки
Нет одной программы 1 ошибка 2 нет
Нет одной программы 1 ошибка 2 нет
Нет одной программы 1 ошибка 2 нет
3.5.1 - попытка сделать имя процесса данные, снова имя процесса данные для 2 по (не правильно становятся запятые) Скрытие ошибок работает но при условии первая программа в ошибке вторая нет, если на оборот от первой пере затираются пустой переменной при 2 ошибке
HM3.5.1.sh
Показать
#!/bin/bash
#2021/09/19 v3.5.1
#При работе скрипта вся нагрузка выполнения ложится на ресурсы железа Заббикс Сервера!
#Скрипт мониторинга для HardwareMonitor с LLD для Zabbix (серверный вариант)
# Автор Мамзиков Артём Андреевич Описание по скрипту viewtopic.php?f=48&t=71&p=121#p121

#Автообнаружение параметров из HardwareMonitor и его разновидностей (OpenHardwareMonitor, LibreHardwareMonitor, hwmonitor)

# Объявим входные переменные(variable) и если входная переменная пустая задаем дефолтные настройки для некоторых переменных
IP=$1
PORT=${2:-10050}
BLOCSCRIPT=$3
PUT="${4:-root\OpenHardwareMonitor}"
FILTR=${5:-.*}
HIDE=${6:-^$}
KODR="${7:-cp866}"
HOSTNAME=$8

# Проверка входных переменных, вывод в лог что пришло с узлов
STV=$(date "+%F %T")
#echo $STV $IP $PORT $BLOCSCRIPT $PUT $FILTR $HIDE $KODR >> HWLog

IFS=$'\n'
SL='\\\'

if [[ $BLOCSCRIPT = "discovery" ]]
then
# Проверка нескольких путей ПО на 1 хосте, делим через ;
IFS=';' read -ra sumdir < <(echo "${PUT}")
# Печать разделенной строки
for puti in "${sumdir[@]}"
do
# Для создания ключа нам надо название ПО
shopt -s nocasematch #shopt - приводим к одному регистру
if [[ ${puti} == *Open* ]]; then Emkey="root\OpenHardwareMonitor"
elif [[ ${puti} == *Libre* ]]; then Emkey="root\LibreHardwareMonitor"
elif [[ ${puti} == *HWM* ]]; then Emkey="root\HMMonitor"
shopt -u nocasematch
else Emkey="${puti}"; fi

get=`zabbix_get -s $IP -p $PORT -k system.run["WMIC.exe /NAMESPACE:"${SL}""${puti}" PATH Sensor"]|iconv -f "${KODR}" -t utf8`
# если требуется включение " двойных кавычек, то они должны быть экранированы обратной наклонной чертой \ потому так много слешей верху нужно по сути 2
# Запуск переменной get команды OpenHardwareMonitor |Сетевые карточки могут содержать русское название по этому декодируем из cp866 или cp1251

# Запрос имен и типа железа
gethd=`zabbix_get -s $IP -p $PORT -k system.run["WMIC.exe /NAMESPACE:"${SL}""${puti}" PATH Hardware"]|iconv -f "${KODR}" -t utf8`

# Оставляем нужные нам стлобцы по железу (делаем между ними 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 пробела)
obrhartabl=$(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" "$5" "$6}')

# Выбираем родителя датчика который показывает параметры смотрим 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 -n '/'$FILTR'/Ip'|sed -e '/'$HIDE'/d'|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3" "$6" "$7" "$8" "$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" "$8" "$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" "$8" "$9}')

#Вывод для тестов настроек
#echo "${get}"
#echo "${obrtabl}"
#echo "${obrtablhd}"
#fi

JSONP=
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-2)}'`
# Добавление проверки по ИД для серверов 2 процессора иначе оба имени попадают в один ответ(
Processid=`echo "${element}"|awk '{print $(NF-1)}'`

# Получаем Тип оборудования работа со 2 таблицей
HardwareType=`echo "${obrhartabl}"|grep -E "${Parent}".*"${Processid}"|awk '{print $1}'`
# Получаем имя железа (NF-1 или $3)
Namehd=$(echo "${obrhartabl}"|grep -E "${Parent}".*"${Processid}"|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3}'|sed 's/[ \t]*$//')

# Выявляем родителя чипа датчиков если он есть
# Берем со 2 таблицы 2 и 5 столбец (хотя в 5 попадет 6) в сравнении со столбцом-7 1-таблицы получаем ответ 5 столбца 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}'`

case $SensorType in
*Clock*)
UINTS="MHz"
;;
*Load*|*Control*)
UINTS="%"
;;
*Temperature*)
UINTS="°C"
;;
*Data*)
UINTS="GB"
;;
*Fan*)
UINTS="RPM"
;;
*Voltage*)
UINTS="V"
;;
*Throughput*)
UINTS="KB/s"
;;
esac

# Модель Материнской платы выводить всегда mainboard
#mainboard=$(echo "${obrhartabl}"|grep -E Mainboard.*/mainboard.*"${Processid}"|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3}'|sed 's/[ \t]*$//')

# если есть родитель в не учитываем материнку выйдет как родитель
if [ -z "${roditel}" ]; then
mainboard=$(echo "${obrhartabl}"|grep -E Mainboard.*/mainboard.*/Motherboard.*/motherboard.*"${Processid}"|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3}'|sed 's/[ \t]*$//')
else
mainboard=
fi

JSONP=$JSONP"$SEP\n{\"{#EMKEY}\":\"$Emkey\", \"{#ID}\":\"$InstanceId\", \"{#NAME}\":\"$Name\", \"{#SENSORTYPE}\":\"$SensorType\", \"{#UINTS}\":\"$UINTS\", \"{#HARDTYPE}\":\"$HardwareType\", \"{#HARDNAME}\":\"$Namehd\", \"{#RODITEL}\":\"$roditel\", \"{#RODTIP}\":\"$rodtip\", \"{#MAINBOARD}\":\"$mainboard\"}"
SEP=", "
done
# От начала строки любые символы до последнего \ выводим имя процесса и добавляем окончание в конце строки
namehw=$(echo "${Emkey}"|sed -e 's/^.*\\//g; s/$/.exe/')
# Накопительная переменная для нескольких циклов имен, Добавим к выводу имя процесса
HWNAME=$HWNAME"\n{\"{#NAMEHW}\":\"$namehw\"},"$JSONP

# Указываем IP или DNS Заббикс сервера, по умолчанию должно работать localhost так как скрипт находится на самом сервере заббикс.
IPZBXSERVER=localhost
# Проверка на ошибки, так как для 1 узла одновременно могут быть указаны несколько программ одна из них может давать ошибку в этом случае от другой программы JONS не примется, поэтому скрываем ошибки
# Ответы с хоста|Преобразуем в 1 строку|Ищем регуляркой ошибки, если найдено выводим ERROR и обнуляем JONS . А ошибки отправляем траппером в элемент "Ошибки Правила Обнаружения HM"
check=$(echo "${get}""${gethd}"|tr -d '\r\n'| sed -n 's/No Instance(s) Available.*\|Node.*\|ERROR.*\|Invalid.*\|fatal:.*\|команда не найдена.*/ERROR/Ip')
if [[ ${check} == *ERROR* ]]; then JSON=""; HWNAME=""; zabbix_sender -z $IPZBXSERVER -p 10051 -s "${HOSTNAME}" -k folder[errordiscoveryhm] -o "${get}";fi
done

# Добавим к выводу имя процесса
JSON=$HWNAME
# Выводим результат в json data
JSON="["$JSON"\n]"
echo -e "${JSON}"
fi


# Получение полной информации всей таблицы ./OHM.sh[{HOST.CONN},info] смысла в этом особого нет конечно, так как данные постоянно меняются смысл например запрашивать раз в сутки весь листинг но пусть будет)
if [[ $BLOCSCRIPT = "info" ]]
then
# Проверка нескольких путей ПО на 1 хосте, делим через ;
IFS=';' read -ra sumdir < <(echo "${PUT}")
# Печать разделенной строки
for puti in "${sumdir[@]}"
do
get=`zabbix_get -s $IP -p $PORT -k system.run["WMIC.exe /NAMESPACE:"${SL}""${puti}" PATH Sensor"]|iconv -f "${KODR}" -t utf8`
out=$out echo -e "\n${puti}\n""${get}"
done
echo -e "${out}"

elif [[ $BLOCSCRIPT = "maxtemp" ]]
then
# Проверка нескольких путей ПО на 1 хосте, делим через ;
IFS=';' read -ra sumdir < <(echo "${PUT}")
# Печать разделенной строки
for puti in "${sumdir[@]}"
do
# Запрашиваем таблицу|перекодируем|выбираем строки с температурой|показать столбец значения|Исключаем обратную температуру|Вывод только числового значения|Сортировка от меньшего к большему|вывод последней строки
maxtemperature=`zabbix_get -s $IP -p $PORT -k system.run["WMIC.exe /NAMESPACE:"${SL}""${puti}" PATH Sensor"]|iconv -f "${KODR}" -t utf8|sed -n '/'Temperature'/Ip'|sed -e '/'TjMax'/d'|awk '{print $(NF-1)}'|egrep -o '[0-9]+'|sort -n| tail -n1`
# Для нескольких ПО
maxtemp=$maxtemp"\n${maxtemperature}"
done
# Выводим максимальный результат
echo -e "${maxtemp}"|sort -n| tail -n1
fi
Скачать
HM3.5.1.zip
HM3.5.1.zip
(4.23 КБ) 5 скачиваний
Пример вывода с 3.5.1
HM3.5.1
HM3.5.1
3.5.2 - Имя процесса выходит если есть данные, если данных нет имя процесса не выходит. Так же не зависит в какой очереди рабочая не рабочая программа все отрабатывает корректно.
HM3.5.2.sh
Показать
#!/bin/bash
#2021/09/11 v3.5.1
#При работе скрипта вся нагрузка выполнения ложится на ресурсы железа Заббикс Сервера!
#Скрипт мониторинга для HardwareMonitor с LLD для Zabbix (серверный вариант)
# Автор Мамзиков Артём Андреевич Описание по скрипту viewtopic.php?f=48&t=71&p=121#p121

#Автообнаружение параметров из HardwareMonitor и его разновидностей (OpenHardwareMonitor, LibreHardwareMonitor, hwmonitor)

# Объявим входные переменные(variable) и если входная переменная пустая задаем дефолтные настройки для некоторых переменных
IP=$1
PORT=${2:-10050}
BLOCSCRIPT=$3
PUT="${4:-root\OpenHardwareMonitor}"
FILTR=${5:-.*}
HIDE=${6:-^$}
KODR="${7:-cp866}"
HOSTNAME=$8

# Проверка входных переменных, вывод в лог что пришло с узлов
STV=$(date "+%F %T")
#echo $STV $IP $PORT $BLOCSCRIPT $PUT $FILTR $HIDE $KODR >> HWLog

IFS=$'\n'
SL='\\\'

if [[ $BLOCSCRIPT = "discovery" ]]
then
# Проверка нескольких путей ПО на 1 хосте, делим через ;
IFS=';' read -ra sumdir < <(echo "${PUT}")
# Печать разделенной строки
for puti in "${sumdir[@]}"
do
# Для создания ключа нам надо название ПО
shopt -s nocasematch #shopt - приводим к одному регистру
if [[ ${puti} == *Open* ]]; then Emkey="root"${SL}"OpenHardwareMonitor"
elif [[ ${puti} == *Libre* ]]; then Emkey="root"${SL}"LibreHardwareMonitor"
elif [[ ${puti} == *HWM* ]]; then Emkey="root"${SL}"HMMonitor"
shopt -u nocasematch
else Emkey="${puti}"; fi

get=`zabbix_get -s $IP -p $PORT -k system.run["WMIC.exe /NAMESPACE:"${SL}""${puti}" PATH Sensor"]|iconv -f "${KODR}" -t utf8`
# если требуется включение " двойных кавычек, то они должны быть экранированы обратной наклонной чертой \ потому так много слешей верху нужно по сути 2
# Запуск переменной get команды OpenHardwareMonitor |Сетевые карточки могут содержать русское название по этому декодируем из cp866 или cp1251

# Запрос имен и типа железа
gethd=`zabbix_get -s $IP -p $PORT -k system.run["WMIC.exe /NAMESPACE:"${SL}""${puti}" PATH Hardware"]|iconv -f "${KODR}" -t utf8`

# Оставляем нужные нам слобцы по железу (делаем между ними 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 пробела)
obrhartabl=$(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" "$5" "$6}')

# Выбираем родителя датчика который показывает параметры смотрим 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 -n '/'$FILTR'/Ip'|sed -e '/'$HIDE'/d'|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3" "$6" "$7" "$8" "$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" "$8" "$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" "$8" "$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-2)}'`
# Добавление проверки по ИД для серверов 2 процессора иначе оба имени попадают в один ответ(
Processid=`echo "${element}"|awk '{print $(NF-1)}'`

# Получаем Тип оборудования работа со 2 таблицей
HardwareType=`echo "${obrhartabl}"|grep -E "${Parent}".*"${Processid}"|awk '{print $1}'`
# Получаем имя железа (NF-1 или $3)
Namehd=$(echo "${obrhartabl}"|grep -E "${Parent}".*"${Processid}"|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3}'|sed 's/[ \t]*$//')

# Выявляем родителя чипа датчиков если он есть
# Берем со 2 таблицы 2 и 5 столбец (хотя в 5 попадет 6) в сравнении со столбцом-7 1-таблицы получаем ответ 5 столбца 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}'`

case $SensorType in
*Clock*)
UINTS="MHz"
;;
*Load*|*Control*)
UINTS="%"
;;
*Temperature*)
UINTS="°C"
;;
*Data*)
UINTS="GB"
;;
*Fan*)
UINTS="RPM"
;;
*Voltage*)
UINTS="V"
;;
*Throughput*)
UINTS="KB/s"
;;
esac

# Модель Материнской платы выволить всегда mainboard
#mainboard=$(echo "${obrhartabl}"|grep -E Mainboard.*/mainboard.*"${Processid}"|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3}'|sed 's/[ \t]*$//')

# если есть родитель в не учитываем материнку выйдет как родитель
if [ -z "${roditel}" ]; then
mainboard=$(echo "${obrhartabl}"|grep -E Mainboard.*/mainboard.*/Motherboard.*/motherboard.*"${Processid}"|sed -E 's/ ([^ ])/\t\1/g; s/^1/1\t/;'|awk -F\\t '{print $3}'|sed 's/[ \t]*$//')
else
mainboard=
fi

JSON=$JSON"$SEP\n{\"{#EMKEY}\":\"$Emkey\", \"{#ID}\":\"$InstanceId\", \"{#NAME}\":\"$Name\", \"{#SENSORTYPE}\":\"$SensorType\", \"{#UINTS}\":\"$UINTS\", \"{#HARDTYPE}\":\"$HardwareType\", \"{#HARDNAME}\":\"$Namehd\", \"{#RODITEL}\":\"$roditel\", \"{#RODTIP}\":\"$rodtip\", \"{#MAINBOARD}\":\"$mainboard\"}"
SEP=", "
done

# От начала строки любые символы допоследнего \ выводим имя процесса и добавляем окончание в конце строки
namehw=$(echo "${Emkey}"|sed -e 's/^.*\\//g; s/$/.exe/')
# Накопительная переменная для нескольки циклов имен, Добавим к выводу имя процесса
HWNAME=$HWNAME"\n{\"{#NAMEHW}\":\"$namehw\"},"

# Прверка на ошибки, так как для 1 узла одновременно могут быть указаны несколько программ одна из них может давать ошибку в этом случае от другой программы JONS не примется, поэтому скрываем ошибки
# Ответы с хоста|Преобразуем в 1 строку|Ищем регуляркой ошибки, если найдено выводим ERROR и убираем из вывода HW с ошибкой. А ошибки отправляем траппером в элемент "Ошибки Правила Обнаружения HM"|Скрыть вывод
check=$(echo "${get}""${gethd}"|tr -d '\r\n'| sed -n 's/No Instance(s) Available.*\|Node.*\|ERROR.*\|Invalid.*\|fatal:.*\|команда не найдена.*/ERROR/Ip')
# Указывем IP или DNS Заббикс сервера, по умолчанию должно работать localhost так как скрипт находится на самом сервере заббикс.
IPZBXSERVER=localhost
# Очистить строки если ошибка в ПО, по имени программы удалим строки из вывода содержащие ее.; отправить траппер с ошибкой.
if [[ ${check} == *ERROR* ]]; then hwnamep=$(echo "${Emkey}"|sed -e 's/^.*\\//g');JSON=$(echo -e $JSON|sed -e '/'$hwnamep.*'/d');HWNAME=$(echo -e $HWNAME|sed -e '/'$hwnamep.*'/d');zabbix_sender -z $IPZBXSERVER -p 10051 -s "${HOSTNAME}" -k errordiscoveryhm -o ""${namehw}" "${get}"" > /dev/null;fi

done

# Добавим к выводу имя процесса
JSON=$HWNAME$JSON
# Выводим результат в json data
JSON="["$JSON"\n]"
echo -e "${JSON}"
fi


# Получение полной информации всей таблицы ./OHM.sh[{HOST.CONN},info] смысла в этом особого нет конечно, так как данные постоянно меняются смысл например запрашивать раз в сутки весь листинг но пусть будет)
if [[ $BLOCSCRIPT = "info" ]]
then
# Проверка нескольких путей ПО на 1 хосте, делим через ;
IFS=';' read -ra sumdir < <(echo "${PUT}")
# Печать разделенной строки
for puti in "${sumdir[@]}"
do
get=`zabbix_get -s $IP -p $PORT -k system.run["WMIC.exe /NAMESPACE:"${SL}""${puti}" PATH Sensor"]|iconv -f "${KODR}" -t utf8`
out=$out echo -e "\n${puti}\n""${get}"
done
echo -e "${out}"

elif [[ $BLOCSCRIPT = "maxtemp" ]]
then
# Проверка нескольких путей ПО на 1 хосте, делим через ;
IFS=';' read -ra sumdir < <(echo "${PUT}")
# Печать разделенной строки
for puti in "${sumdir[@]}"
do
# Запрашиваем таблицу|перекодируем|выбираем строки с температурой|показать столбец значения|Исключаем обратную температуру|Вывод только числового значения|Сортировка от меньшего к большему|вывод последней строки
maxtemperature=`zabbix_get -s $IP -p $PORT -k system.run["WMIC.exe /NAMESPACE:"${SL}""${puti}" PATH Sensor"]|iconv -f "${KODR}" -t utf8|sed -n '/'Temperature'/Ip'|sed -e '/'TjMax'/d'|awk '{print $(NF-1)}'|egrep -o '[0-9]+'|sort -n| tail -n1`
# Для нескольких ПО
maxtemp=$maxtemp"\n${maxtemperature}"
done
# Выводим максимальный результат
echo -e "${maxtemp}"|sort -n| tail -n1
fi
Скачать
HM3.5.2.zip
HM3.5.2.zip
(4.33 КБ) 5 скачиваний
Пример вывод 3.5.2
HM3.5.2
HM3.5.2

3.5.3 - вывод процесса в общий jons по 1 разу на каждый процесс
HM3.5.3.sh
Показать
Скачать
HM3.5.3.zip
HM3.5.3.zip
(4.29 КБ) 5 скачиваний
Пример вывода 3.5.3
3.5.3
3.5.3
Cannot create item: item with the same key "wmi.get[{#EMKEY},SELECT Value FROM Sensor WHERE InstanceId={#ID}]" already exists.
Cannot create item: item with the same key "proc.num[{#NAMEHW}]" already exists.
Та же ошибка только в профиль и еще то что пустые
Cannot create item: item with the same key "proc.num[]" already exists.
Cannot create item: item with the same key "proc.num[]" already exists.

3.5.4 - отдельное правило обнаружения для процесса и отдельный блок в скрипте
количество слов: 4289
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 367
Стаж: 2 года 9 месяцев
Откуда: Вологодская область
Контактная информация:

Скрипт + Шаблон для Windows LLD Hardware Monitor

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

Как проверить что у нас данные приходят в JONS или данные корректные не ошибка или что то еще ?

Бывает такое что данные перестают приходит просто пустое [ ] и элементы будут удалены спустя то количество дней которое указанно правиле обнаружения, сам элемент будет работать до последнего потом просто удалится и мы даже не узнаем этого так как ошибка никакая не выйдет(
Так же удалятся созданные графики триггеры в ручную (если это не прототипы) потом придется все заново заносить.
Другой момент если перестанут идти данные с элемента и у нас в триггере прописано нет данных n-ое время тут мы увидим проблему.
Аналогично если элемент обнаружения падает в ошибку или просто часть каких то элементов перестает обнаруживаться.

И что же делать?

1 Вариант - это создать обычный элемент который будет запрашивать данные такие же как и правило обнаружения. Можно сделать опрос раз в сутки и сохранять их например 2 дня или 7 дней (так же можно получать не все данные а какое то одно вырезав все остальное регуляркой). На это элемент повешать триггер поиск по регулярному слову в ответе на эту команду. Если слово не найдено то ошибка, Так же если нет данных боле 25 часов ошибка, отличается ли вывод от предыдущего так же можно сделать ошибку если да но не всегда подходит.
Можно сделать зависимость от процесса , если процесс не работает понятно сто данных нет.

Пример
Нет Данных HM-LLD-JONS-data
Нет Данных HM-LLD-JONS-data
Нет Данных HM-LLD-JONS-data

У меня не заработало.
2 Вариант - Так же создать обычный элемент данных, но он будет вместо правила обнаружения т.е. все что прописана в правиле обнаружения прописываем в обычный элемент данных, сохранение истории можно отключить поставив 0 дней.
В самом же Правиле обнаружения делаем Зависимы элемент данных и указываем созданный элемент данных.

Пример
Правило обнаружения зависимый элемент данных
Правило обнаружения зависимый элемент данных
Правило обнаружения зависимый элемент данных
Цепочку для правила восстановили, далее будем делать еще один зависимый элемент (чисто на правило обнаружения нельзя создать зависимый элемент данных)
Можно конечно Правило обнаружения и не трогать просто добавить точно такой же обычный элемент просто будет 2 одинаковых запроса с узла.

Создаем еще один обычный Элемент данных и делаем его зависимым от элемента который обнаруживает датчики историю сохранения отключаем 0 дней. Добавляем предобработку JONSPath указываем $.id.length() так как выводе у нас есть ID
length - Количество элементов во входящем массиве. Массив. Число.
Пример $..id.length() определённый 4
Оф мануал JONSPath

$.id.length() - у меня не заработало даже на тестовых данных , $.filters работает нормально видимо что то с версией 4.2.
Можно выбрать какой то параметр и на его сделать регулярку в триггере
или если работает параметр length количество найденных строк делаем триггер чтоб в ответе было не менее 1 строки так же нет данных более 25 часов.

JONSPath
JONSPath
JONSPath
Так же у меня не заработало само правило так как в элементе Текст или Лог переносился на новую строку при длинном выводе и правило не понимало начала новой строки. Можно конечно в скрипте сделать вывод меньше разделив строку пополам после запятой.
Ответы с чата
Показать
Сделать триггер на lld авто обнаружение,
если значение стало приходить пустым (элементы перестали обнаруживается) Ошибки нет, правило активировано.
Нужно как то прикрутить триггер.

Правило обнаружения также может быть зависимым элементом данных, которое зависит от обычного элемента данных.
Оно не может зависеть от другого правила обнаружения. Для

Только если делать LLD зависимым от элементы данных(master item).
Создаешь элементы данных, чтобы он получал JSON для LLD, вешаешь на него нужные триггеры и делаешь зависимое правило обнаружения.

А лучше - еще один зависимый элементы данных, в котором считаешь длину массива, полученного из JSON через Предобработку jsonpath. И триггер на него.
Извлечение значения или фрагмента с JSON данных с использованием JSONPath функционала.
Если вы отметите опцию Другое при ошибке, элемент данных не станет неподдерживаемым при ошибке на шаге предобработки и появится возможность задать пользовательскую опцию обработки ошибок:
либо отбросить значение, задать пользовательское значение или задать пользовательское сообщение об ошибке.
length Количество элементов во входящем массиве. Массив. Число.

схема простая,
JSON LLD - в элементы данных без хранения, от него зависимое LLD и зависимый элементы данных с количеством обнаруженных объектов

Но в случае, когда источник проблемы - фильтр LLD, это не поможет

проблема может быть в самом LLD, а может быть в фильтре. В первом случае схема поможет, во втором - нет
количество слов: 53
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 367
Стаж: 2 года 9 месяцев
Откуда: Вологодская область
Контактная информация:

Скрипт + Шаблон для Windows LLD Hardware Monitor

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

Для x86(32) использовать версию OpenHardwareMonitor.exe 0.8 требование .NET Framework версии 2.0
Начиная с версии OpenHardwareMonitor.exe 0.9.5
Приложение перенесено на .NET Framework версии 4.5 (новое минимальное требование). Только для 64 битных систем.

LibreHardwareMonitor зависит от .NET Framework 2.0, 4.5.2, 5.0
Обновление с 0.8.7 до 0.8.8 вводит зависимость от NvAPIWrapper, которая не работает в x86 в среде x64.
ограничение nvapi:
вероятно, не исправимо


HWMonitor и HWMonitor PRO
Версия PRO сканирует скорость сетевого адаптера, тогда как классическая версия - нет.
В остальном две программы имеют одинаковые возможности мониторинга.
Pro версия 30 дней бесплатно, после требует лицензии!

ЗАПУСК БАТНИКА ОТ ИМЕНИ АДМИНИСТРАТОРА

СКАЧАТЬ с гугл диска 74мб Install Hardware Monitor.zip

Для Автоматической установки программ есть скрипт Install Hardware Monitor.bat

Что он делает:
Определяет путь откуда запущен
Указана переменная куда будет копироваться программа set way=C:\zabbix\program\ так же создает путь если его нет
Выводится запрос на установку Вида ПО
Определяется разрядность системы в зависимости от нее копируется та или иная версия
Установка NET Framework
Далее Запрашивается от имени какой учетной записи будет работать процесс Hardware Monitor
Создается задача в планировщике заданий, скрипт на периодическую проверку то что процесс запущен если нет запускает если процессов больше 1 убивает лишние.
Install Hardware Monitor.bat
Install Hardware Monitor.bat
Install Hardware Monitor.bat
Показать
@ECHO OFF
mode con:cols=130 lines=40
color 1A
:: Автор Артём Андреевич Мамзиков
:: V 1.0 14.09.2021
chcp 866 >NUL
TITLE Установка Hardware Monitor
@cls
echo.
echo.
echo. Данный скрипт автоматически выполнит:
echo. 1. Определение разрядности системы x86 или x64
echo. 2. Выбор Установки Hardware Monitor
echo. 3. Заспрос от какого пользователя будет работать Hardware Monitor
echo. 4. Установка Hardware Monitor (иногда ещё NET Framework)
echo.
echo. P.S.
echo. Скрипт должен выполнятся от имени Администратора
echo. или Пользователя имеющего соответствующие права на изменения!
@echo off
pause

chcp 866 >NUL
:: Куда будем копировать ПО путь
set way=C:\zabbix\program\
:: Создать дириктории если нет
mkdir %way%

:: Определяем разрядность системы
Set xOS=x64
If "%PROCESSOR_ARCHITECTURE%"=="x86" If Not Defined PROCESSOR_ARCHITEW6432 Set xOS=x86

:opros
@cls
echo. Для выбора программы введите ее номер
echo. 1. OpenHardwareMonitor
echo. 2. LibreHardwareMonitor
echo. 3. CPUIDHWMonitor
echo. 4. Установить все
echo.
:: Вопрос
set /P HM=Для выбора программы введите ее номер [1,2,3,4]?:
@cls
echo. От какой учетной записи внести задание в планировщик для HardwareMonitor
echo. 1. Система (рекомендуется)
echo. 2. Локального пользователя
echo. 3. Указать свою
echo.
:: Вопрос От какой учетной записи внести задание в планировщик для HM
set /P otvet=Указать Учетнаю запись для запуска HardwareMonitor [1,2,3]?:
@cls

:: Проверка переменных
::echo %way% %xOS% %HM% %otvet% путь "%~dp0%xOS%bit"\

:: В зависимости от ответа копируем HardwareMonitor определенной разрядности
if /i "%HM%"=="1" (xcopy "%~dp0%xOS%bit"\OpenHardwareMonitor "%way%OpenHardwareMonitor\" /s /e /y /v /c) else (if /i "%HM%"=="2" (xcopy "%~dp0%xOS%bit"\LibreHardwareMonitor "%way%LibreHardwareMonitor\" /s /e /y /v /c) else if /i "%HM%"=="3" (xcopy "%~dp0%xOS%bit"\HWMonitor "%way%HWMonitor\" /s /e /y /v /c) else if /i "%HM%"=="4" (xcopy "%~dp0%xOS%bit"\OpenHardwareMonitor "%way%OpenHardwareMonitor\" /s /e /y /v /c & xcopy "%~dp0%xOS%bit"\LibreHardwareMonitor "%way%LibreHardwareMonitor\" /s /e /y /v /c & xcopy "%~dp0%xOS%bit"\HWMonitor "%way%HWMonitor\" /s /e /y /v /c) else (goto :opros))

echo. Установка NET Framework
If %xOS%==x86 (echo установите при необходимости NET_Framework 2.0) else ("%~dp0"X86-X64bit\NET_Framework\dotnetfx45_full_x86_x64.exe /q /norestart)
pause

:: Задаем переменные на пути программы и Имя
if /i "%HM%"=="1" (set address="%way%OpenHardwareMonitor\OpenHardwareMonitor.exe" & set name=OpenHardwareMonitor) else (if /i "%HM%"=="2" ( set address="%way%LibreHardwareMonitor\LibreHardwareMonitor.exe" & set name=LibreHardwareMonitor) else if /i "%HM%"=="3" (set address="%way%HWMonitor\HWMonitor.exe" & set name=HWMonitor) else if /i "%HM%"=="4" (goto :vsepo) else (echo некорректный ввод))

:: Усттановка Выбораного ПО
if /i "%otvet%"=="1" (goto :System) else (if /i "%otvet%"=="2" (goto :Local) else if /i "%otvet%"=="3" (goto :User) else (goto :opros))

:vsepo
:: Подставить все переменные для каждой программы по очередно.
set var="set address="%way%OpenHardwareMonitor\OpenHardwareMonitor.exe"&set name=OpenHardwareMonitor,set address="%way%LibreHardwareMonitor\LibreHardwareMonitor.exe"&set name=LibreHardwareMonitor,set address="%way%HWMonitor\HWMonitor.exe"&set name=HWMonitor"
:: Экранируем пути добавляем кавычки было , стало "," чтобы разделить циклом ПО
set var=%var:,=","%
for %%a in (%var%) do set varp=%%a & call:next
:: Выход при пустой переменной
if /i "%varp%1"=="1" (goto :end)

:next
:: Разделяем переменные и Применяем
for /f "tokens=1,2 delims=&" %%b in (%varp%) do (
%%b
%%c
)
@ECHO OFF
mode con:cols=130 lines=40
color 1A
:: Усттановка Выбораного ПО
if /i "%otvet%"=="1" (goto :System) else (if /i "%otvet%"=="2" (goto :Local) else if /i "%otvet%"=="3" (goto :User) else (goto :opros))
:: Сброс переменных после цикла
set "varp="
set "address="
set "name="

:System
:: От група-пользователь Система
set login=S-1-5-18
set "pass="
:: При загрузке Windows
SCHTASKS /Create /SC ONSTART /TN "\%name%\Startup" /TR "'%address%'" /RU "%login%" /RL Highest /F
:: Уже готовая задача в XML делаем импорт
SCHTASKS /Create /RU "%login%" /RP "%pass%" /tn "\%name%\Startup" /XML "%way%%name%\HM.xml" /F
SCHTASKS /Create /RU "%login%" /RP "%pass%" /tn "\%name%\restart-hm.bat" /XML "%way%%name%\restart-hm.bat.xml" /F
goto :dalee

:Local
:: От Локального пользователя
set login=NT AUTHORITY\LOCALSERVICE
set "pass="
:: При загрузке Windows
SCHTASKS /Create /SC ONSTART /TN "\%name%\Startup" /TR "'%address%'" /RU "%login%" /RL Highest /F
:: Уже готовая задача в XML делаем импорт
SCHTASKS /Create /RU "%login%" /RP "%pass%" /tn "\%name%\Startup" /XML "%way%%name%\HM.xml" /F
SCHTASKS /Create /RU "%login%" /RP "%pass%" /tn "\%name%\restart-hm.bat" /XML "%way%%name%\restart-hm.bat.xml" /F
goto :dalee

:User
:: Визуальный вывод и получение ввода данных
chcp 866 >NUL
echo Логин/Login
set /P login=
set login=%login%
echo.
echo Пароль/Password
set /P pass=
set pass=%pass%
echo.

:: При загрузке Windows
SCHTASKS /Create /SC ONSTART /TN "\%name%\Startup" /TR "'%address%'" /RU "NT AUTHORITY\LOCALSERVICE" /RL Highest /F
SCHTASKS /Create /SC ONSTART /TN "\%name%\Startup" /TR "'%address%'" /RU "S-1-5-18" /RL Highest /F
SCHTASKS /Create /RU "%login%" /RP "%pass%" /SC ONSTART /TN "\%name%\Startup" /TR "'%address%'" /RL Highest /F
:: Уже готовая задача в XML делаем импорт
SCHTASKS /Create /RU "%login%" /RP "%pass%" /tn "\%name%\Startup" /XML "%way%%name%\HM.xml" /F
SCHTASKS /Create /RU "%login%" /RP "%pass%" /tn "\%name%\restart-hm.bat" /XML "%way%%name%\restart-hm.bat.xml" /F
goto :dalee

:dalee
:: Выполнить на локальном компьютере задание "Startup" немедленно, игнорируя любые ограничения
SCHTASKS /Run /I /TN "\%name%\Startup"
SCHTASKS /Run /I /TN "\%name%\restart-hm.bat"

:: Проверка что процесс запустился, если нет запускаем
TaskList /FI "ImageName EQ %name%.exe" 2>nul|Find /I "%name%.exe">nul||(
Start "" /high "%address%"
)

:end

:: Автозапуск через реестр
::reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /v StartupOHM /d C:\zabbix\OpenHardwareMonitor\OpenHardwareMonitor.exe /f
:: Папка Автозагрузки в неё нужно скопировать .exe или батник на запуск .exe
::C:\Users\Пользователь\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
::C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup

::Перезагрузка для применения системной
::shutdown -r -f -t 15 -c "Перезагрузка системы"
color 0f
Скачать
Install Hardware Monitor.zip
Install Hardware Monitor.zip
(2.4 КБ) 6 скачиваний
Скрипт для удаления Remove Hardware Monitor.bat
Что делает
Убывает процесс удаляемой программы
Останавливает задачи в планировщике
Удаляет задачи из планировщика и сам раздел
Удаляет папку с программой

Есть вариант удаления старой версии в виде службы и другому пути.
Remove Hardware Monitor.bat
Remove Hardware Monitor.bat
Remove Hardware Monitor.bat
Remove Hardware Monitor.bat
Показать
@Echo Off
mode con:cols=130 lines=40
color 1A
chcp 866 >NUL
TITLE Удаление Hardware Monitor

:: Путь ПО
set way=C:\zabbix\program\

:opros
@cls
echo. Для удаления программы введите ее номер
echo. 1. OpenHardwareMonitor
echo. 2. LibreHardwareMonitor
echo. 3. CPUIDHWMonitor
echo. 4. Удалить все
echo. 5. Удаление старой установки Open Hardware Monitor
echo.
:: Вопрос
set /P HM=Для удаления программы введите ее номер [1,2,3,4,5]?:
@cls

:: Задаем переменные на пути программы и Имя
if /i "%HM%"=="1" (set address="%way%OpenHardwareMonitor"& set name=OpenHardwareMonitor& goto :deletehw) else (if /i "%HM%"=="2" ( set address="%way%LibreHardwareMonitor"& set name=LibreHardwareMonitor& goto :deletehw) else if /i "%HM%"=="3" (set address="%way%HWMonitor"& set name=HWMonitor& goto :deletehw) else if /i "%HM%"=="4" (goto :deletevsepo) else if /i "%HM%"=="5" (goto :deleteold) else (goto :opros))

:deletevsepo
:: Подставить все переменные для каждой программы по очередно.
set var="set address="%way%OpenHardwareMonitor"&set name=OpenHardwareMonitor,set address="%way%LibreHardwareMonitor"&set name=LibreHardwareMonitor,set address="%way%HWMonitor"&set name=HWMonitor"
:: Экранируем пути добавляем кавычки было , стало "," чтобы разделить циклом ПО
set var=%var:,=","%
for %%a in (%var%) do set varp=%%a & call:deletenext
:: Выход при пустой переменной
if /i "%varp%1"=="1" (goto :end)

:deletenext
:: Разделяем переменные и Применяем
for /f "tokens=1,2 delims=&" %%b in (%varp%) do (
%%b
%%c
)
@ECHO OFF
mode con:cols=130 lines=40
color 1A
:: Удаление Выбораного ПО
goto :deletehw
:: Сброс переменных после цикла
set "varp="
set "address="
set "name="

:deletehw
:: Планировщик заданий Остановка процесса HardwareMonitor & Для старой версии
SCHTASKS /End /TN "\%name%\Startup" & SCHTASKS /End /TN "Open Hardware Monitor"
:: Планировщик заданий Остановка процесса restart-hm.bat & Для старой версии
SCHTASKS /End /TN "\%name%\restart-hm.bat" & SCHTASKS /End /TN "restart-hm.bat"
:: Убить процесс если он не завершился
TASKKILL /IM %name%.exe /T /F
:: Завершить процесс по PID
for /f "tokens=2 delims= " %%a in ('tasklist^|find /I "%name%.exe"') do (
TASKKILL /PID %%a /T /F )

:: Удаление запланированных задач
SCHTASKS /Delete /TN "\%name%\Startup" /F
SCHTASKS /Delete /TN "\%name%\restart-hm.bat" /F
SCHTASKS /Delete /TN "\%name%" /F
:: Удалить папку
RD /S /Q "%address%"
:end

:deleteold
:: Удаление старойверсии установки Open Hardware Monitor
:: Удаление как служба Переход в директорию
cd C:\zabbix\inst\nssm-2.24
::Остановка службы OpenHardwareMonitor
nssm stop OpenHardwareMonitor
net stop OpenHardwareMonitor
:: Удаление службы OpenHardwareMonitor
nssm remove OpenHardwareMonitor confirm

:: Планировщик заданий Остановка процесса HardwareMonitor & Для старой версии
SCHTASKS /End /TN "\Open Hardware Monitor\Startup" & SCHTASKS /End /TN "Open Hardware Monitor"
:: Планировщик заданий Остановка процесса restart-hm.bat & Для старой версии
SCHTASKS /End /TN "\Open Hardware Monitor\restart-ohm.bat" & SCHTASKS /End /TN "restart-ohm.bat"
:: Убить процесс если он не завершился
TASKKILL /IM OpenHardwareMonitor.exe /T /F
:: Завершить процесс по PID
for /f "tokens=2 delims= " %%a in ('tasklist^|find /I "OpenHardwareMonitor.exe"') do (
TASKKILL /PID %%a /T /F )

:: Удаление запланированных задач
SCHTASKS /Delete /TN "\Open Hardware Monitor\Startup" /F
SCHTASKS /Delete /TN "\Open Hardware Monitor\restart-hm.bat" /F
SCHTASKS /Delete /TN "\Open Hardware Monitor" /F
:: Удалить папку
RD /S /Q "C:\zabbix\OpenHardwareMonitor"
:end
Скачать
Remove Hardware Monitor.zip
Remove Hardware Monitor.zip
(1.33 КБ) 6 скачиваний
Пример Скрипта перезапуска и Планировщика задания
restart-hm.bat
Показать
@Echo Off

:: Завершить дубли процессов если их несколько и запускаем процесс если его нет совсем
:: Получаем количество процессов
for /f %%b in ('tasklist^|find /c /i "LibreHardwareMonitor.exe"') do (
if /i %%b GTR 1 (goto :KILL) else (if /i %%b==0 (goto :START) else (goto :end)))

:KILL
:: Завершить дубли процеса, пропускаем 1 процесс
for /f "skip=1 tokens=2 delims= " %%a in ('tasklist^|find /I "LibreHardwareMonitor.exe"') do (
TASKKILL /PID %%a /T /F )
goto :end

:START
:: Планировщик заданий Остановка процесса
SCHTASKS /End /TN "\LibreHardwareMonitor\Startup"
:: Для старой версии
SCHTASKS /End /TN "LibreHardwareMonitor"
:: Убить процесс если он не завершился
TASKKILL /IM LibreHardwareMonitor.exe /T /F
:: Завершить процесс по PID
for /f "tokens=2 delims= " %%a in ('tasklist^|find /I "LibreHardwareMonitor.exe"') do (
TASKKILL /PID %%a /T /F )

:: Запуск Процесса
:: Выполнить на локальном компьютере задание "Startup" немедленно, игнорируя любые ограничения
SCHTASKS /Run /I /TN "\LibreHardwareMonitor\Startup"
:: Для старой версии
SCHTASKS /Run /TN "LibreHardwareMonitor"

:: Проверка что процесс запустился, если нет запускаем
TaskList /FI "ImageName EQ LibreHardwareMonitor.exe" 2>nul|Find /I "LibreHardwareMonitor.exe">nul||(
Start "" /high "%~dp0LibreHardwareMonitor.exe"
)
restart-hm.bat.xml
Показать
<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
<RegistrationInfo>
<Description>Проверка запущен ли процесс LibreHardwareMonitor, если нет запускаем, если несколько завершаем лишние оставляем 1, если 1 ничего не делаем.</Description>
</RegistrationInfo>
<Triggers>
<BootTrigger>
<Enabled>true</Enabled>
</BootTrigger>
<CalendarTrigger>
<StartBoundary>2020-12-01T00:00:00</StartBoundary>
<Enabled>true</Enabled>
<ScheduleByDay>
<DaysInterval>1</DaysInterval>
</ScheduleByDay>
</CalendarTrigger>
<CalendarTrigger>
<StartBoundary>2020-12-01T06:00:00</StartBoundary>
<Enabled>true</Enabled>
<ScheduleByDay>
<DaysInterval>1</DaysInterval>
</ScheduleByDay>
</CalendarTrigger>
<CalendarTrigger>
<StartBoundary>2020-12-01T12:00:00</StartBoundary>
<Enabled>true</Enabled>
<ScheduleByDay>
<DaysInterval>1</DaysInterval>
</ScheduleByDay>
</CalendarTrigger>
<CalendarTrigger>
<StartBoundary>2020-12-01T18:00:00</StartBoundary>
<Enabled>true</Enabled>
<ScheduleByDay>
<DaysInterval>1</DaysInterval>
</ScheduleByDay>
</CalendarTrigger>
</Triggers>
<Principals>
<Principal id="Author">
<RunLevel>HighestAvailable</RunLevel>
</Principal>
</Principals>
<Settings>
<MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
<DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries>
<StopIfGoingOnBatteries>false</StopIfGoingOnBatteries>
<AllowHardTerminate>true</AllowHardTerminate>
<StartWhenAvailable>true</StartWhenAvailable>
<RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
<IdleSettings>
<StopOnIdleEnd>false</StopOnIdleEnd>
<RestartOnIdle>false</RestartOnIdle>
</IdleSettings>
<AllowStartOnDemand>true</AllowStartOnDemand>
<Enabled>true</Enabled>
<Hidden>true</Hidden>
<RunOnlyIfIdle>false</RunOnlyIfIdle>
<WakeToRun>true</WakeToRun>
<ExecutionTimeLimit>PT1H</ExecutionTimeLimit>
<Priority>1</Priority>
<RestartOnFailure>
<Interval>PT1M</Interval>
<Count>5</Count>
</RestartOnFailure>
</Settings>
<Actions Context="Author">
<Exec>
<Command>C:\zabbix\program\LibreHardwareMonitor\restart-hm.bat</Command>
</Exec>
</Actions>
</Task>
HM.xml
Показать
<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
<RegistrationInfo>
<Description>Эта задача запускает LibreHardwareMonitor при запуске Windows.</Description>
</RegistrationInfo>
<Triggers>
<BootTrigger>
<Enabled>true</Enabled>
</BootTrigger>
</Triggers>
<Principals>
<Principal id="Author">
<RunLevel>HighestAvailable</RunLevel>
</Principal>
</Principals>
<Settings>
<MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
<DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
<StopIfGoingOnBatteries>false</StopIfGoingOnBatteries>
<AllowHardTerminate>true</AllowHardTerminate>
<StartWhenAvailable>true</StartWhenAvailable>
<RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
<IdleSettings>
<StopOnIdleEnd>false</StopOnIdleEnd>
<RestartOnIdle>false</RestartOnIdle>
</IdleSettings>
<AllowStartOnDemand>true</AllowStartOnDemand>
<Enabled>true</Enabled>
<Hidden>false</Hidden>
<RunOnlyIfIdle>false</RunOnlyIfIdle>
<WakeToRun>true</WakeToRun>
<ExecutionTimeLimit>PT0S</ExecutionTimeLimit>
<Priority>1</Priority>
<RestartOnFailure>
<Interval>PT1M</Interval>
<Count>7</Count>
</RestartOnFailure>
</Settings>
<Actions Context="Author">
<Exec>
<Command>"C:\zabbix\program\LibreHardwareMonitor\LibreHardwareMonitor.exe"</Command>
<WorkingDirectory>C:\zabbix\program\LibreHardwareMonitor</WorkingDirectory>
</Exec>
</Actions>
</Task>
Скачать пример
LibreHardwareMonitor.bat.xml.zip
LibreHardwareMonitor.bat.xml.zip
(2.71 КБ) 6 скачиваний
Скачать только скрипты батники без содержания самих ПО
Install Hardware Monitor.zip
Install Hardware Monitor.zip
(27.73 КБ) 9 скачиваний
Тестовые скрипты блоки
Показать
::@echo off
:: Куда будем копировать ПО путь
set way=C:\zabbix\program\
set var="set address="%way%OpenHardwareMonitor\OpenHardwareMonitor.exe"|set name=OpenHardwareMonitor,set address="%way%LibreHardwareMonitor\LibreHardwareMonitor.exe"|set name=LibreHardwareMonitor,set address="%way%HWMonitor\HWMonitor.exe"|set name=HWMonitor"
:: Экранируем пути добавляем кавычки было , стало ","
set var=%var:,=","%
for %%a in (%var%) do (
:: Применяем переменные
for /f "tokens=1,2 delims=|" %%b in (%%a) do (
%%b
%%c
))
echo %address% %name%
pause


::@echo off
:: Куда будем копировать ПО путь
set way=C:\zabbix\program\

:: Переменные для разных ПО
set var="set address="%way%OpenHardwareMonitor\OpenHardwareMonitor.exe"&set name=OpenHardwareMonitor,set address="%way%LibreHardwareMonitor\LibreHardwareMonitor.exe"&set name=LibreHardwareMonitor,set address="%way%HWMonitor\HWMonitor.exe"&set name=HWMonitor"
:: Экранируем пути добавляем кавычки было , стало "," чтобы разделить циклом ПО
set var=%var:,=","%
for %%a in (%var%) do set varp=%%a & call:vsepo
if /i "%varp%1"=="1" (echo :end)

:vsepo
:: Разделяем переменные и Применяем
for /f "tokens=1,2 delims=&" %%b in (%varp%) do (
%%b
%%c
)
echo %address% %name%
:: Сброс переменных после цикла
set "varp="
set "address="
set "name="
pause
количество слов: 1807
Sovka
Гость
Сообщения: 2
Стаж: 2 месяца

Скрипт + Шаблон для Windows LLD Hardware Monitor

Сообщение Sovka »

Артем, спасибо! Штука классная, работает при прямом соединении. Есть ли опыт использования через zabbix-proxy? Много изменений должно быть в настройке?
Почему-то не получается через проксю распинать, не понимаю принцип работы системы через проксю.
количество слов: 2
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 367
Стаж: 2 года 9 месяцев
Откуда: Вологодская область
Контактная информация:

Скрипт + Шаблон для Windows LLD Hardware Monitor

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

Sovka, Нужно знать как запросить zabbix_get через прокси , у меня прокси нет поэтому сказать не могу. Найдешь как выполнить запрос так все должно заработать)
количество слов: 3
Sovka
Гость
Сообщения: 2
Стаж: 2 месяца

Скрипт + Шаблон для Windows LLD Hardware Monitor

Сообщение Sovka »

правильно я понимаю, что sh скрипт нужен для discovery, а уже найденные через wmi.get спокойно забираются сами.
Фактически можно через wmic.exe выбрать то, что нужно и руками в забикс айтемов и тригеров надолбить и будет то, что нужно. Правильно я понял?
количество слов: 6
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 367
Стаж: 2 года 9 месяцев
Откуда: Вологодская область
Контактная информация:

Скрипт + Шаблон для Windows LLD Hardware Monitor

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

Sovka, да все верно. Возможно тебе нужен вариант где обнаружение происходит на узле через агента там же скрипт, есть готовые решения.
Например через скрипты powershell Аппаратное обеспечение Windows оригинал LLD-мониторинг железа под Windows
количество слов: 5
rlz
Гость
Сообщения: 4
Стаж: 1 месяц

Скрипт + Шаблон для Windows LLD Hardware Monitor

Сообщение rlz »

Добрый день. Спасибо за труды и скрипты :) всё круто, всё работает, но есть небольшой вопрос по настройке.
Заранее прошу меня простить за кривые ручки и неопытность :)
На некоторых серверах OHM определяет температуру некоторых элементов материнки. Хотелось бы эту температуру отсечь и оставить только температуру CPU/GPU.
Для сравнения, команда "wmic..... \\root\ohw path sensor" выдает температуру материнки, как "lpc/nct6793d/temperature/*(1-4)*", а температуру CPU, как "intelcpu/0/temperature/(1,2,3...)"
По вашему гайду, понял, что нужно прописать в "Шаблон-Обнаружение датчиков" - "Фильтр" регулярку, но что конкретно тут написать, не понимаю )

+ вопрос по триггеру высокой температуры. Триггер по отдельным датчикам срабатывает, но почему-то отображает информацию, как "HighTemp Датчик {#SensorType} Имя {#Name}", т.е. тэги SensorType и Name почему-то не представляются в реальных значениях, хотя в элементах узла, у датчиков корректные имена.
количество слов: 25
rlz
Гость
Сообщения: 4
Стаж: 1 месяц

Скрипт + Шаблон для Windows LLD Hardware Monitor

Сообщение rlz »

Со вторым вопросом разобрался. Нужно было в триггере изменить {Sensortype} и {Name} на {SENSORTYPE} и {NAME} соответственно. А вот как быть с лишними элементами так и не понял.
количество слов: 4
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 367
Стаж: 2 года 9 месяцев
Откуда: Вологодская область
Контактная информация:

Скрипт + Шаблон для Windows LLD Hardware Monitor

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

rlz, Добрый день!

Прописать макросы в шаблоне или конкретном узле
Например мы хотим оставить данные
{$FILTRHM} Clock\|Temperature\|Fan\|Voltage
Исключить данные (ещё обратную температуру TjMax)
{$HIDEHM} Load\|Control\|Data\|Throughput\|TjMax

Например возьмем Temperature везде где есть строка со словом Temperature он нам её выдаст или наоборот скроет в зависимости в каком макросе ее прописать. \| - можно сказать что это или перечисление слов которые допустимы или нет

Так же играет роль пробела после слова например TemperatureCPU без пробела и с пробелом Temperature CPU будет варьироваться по разному. Например Clock\|Temperature\|Fan\|Voltage в этом случае по падают оба варианта, а если Clock\|Temperature \|Fan\|Voltage попадает только Temperature CPU

Если тебе нужна температура только проца например укажи
{$FILTRHM} Temperature CPU
если будет что то лишнее выходить скрой через
{$HIDEHM} Имя скрытия
количество слов: 32
Ответить Вложения 36 Пред. темаСлед. тема

Вернуться в «Аппаратное обеспечение»