LLD - Обнаружение файлов и их мониторинг Linux и Windows
Проверяются следующие параметры:
1.Наличие файла
2.Размер файла
3.Время изменения файла
4.Время изменения свойств файла
5.Время последнего доступа
Можно дополнить своими проверками.
Подходит для проверки файлов резервного копирования или важных файлов где их не так мало и дабы не прописывать все вручную используем авто обнаружение в указанной директории.
Более подробно:
Может ли проверять на одном узле несколько каталогов с файлами? Да может.
Указываем макросе {$PUTFILE} узла пути через точку с запятой завершающий слеш не нужен
Пример для Windows:
{$PUTFILE} C:\zabbix;C:\Users
Для сети вначале проставить 3 слеша
\\\192.168.ххх.ххх\папка
Пример для Linux:
{$PUTFILE} /root;/home/user
Могу ли я задать порт для подключения? Да.
Указываем в макросе Узла
{$HOST.PORTS} порт по умолчанию в шаблоне указан 10050
Так же есть активный порт, для отправки trappetom и ошибок.
{$HOST.PORTSACTIV} порт по умолчанию в шаблоне указан 10051
Можно ли скрыть или отобразить конкретные файлы ? Да можно.
Для этого можно воспользоваться фильтром в правиле обнаружения или макросами в узле.
{$FILTRFILE} по умолчанию в шаблоне задано отображать все .*
{$HIDEFILE} по умолчанию в шаблоне задано отображать все ^$
Для указания нескольких файлов (перечисления) вид следующий
Файл1\|Файл2\|Файл3 и так далее
* учитывать пробел если он есть иначе короткое слово может попасть под регулярку!
Так же данные фильтра используется в trapper.
Можно использовать фильтра заббикс в правиле обнаружения, тогда они будут работать только для обнаружения, а способ trapper будет запрашивать данные и отправлять данные для всего что найдет просто в никуда для тех элементов которых не будет в заббикс.
Что делать если за время timeout 15-30 секунд не успевает прилететь ответ? На это случае есть дополнительные правила и скрипты работающие через trapper.
Макрос для указания пути где лежит скрипт trapper.
{$SCRIPT.TRAPFILE}
Пример Windows:
C:\zabbix\Scripts\dir-file-trapper-win-cp866-File.bat
Пример Linux:
/etc/zabbix/scripts/dir-file-trappet.sh
Для Windows скриптов trapper есть макрос для указания текущей кодировки узла
{$KODR} по умолчанию в шаблоне указана cp866 (не используется на данный момент)
Так же в скриптах trappet указать IP в переменой IPZBXSERVER=192.168.XXX.XXX
Есть какие то ограничения?
Для Windows trapper (не путать trapper Лог там все ок) где запросы напрямую отправляются с батника для каждого элемента в заббикс не поддерживается русский язык так как не перекодируется в utf-8.
Так же если имя файла начинается на &36.txt то на windows при работе скрипта когда строка не экранирована это вызывает ошибку.
vfs.file.time["/root/test/???? ???????.txt",change] - Cannot obtain file information: [2] No such file or directory
"/home/user/ls: невозможно получить доступ к '/home/user': Нет такого файла или каталога"
34 траппер ошибка
34 работает виде лога траппер
Обычный траппер ошибки
["D:\test\!32.txt"]
["D:\test\№34.txt"]
["D:\test\^35.txt"]
Траппер Лог ошибки
["D:\test\^35.txt"] ошибка на регулярку
["D:\test\!32.txt"] ошибка на регулярку
["D:\test\Тест русский.txt"]
Не работают кривые имена с windows
Преобразует не правильно проверка не проходит
Оригинал
РЎРїРёСЃРєРё РњРќРЎ.xls
Стало
РЎРїРёС?РєРё Р?Р?РЎ.xls
Дата через trappet приходит в обычном формате как текст, для некоторых функций триггера нужно ее перевести в unixtime. (возможно реализую позже)
Файлы с датой в имени, не совсем подходят сюда так как
Сделать авто обнаружение файла так же не вариант так как:
Файл будет каждый день новый сравнить размер не получится, после удаления предыдущих файлов сработает триггер на старые файлы что нет данных, можно конечно выставить удаление через 0 дней если не обнаруживается сразу удалился, если файла нет то и проверка не создастся и мы ничего не узнаем.
Для этого у нас есть другой шаблон Шаблон проверки файлов
Другие нюансы по факту их обнаружения.
В узле указываем макросы
{$PUTFILE} тут указываем путь или пути через точку с запятой где сканировать наличие файлов
Например:
/home/user;/root/bak - находим файлы в 2х папках
C:\zabbix;C:\Users - находим файлы в 2х папках
Завершающий слеш в конце пути не нужен, так же должен быть доступ на проверяемую папку.
При необходимости задаем свой порт
{$HOST.PORTS} по умолчанию 10050
{$HOST.PORTSACTIV} порт по умолчанию в шаблоне указан 10051
Можно задать конкретные имена файлов которые нам необходимы
{$FILTRFILE} по умолчанию все .* несколько файлов: Имя файла1\|Имя файла2\|имя файла3
Можно наоборот скрыть из вывода не нужные файлы
{$HIDEFILE} по умолчанию все показывать все ^$ аналогично несколько файлов: Имя файла1\|Имя файла2\|имя файла3
Аналогично настройки Фильтра в правиле обнаружения можно пользоваться стандартным фильтром
Кодировка задается для Windows Русских названий файлов и дальнейшая перекодировка в UTF-8
{$KODR} по умолчанию cp866 при не об ходимости в узле задайте 1251
Макрос для указания пути где лежит скрипт trapper.
{$SCRIPT.TRAPFILE}
Пример Windows:
C:\zabbix\Scripts\dir-file-trapper-win-cp866-File.bat
Пример Linux:
/etc/zabbix/scripts/dir-file-trappet.sh
Далее все данные поступаю в скрипт size-file.sh при обнаружении файлов.
/usr/local/share/zabbix/externalscripts/
Цепляем шаблон к узлу, указываем необходимые макросы в узле и активируем нужное правило обнаружения.
Вывод Обнаружение файлов в указанной папке
ls -aF путь до файлов и исключить из вывода каталоги |grep -av "/"
dir /a-d /B \ путь до файлов
Проверка со стороны заббикс сервера
Linux
zabbix_get -s 192.168.XXX.XXX -p 10050 -k system.run["ls -aF "путь до файлов"|grep -av "/""]
Windows
zabbix_get -s 192.168.XXX.XXX -p 10050 -k system.run["dir /a-d /B \""путь до файлов"\""]
Команда Ключ Linux
size-file.sh[{HOST.CONN},{$HOST.PORTS},discovery,{$PUTFILE},{$FILTRFILE},{$HIDEFILE},{$KODR},{HOST.HOST},{$HOST.PORTSACTIV}]
/usr/local/share/zabbix/externalscripts/size-file.sh 192.168.xxx.xxx 10050 discovery "/home/user;/root/test" ".*" "^$" "" "HOSTNAME" "10051"
{"{#FILESIZELINUX}":"/root/test/-27.txt", "{#NAMEFILELINUX}":"-27.txt"},
{"{#FILESIZELINUX}":"/root/test/.28.txt", "{#NAMEFILELINUX}":".28.txt"},
{"{#FILESIZELINUX}":"/root/test/,29.txt", "{#NAMEFILELINUX}":",29.txt"},
{"{#FILESIZELINUX}":"/root/test/$30.txt", "{#NAMEFILELINUX}":"$30.txt"},
{"{#FILESIZELINUX}":"/root/test/@31.txt", "{#NAMEFILELINUX}":"@31.txt"},
{"{#FILESIZELINUX}":"/root/test/!32.txt", "{#NAMEFILELINUX}":"!32.txt"},
{"{#FILESIZELINUX}":"/root/test/#33.txt", "{#NAMEFILELINUX}":"#33.txt"},
{"{#FILESIZELINUX}":"/root/test/-34.txt", "{#NAMEFILELINUX}":"-34.txt"},
{"{#FILESIZELINUX}":"/root/test/^35.txt", "{#NAMEFILELINUX}":"^35.txt"},
{"{#FILESIZELINUX}":"/root/test/(37.txt", "{#NAMEFILELINUX}":"(37.txt"},
{"{#FILESIZELINUX}":"/root/test/)38.txt", "{#NAMEFILELINUX}":")38.txt"},
{"{#FILESIZELINUX}":"/root/test/-39.txt", "{#NAMEFILELINUX}":"-39.txt"},
{"{#FILESIZELINUX}":"/root/test/_40.txt", "{#NAMEFILELINUX}":"_40.txt"},
{"{#FILESIZELINUX}":"/root/test/+41.txt", "{#NAMEFILELINUX}":"+41.txt"},
{"{#FILESIZELINUX}":"/root/test/{42.txt", "{#NAMEFILELINUX}":"{42.txt"},
{"{#FILESIZELINUX}":"/root/test/[43.txt", "{#NAMEFILELINUX}":"[43.txt"},
{"{#FILESIZELINUX}":"/root/test/a1.txt", "{#NAMEFILELINUX}":"a1.txt"},
{"{#FILESIZELINUX}":"/root/test/b2.txt", "{#NAMEFILELINUX}":"b2.txt"},
{"{#FILESIZELINUX}":"/root/test/c3.txt", "{#NAMEFILELINUX}":"c3.txt"},
{"{#FILESIZELINUX}":"/root/test/d4.txt", "{#NAMEFILELINUX}":"d4.txt"},
{"{#FILESIZELINUX}":"/root/test/e5.txt", "{#NAMEFILELINUX}":"e5.txt"},
{"{#FILESIZELINUX}":"/root/test/f6.txt", "{#NAMEFILELINUX}":"f6.txt"},
{"{#FILESIZELINUX}":"/root/test/g7.txt", "{#NAMEFILELINUX}":"g7.txt"},
{"{#FILESIZELINUX}":"/root/test/h8.txt", "{#NAMEFILELINUX}":"h8.txt"},
{"{#FILESIZELINUX}":"/root/test/i9.txt", "{#NAMEFILELINUX}":"i9.txt"},
{"{#FILESIZELINUX}":"/root/test/j10.txt", "{#NAMEFILELINUX}":"j10.txt"},
{"{#FILESIZELINUX}":"/root/test/k11.txt", "{#NAMEFILELINUX}":"k11.txt"},
{"{#FILESIZELINUX}":"/root/test/l12.txt", "{#NAMEFILELINUX}":"l12.txt"},
{"{#FILESIZELINUX}":"/root/test/m13.txt", "{#NAMEFILELINUX}":"m13.txt"},
{"{#FILESIZELINUX}":"/root/test/n14.txt", "{#NAMEFILELINUX}":"n14.txt"},
{"{#FILESIZELINUX}":"/root/test/o15.txt", "{#NAMEFILELINUX}":"o15.txt"},
{"{#FILESIZELINUX}":"/root/test/p16.txt", "{#NAMEFILELINUX}":"p16.txt"},
{"{#FILESIZELINUX}":"/root/test/pro bel d", "{#NAMEFILELINUX}":"pro bel d"},
{"{#FILESIZELINUX}":"/root/test/q17.txt", "{#NAMEFILELINUX}":"q17.txt"},
{"{#FILESIZELINUX}":"/root/test/r18.txt", "{#NAMEFILELINUX}":"r18.txt"},
{"{#FILESIZELINUX}":"/root/test/s19.txt", "{#NAMEFILELINUX}":"s19.txt"},
{"{#FILESIZELINUX}":"/root/test/t20.txt", "{#NAMEFILELINUX}":"t20.txt"},
{"{#FILESIZELINUX}":"/root/test/---- -------.txt", "{#NAMEFILELINUX}":"---- -------.txt"},
{"{#FILESIZELINUX}":"/root/test/u21.txt", "{#NAMEFILELINUX}":"u21.txt"},
{"{#FILESIZELINUX}":"/root/test/v22.txt", "{#NAMEFILELINUX}":"v22.txt"},
{"{#FILESIZELINUX}":"/root/test/w23.txt", "{#NAMEFILELINUX}":"w23.txt"},
{"{#FILESIZELINUX}":"/root/test/x24.txt", "{#NAMEFILELINUX}":"x24.txt"},
{"{#FILESIZELINUX}":"/root/test/y25.txt", "{#NAMEFILELINUX}":"y25.txt"},
{"{#FILESIZELINUX}":"/root/test/z26.txt", "{#NAMEFILELINUX}":"z26.txt"}
]
---- ------- тут было слово на русском написанное на Windows b скопировано в Linux
{#NAMEFILELINUX} - Имя файла
Время изменения свойств файла {#FILESIZELINUX} vfs.file.time[{#FILESIZELINUX},change]
Время изменения файла {#FILESIZELINUX} vfs.file.time[{#FILESIZELINUX},modify]
Время последнего доступа {#FILESIZELINUX} vfs.file.time[{#FILESIZELINUX},access]
Наличие файла {#FILESIZELINUX} vfs.file.exists[{#FILESIZELINUX}]
Размер файла {#FILESIZELINUX} vfs.file.size[{#FILESIZELINUX}]
Команда Ключ Windows
size-file.sh[{HOST.CONN},{$HOST.PORTS},discoverywin,{$PUTFILE},{$FILTRFILE},{$HIDEFILE},{$KODR},{HOST.HOST},{$HOST.PORTSACTIV}]
/usr/local/share/zabbix/externalscripts/size-file.sh 192.168.xxx.xxx 10050 discoverywin "C:\Users\Public;D:\test" ".*" "^$" "cp866" "HOSTNAME" "10051"
{"{#FILESIZEWIN}":"C:\\Users\\Public\\desktop.ini", "{#NAMEFILEWIN}":"desktop.ini"},
{"{#FILESIZEWIN}":"D:\\test\\!32.txt", "{#NAMEFILEWIN}":"!32.txt"},
{"{#FILESIZEWIN}":"D:\\test\\#33.txt", "{#NAMEFILEWIN}":"#33.txt"},
{"{#FILESIZEWIN}":"D:\\test\\$30.txt", "{#NAMEFILEWIN}":"$30.txt"},
{"{#FILESIZEWIN}":"D:\\test\\(37.txt", "{#NAMEFILEWIN}":"(37.txt"},
{"{#FILESIZEWIN}":"D:\\test\\)38.txt", "{#NAMEFILEWIN}":")38.txt"},
{"{#FILESIZEWIN}":"D:\\test\\+41.txt", "{#NAMEFILEWIN}":"+41.txt"},
{"{#FILESIZEWIN}":"D:\\test\\,29.txt", "{#NAMEFILEWIN}":",29.txt"},
{"{#FILESIZEWIN}":"D:\\test\\-27.txt", "{#NAMEFILEWIN}":"-27.txt"},
{"{#FILESIZEWIN}":"D:\\test\\-39.txt", "{#NAMEFILEWIN}":"-39.txt"},
{"{#FILESIZEWIN}":"D:\\test\\.28.txt", "{#NAMEFILEWIN}":".28.txt"},
{"{#FILESIZEWIN}":"D:\\test\\@31.txt", "{#NAMEFILEWIN}":"@31.txt"},
{"{#FILESIZEWIN}":"D:\\test\\a1.txt", "{#NAMEFILEWIN}":"a1.txt"},
{"{#FILESIZEWIN}":"D:\\test\\b2.txt", "{#NAMEFILEWIN}":"b2.txt"},
{"{#FILESIZEWIN}":"D:\\test\\c3.txt", "{#NAMEFILEWIN}":"c3.txt"},
{"{#FILESIZEWIN}":"D:\\test\\d4.txt", "{#NAMEFILEWIN}":"d4.txt"},
{"{#FILESIZEWIN}":"D:\\test\\e5.txt", "{#NAMEFILEWIN}":"e5.txt"},
{"{#FILESIZEWIN}":"D:\\test\\f6.txt", "{#NAMEFILEWIN}":"f6.txt"},
{"{#FILESIZEWIN}":"D:\\test\\g7.txt", "{#NAMEFILEWIN}":"g7.txt"},
{"{#FILESIZEWIN}":"D:\\test\\h8.txt", "{#NAMEFILEWIN}":"h8.txt"},
{"{#FILESIZEWIN}":"D:\\test\\i9.txt", "{#NAMEFILEWIN}":"i9.txt"},
{"{#FILESIZEWIN}":"D:\\test\\j10.txt", "{#NAMEFILEWIN}":"j10.txt"},
{"{#FILESIZEWIN}":"D:\\test\\k11.txt", "{#NAMEFILEWIN}":"k11.txt"},
{"{#FILESIZEWIN}":"D:\\test\\l12.txt", "{#NAMEFILEWIN}":"l12.txt"},
{"{#FILESIZEWIN}":"D:\\test\\m13.txt", "{#NAMEFILEWIN}":"m13.txt"},
{"{#FILESIZEWIN}":"D:\\test\\n14.txt", "{#NAMEFILEWIN}":"n14.txt"},
{"{#FILESIZEWIN}":"D:\\test\\o15.txt", "{#NAMEFILEWIN}":"o15.txt"},
{"{#FILESIZEWIN}":"D:\\test\\p16.txt", "{#NAMEFILEWIN}":"p16.txt"},
{"{#FILESIZEWIN}":"D:\\test\\pro bel d.txt", "{#NAMEFILEWIN}":"pro bel d.txt"},
{"{#FILESIZEWIN}":"D:\\test\\q17.txt", "{#NAMEFILEWIN}":"q17.txt"},
{"{#FILESIZEWIN}":"D:\\test\\r18.txt", "{#NAMEFILEWIN}":"r18.txt"},
{"{#FILESIZEWIN}":"D:\\test\\s19.txt", "{#NAMEFILEWIN}":"s19.txt"},
{"{#FILESIZEWIN}":"D:\\test\\t20.txt", "{#NAMEFILEWIN}":"t20.txt"},
{"{#FILESIZEWIN}":"D:\\test\\u21.txt", "{#NAMEFILEWIN}":"u21.txt"},
{"{#FILESIZEWIN}":"D:\\test\\v22.txt", "{#NAMEFILEWIN}":"v22.txt"},
{"{#FILESIZEWIN}":"D:\\test\\w23.txt", "{#NAMEFILEWIN}":"w23.txt"},
{"{#FILESIZEWIN}":"D:\\test\\x24.txt", "{#NAMEFILEWIN}":"x24.txt"},
{"{#FILESIZEWIN}":"D:\\test\\y25.txt", "{#NAMEFILEWIN}":"y25.txt"},
{"{#FILESIZEWIN}":"D:\\test\\z26.txt", "{#NAMEFILEWIN}":"z26.txt"},
{"{#FILESIZEWIN}":"D:\\test\\[43.txt", "{#NAMEFILEWIN}":"[43.txt"},
{"{#FILESIZEWIN}":"D:\\test\\^35.txt", "{#NAMEFILEWIN}":"^35.txt"},
{"{#FILESIZEWIN}":"D:\\test\\_40.txt", "{#NAMEFILEWIN}":"_40.txt"},
{"{#FILESIZEWIN}":"D:\\test\\{42.txt", "{#NAMEFILEWIN}":"{42.txt"},
{"{#FILESIZEWIN}":"D:\\test\\Тест русский.txt", "{#NAMEFILEWIN}":"Тест русский.txt"},
{"{#FILESIZEWIN}":"D:\\test\\№34.txt", "{#NAMEFILEWIN}":"№34.txt"}
]
После создают Элементы данных
{#NAMEFILEWIN} - Имя файла
Время изменения свойств файла {#FILESIZEWIN} vfs.file.time[{#FILESIZEWIN},change]
Время изменения файла {#FILESIZEWIN} vfs.file.time[{#FILESIZEWIN},modify]
Время последнего доступа {#FILESIZEWIN} vfs.file.time[{#FILESIZEWIN},access]
Наличие файла {#FILESIZEWIN} vfs.file.exists[{#FILESIZEWIN}]
Размер файла {#FILESIZEWIN} vfs.file.size[{#FILESIZEWIN}]
Далее у нас идут команды для zabbix trapper
Скрипт для Linux dir-file-trappet.sh
ls -aF путь до файлов|grep -av "/" - отобразить содержимое кроме папок
du -sb --time путь до файлов - размера в байтах и даты изменения разбор по столбцам
du -sb --time=ctime путь до файлов| awk '{print $2, $3}' -Время изменения свойств файла в формате ГГГГ.ММ.ДД ЧЧ:ММ
du -sb --time=atime путь до файлов| awk '{print $2, $3}' -Время последнего доступа в формате ГГГГ.ММ.ДД ЧЧ:ММ
Локальная проверка
/etc/zabbix/scripts/dir-file-trappet.sh "ИмяХоста" "10051" "/путь" ".*" "^$"
Запуск удаленного скрипта обнаружение файлов, через заббикс агент Linux
system.run['{$SCRIPT.TRAPFILE}' "{HOST.HOST}" "{$HOST.PORTSACTIV}" "{$PUTFILE}" "{$FILTRFILE}" "{$HIDEFILE}",nowait]
zabbix_get -s 192.168.XXX.XXX -k system.run[''/etc/zabbix/scripts/dir-file-trappet.sh' 'ИмяХоста' '10051' '/путь' '.*' '^$'',nowait]
zabbix_get -s 192.168.XXX.XXX -k system.run[''/etc/zabbix/scripts/dir-file-trappet.sh' "ИмяХоста" "10051" "/путь" ".*" "^$"']
zabbix_get -s 192.168.XXX.XXX -k system.run[''/etc/zabbix/scripts/dir-file-trappet.sh' "ИмяХоста" "10051" "/путь" ".*" "^$"',nowait]
zabbix_get -s 192.168.XXX.XXX -k system.run["'/etc/zabbix/scripts/dir-file-trappet.sh' 'ИмяХоста' '10051' '/путь' '.*' '^$'",nowait]
/etc/zabbix/scripts/dir-file-trappet.sh: 24: /etc/zabbix/scripts/dir-file-trappet.sh: Syntax error: redirection unexpected
Ошибка так как в скрипте сместилась первая строка #!/bin/bash , первая была пустая вторя содержала #!/bin/bash
Запускается через sh изначально с команды system.run
zabbix_get -s 192.168.XXX.XXX -k system.run[''/etc/zabbix/scripts/dir-file-trappet.sh' "agentzabbixserver" "10051" "/root" ".*" "^$"']
zabbix_get -s 192.168.XXX.XXX -k system.run[''/etc/zabbix/scripts/dir-file-trappet.sh' 'agentzabbixserver' '10051' '/root' '.*' '^$'']
zabbix_get -s 192.168.XXX.XXX -k system.run['"/etc/zabbix/scripts/dir-file-trappet.sh" 'agentzabbixserver' '10051' '/root' '.*' '^$'']
ZBX_NOTSUPPORTED: Invalid item key format.
zabbix_get -s 192.168.XXX.XXX -k system.run['$("/etc/zabbix/scripts/dir-file-trappet.sh" "agentzabbixserver" "10051" "/root" ".*" "^$"),nowait']
1
zabbix_get -s 192.168.XXX.XXX -k system.run['$("/etc/zabbix/scripts/dir-file-trappet.sh" "agentzabbixserver" "10051" "/root" ".*" "^$"),nowait']
1
zabbix_get -s 192.168.XXX.XXX -k system.run['$("/etc/zabbix/scripts/dir-file-trappet.sh" "agentzabbixserver" "10051" "/root" ".*" "^$"),nowait']
1
zabbix_get -s 192.168.XXX.XXX -k system.run['`"/etc/zabbix/scripts/dir-file-trappet.sh" "agentzabbixserver" "10051" "/root" ".*" "^$"`,nowait']
1
zabbix_get -s 192.168.XXX.XXX -k system.run['`"/etc/zabbix/scripts/dir-file-trappet.sh" "agentzabbixserver" "10051" "/root" ".*" "^$"`',nowait]
1
zabbix_get -s 192.168.XXX.XXX -k system.run[`"/etc/zabbix/scripts/dir-file-trappet.sh" "agentzabbixserver" "10051" "/root" ".*" "^$"`,nowai
zabbix_get -s 192.168.XXX.XXX -k system.run['$("/etc/zabbix/scripts/dir-file-trappet.sh" "agentzabbixserver" "10051" "/root" ".*" "^$"),nowait']
1
zabbix_get -s 192.168.XXX.XXX -k system.run['$("/etc/zabbix/scripts/dir-file-trappet.sh" "agentzabbixserver" "10051" "/root" ".*" "^$")']
/etc/zabbix/scripts/dir-file-trappet.sh: 24: /etc/zabbix/scripts/dir-file-trappet.sh: Syntax error: redirection unexpected
zabbix_get -s 192.168.XXX.XXX -k system.run['$("/etc/zabbix/scripts/dir-file-trappet.sh" "agentzabbixserver" "10051" "/root" ".*" "^$")']
/etc/zabbix/scripts/dir-file-trappet.sh: 24: /etc/zabbix/scripts/dir-file-trappet.sh: Syntax error: redirection unexpected
zabbix_get -s 192.168.XXX.XXX -k system.run['$(/etc/zabbix/scripts/dir-file-trappet.sh "agentzabbixserver" "10051" "/root" ".*" "^$")']
/etc/zabbix/scripts/dir-file-trappet.sh: 24: /etc/zabbix/scripts/dir-file-trappet.sh: Syntax error: redirection unexpected
zabbix_get -s 192.168.XXX.XXX -k system.run['$(/etc/zabbix/scripts/dir-file-trappet.sh "'agentzabbixserver'" "'10051'" "'/root'" "'.*'" "'^$'")']
/etc/zabbix/scripts/dir-file-trappet.sh: 24: /etc/zabbix/scripts/dir-file-trappet.sh: Syntax error: redirection unexpected
zabbix_get -s 192.168.XXX.XXX -k system.run['$(/etc/zabbix/scripts/dir-file-trappet.sh '"agentzabbixserver"' '"10051"' '"/root"')']
/etc/zabbix/scripts/dir-file-trappet.sh: 24: /etc/zabbix/scripts/dir-file-trappet.sh: Syntax error: redirection unexpected
zabbix_get -s 192.168.XXX.XXX -k system.run['$(/etc/zabbix/scripts/dir-file-trappet.sh 'agentzabbixserver' '10051' '/root')']
/etc/zabbix/scripts/dir-file-trappet.sh: 24: /etc/zabbix/scripts/dir-file-trappet.sh: Syntax error: redirection unexpected
zabbix_get -s 192.168.XXX.XXX -k system.run['$('/etc/zabbix/scripts/dir-file-trappet.sh' 'agentzabbixserver' '10051' '/root')']
/etc/zabbix/scripts/dir-file-trappet.sh: 24: /etc/zabbix/scripts/dir-file-trappet.sh: Syntax error: redirection unexpected
zabbix_get -s 192.168.XXX.XXX -k system.run['/etc/zabbix/scripts/dir-file-trappet.sh' 'agentzabbixserver' '10051' '/root']
zabbix_get [12244]: invalid parameter "agentzabbixserver"
zabbix_get [12244]: invalid parameter "10051"
zabbix_get [12244]: invalid parameter "/etc]"
Try 'zabbix_get --help' for more information.
zabbix_get -s 192.168.XXX.XXX -k system.run[/etc/zabbix/scripts/dir-file-trappet.sh 'agentzabbixserver' '10051' '/root']
zabbix_get [12540]: invalid parameter "agentzabbixserver"
zabbix_get [12540]: invalid parameter "10051"
zabbix_get [12540]: invalid parameter "/etc]"
Try 'zabbix_get --help' for more information.
zabbix_get -s 192.168.XXX.XXX -k system.run[/etc/zabbix/scripts/dir-file-trappet.sh "agentzabbixserver" "10051" "/root"]
zabbix_get [13012]: invalid parameter "agentzabbixserver"
zabbix_get [13012]: invalid parameter "10051"
zabbix_get [13012]: invalid parameter "/etc]"
Try 'zabbix_get --help' for more information.
zabbix_get -s 192.168.XXX.XXX -k system.run[''/etc/zabbix/scripts/dir-file-trappet.sh' 'agentzabbixserver' '10051' '/root'']
/etc/zabbix/scripts/dir-file-trappet.sh: 24: /etc/zabbix/scripts/dir-file-trappet.sh: Syntax error: redirection unexpected
zabbix_get -s 192.168.XXX.XXX -k system.run[''/etc/zabbix/scripts/dir-file-trappet.sh' 'agentzabbixserver' '10051' '/root' '.*' '^$'']
/etc/zabbix/scripts/dir-file-trappet.sh: 24: /etc/zabbix/scripts/dir-file-trappet.sh: Syntax error: redirection unexpected
Ошибка так как в скрипте сместилась первая строка #!/bin/bash , первая была пустая вторя содержала #!/bin/bash
Запускается через sh изначально с команды system.run
zabbix_get -s 192.168.XXX.XXX -k system.run[''/etc/zabbix/scripts/dir-file-trappet.sh' "agentzabbixserver" "10051" "/root" ".*" "^$"']
Response from "192.168.XXX.XXX:10051": "processed: 1; failed: 0; total: 1; seconds spent: 0.000141"
sent: 1; skipped: 0; total: 1
zabbix_get -s 192.168.XXX.XXX -k system.run[''/etc/zabbix/scripts/dir-file-trappet.sh' "agentzabbixserver" "10051" "/root" ".*" "^$"',nowait]
1
size-file.sh[{HOST.CONN},{$HOST.PORTS},runscript,'{$SCRIPT.TRAPFILE}',"'{HOST.HOST}'","'{$HOST.PORTSACTIV}'","'{$PUTFILE}'","'{$FILTRFILE}'","'{$HIDEFILE}'"]
/size-file.sh 192.168.XXX.XXX 10050 runscript "'/etc/zabbix/scripts/dir-file-trappet.sh'" "'ИмяХоста'" "'10051'" "'/путь'" "'.*'" "'^$'"
Запрос через скрипт Windows
C:\zabbix\Scripts\dir-file-trapper-win-cp866-File.bat "ИмяХоста" "10051" "D:\test" "26.txt" "^$" "cp866"
C:\zabbix\Scripts\dir-file-trapper-win-cp866-File.bat "ИмяХоста" "10051" "D:\test" "26.txt" "^$" "cp866"
C:\zabbix\Scripts\dir-file-trapper-win-cp866-File.bat "ИмяХоста" 10051 "C:\Users\Public;D:\test" ".*" "^$" "cp866"
Запуск удаленного скрипта обнаружение файлов, через заббикс агент Windows
system.run[{$SCRIPT.TRAPFILE} "{HOST.HOST}" "{$HOST.PORTSACTIV}" "{$PUTFILE}" "{$FILTRFILE}" "{$HIDEFILE}" "{$KODR}",nowait]
zabbix_get -s 192.168.XXX.XXX -p 10050 -k system.run['C:\zabbix\Scripts\dir-size-trapper-win-cp866-File.bat "ИмяХоста" "10051" "C:\Users\Public;D:\test" ".*" "^$" "cp866",nowait']
zabbix_get -s 192.168.XXX.XXX -p 10050 -k system.run'[C:\zabbix\Scripts\dir-size-trapper-win-cp866-File.bat "ИмяХоста" "10051" "C:\Users\Public;D:\test" ".*" "^$" "cp866",nowait]'
zabbix_get -s 192.168.XXX.XXX -p 10050 -k system.run['C:\zabbix\Scripts\dir-size-trapper-win-cp866-File.bat "ИмяХоста" "10051" "C:\Users\Public;D:\test" ".*" "^$" "cp866"',nowait]
Вид команды прилетает в лог заббикс агента:
'C:\zabbix\Scripts\dir-size-trapper-win-cp866-File.bat "ИмяХоста" "10051" "C:\Users\Public;D:\test" ".*" "^$" "cp866"'
выполняется уже без одинарных кавычек, первое значение путь до скрипта нельзя включить в кавычки не будет запускаться, если только прописать первую команду на запуск скрипта!
Ошибка:
zabbix_get -s 192.168.ХХХ.ХХХ -p 10050 -k system.run'["C:\zabbix\Scripts\dir-size-trapper-win-cp866-File.bat" "ИмяХоста" "10051" "C:\Users\Public;D:\test" ".*" "^$" "cp866",nowait]'
ZBX_NOTSUPPORTED: Invalid item key format.
Linux экранирование идет сперва двойные кавычки, после одинарные. можно начинать с самого первого элемента
Windows экранирование сперва одинарные кавычки, после двойные. первый элемент экранировать нельзя
Запуск удаленного скрипта обнаружение файлов, через основной Windows
size-file.sh[{HOST.CONN},{$HOST.PORTS},runscriptwin,'{$SCRIPT.TRAPFILE}','"{HOST.HOST}"','"{$HOST.PORTSACTIV}"','"{$PUTFILE}"','"{$FILTRFILE}"','"{$HIDEFILE}"','"{$KODR}"']
/usr/local/share/zabbix/externalscripts/size-file.sh 192.168.XXX.XXX 10050 runscriptwin "C:\zabbix\Scripts\dir-file-trapper-win-cp866-File.bat" '"ИмяХоста"' '"10051"' '"C:\Users\Public;D:\test"' '".*"' '"^$"' '"cp866"'
Тесты слов с пробелами и экранированием
Для ключа в кавычках: traptest["6"]
zabbix_sender -z 192.168.XXX.XXX -p 10051 -s "Имя хоста" -k traptest[\"6\"] -o "4096"
Для ключа в кавычках и с пробелом: traptest["test top"]
zabbix_sender -z 192.168.XXX.XXX -p 10051 -s "Имя хоста" -k traptest[\""test top"\"] -o "40999996"
Для ключа без кавычек с пробелом: traptest[test top] (На выходе с траппера кавычки нужны в элементе нет)
zabbix_sender -z 192.168.XXX.XXX -p 10051 -s "Имя хоста" -k traptest["test top"] -o "409554jjj44556"
Без кавычек не создается элемент со спец символами например: folder["/root/test/,29"]
Linux Обнаружение файлов в определенной директории
Windows Обнаружение файлов в определенной директории
Правило обнаружения: Linux Обнаружение файлов в определенной директории
Тип: Внешняя проверка
Ключ: size-file.sh[{HOST.CONN},{$HOST.PORTS},discovery,{$PUTFILE},{$FILTRFILE},{$HIDEFILE},{$KODR},{HOST.HOST},{$HOST.PORTSACTIV}]
Интервал обновления: 24h
Период сохранения потерянных ресурсов: 7d
Описание:
Директория где искать задается в Макросе узла
Так же указать порт если он отличается от 10050
Тип: Zabbix Агент
Ключ: vfs.file.time["{#FILESIZELINUX}",change]
Тип информации: Числовой (с плавающей точкой)
Единица измерения: unixtime
Интервал обновления: 6h
Группы элементов данных: Проверка файлов
Описание: в формате ДД.ММ.ГГГГ ЧЧ:ММ:СС
Создать активированным: V
Тип: Zabbix Агент
Ключ: vfs.file.time["{#FILESIZELINUX}",modify]
Тип информации: Числовой (с плавающей точкой)
Единица измерения: unixtime
Интервал обновления: 6h
Группы элементов данных: Проверка файлов
Описание: в формате ДД.ММ.ГГГГ ЧЧ:ММ:СС
Создать активированным: V
Тип: Zabbix Агент
Ключ: vfs.file.time["{#FILESIZELINUX}",access]
Тип информации: Числовой (с плавающей точкой)
Единица измерения: unixtime
Интервал обновления: 6h
Группы элементов данных: Проверка файлов
Описание: в формате ДД.ММ.ГГГГ ЧЧ:ММ:СС
Создать активированным:
Тип: Zabbix Агент
Ключ: vfs.file.exists["{#FILESIZELINUX}"]
Тип информации: Числовой (целое положительное)
Единица измерения:
Интервал обновления: 6h
Группы элементов данных: Проверка файлов
Описание:
1 - файл найден
0 - файл не найден
Создать активированным: V
Тип: Zabbix Агент
Ключ: vfs.file.size["{#FILESIZELINUX}"]
Тип информации: Числовой (с плавающей точкой)
Единица измерения: B
Интервал обновления: 6h
Группы элементов данных: Проверка файлов
Описание: Запрос 4 раза в сутки, получаем размер файла в байтах
Создать активированным: V
Прототипы триггеров
Важность: Средняя
Выражение:
{Discovery-size-file:vfs.file.size["{#FILESIZELINUX}"].last()}>9663676416 or
{Discovery-size-file:vfs.file.size["{#FILESIZELINUX}"].nodata(25h)}=1
Разрешить закрывать вручную: V
Описание:
Размер файла {#FILESIZELINUX} на {HOST.NAME} более ГБ
Последнее значение: {ITEM.VALUE} {ITEM.LASTVALUE} ({TIME})
Если данных нет 25 часов ошибка
Создать активированным: V
Важность: Средняя
Выражение:
{Discovery-size-file:vfs.file.exists["{#FILESIZELINUX}"].max(25h)}=0 or
{Discovery-size-file:vfs.file.time["{#FILESIZELINUX}",modify].fuzzytime(25h)}=0 or
{Discovery-size-file:vfs.file.size["{#FILESIZELINUX}"].last(#2)}/{Discovery-size-file:vfs.file.size["{#FILESIZELINUX}"].last()}<0.9 or
{Discovery-size-file:vfs.file.size["{#FILESIZELINUX}"].last()}/{Discovery-size-file:vfs.file.size["{#FILESIZELINUX}"].last(#2)}>1.1
Разрешить закрывать вручную: V
Описание:
Проверки:
1.Наличие файла
2.Дата изменения файла не более 25 часов
3.Проверяем что файл не битый и увеличения размера происходит нормально.
Старый размер делим на новый должно быть не меньше <0.9 или
новый размер файла делить на старый значение должно быть не больше>1.1
Значение должно быть в районе 1
Путь {#FILESIZELINUX}
Создать активированным: V
Прототипы триггеров так же аналогичны Linux прототипам
Отличие в макросах:
{#NAMEFILEWIN} - Имя файла
{#FILESIZEWIN} - путь и имя файла
При возникновении ошибки в правиле обнаружения ошибка прилетает в элемент данных
Тип: Zabbix траппер
Ключ: errordiscoveryfile
Тип информации: Текст
Период хранения истории: 90d
Группы элементов данных: Проверка файлов
Активировано: V
Код: Выделить всё
#!/bin/bash
#2021/09/01 v1
# Автор Мамзиков Артём Андреевич Описание по скрипту
# Получение списка файлов в папке в определенной директории и мониторинг их размера
# Объявим входные переменные(variable) и если входная переменная пустая задаем дефолтные настройки для некоторых переменных
IP=$1
PORT=${2:-10050}
BLOCSCRIPT=$3
DIRPUT=$4
FILTR=${5:-.*}
HIDE=${6:-^$}
KODR="${7:-cp866}"
HOSTNAME=$8
ACTIVPORT=${9:-10051}
# Для теста просмотр входных переменных
STV=$(date "+%F %T")
#echo "${STV}" "${IP}" "${PORT}" "${BLOCSCRIPT}" "${DIRPUT}" "${FILTR}" "${HIDE}" "${HOSTNAME}" "${ACTIVPORT}" >> /tmp/log
IFS=$'\n'
SEP=""
if [[ $BLOCSCRIPT = "discovery" ]]
then
# Проверка нескольких директорий на 1 хосте, делим через ;
IFS=';' read -ra sumdir < <(echo $DIRPUT)
# Печать разделенной строки
for puti in "${sumdir[@]}"
do
# ls -aF a -отобразить все содержимое, параметр F -Добавить специальные символы к именам файлов, которые показывают, что это за файл, -v "/" не отображать директории(папки)
get=`zabbix_get -s $IP -p $PORT -k system.run["ls -aF "${puti}"|grep -av "/""]`
# Запрашиваем файлы в папке циклом, так же можем задать соответствие имен через |
#for filep in $(echo "${get}" 2>/dev/null| grep -i -E -a -w "$5")
# убрать спец символы в конце файлов|Для выполнения команды в sed указать команду $(команда) например $(date +"%d.%m.%Y") можно дополнить \|искомые\|искомые'/Ip' получаем sed -n '/'$(date +"%d.%m.%Y")'\|искомые\|искомые'/Ip'
for filep in $(echo "${get}" 2>/dev/null|sed 's/\*$\|\@$//g'|sed -n '/'$FILTR'/Ip'|sed -e '/'$HIDE'/d')
do
JSON=$JSON"$SEP\n{\"{#FILESIZELINUX}\":\""${puti}"/$filep\", \"{#NAMEFILELINUX}\":\"$filep\"}"
SEP=", "
done
done
# Выводим результат в json
JSON="["$JSON"\n]"
echo -e "${JSON}"
fi
if [[ $BLOCSCRIPT = "discoverywin" ]]
then
# Проверка нескольких директорий на 1 хосте, делим через ;
IFS=';' read -ra sumdir < <(echo $DIRPUT)
# Печать разделенной строки
for puti in "${sumdir[@]}"
do
get=`zabbix_get -s $IP -p $PORT -k system.run["dir /a-d /B \""${puti}"\""]`
# Избавимся от CR Возврат каретки если нужно можно еще от LF Перевод строки \r \n ; главное убрать \r иначе ломает весь вывод
obr=$(echo "${get}"|tr -d '\r')
# Запрашиваем файлы циклом
#for filep in "${obr}"
# Если корректно не отображается русский перекодируем из cp866 или cp1251 в utf8
for filep in $(echo "${obr}"|iconv -f "${KODR}" -t utf8| sed -n '/'$FILTR'/Ip'|sed -e '/'$HIDE'/d')
do
# Для передачи на заббикс сервер при выводе должно быт два слеша \\ (на каждом этапе теряется 1 слеш и 1 слеш экранирует другой)
#put=$(echo "${puti}"|sed 's/\\/\\\\\\/g')
SL='\\\'
put="${puti//\\/\'\\\\\\\'}"
JSON=$JSON"$SEP\n{\"{#FILESIZEWIN}\":\""${put}"'$SL'"${filep}"\", \"{#NAMEFILEWIN}\":\"$filep\"}"
# Ввиду сложности передачи слешей windows, преобразуем в пути \ в обратные слеши /
#put=$(echo "${puti}"|sed 's/\\/\//g')
#put="${puti//\\//}"
# Объединим все в один путь, в одну выходную переменную
#JSON=$JSON"$SEP\n{\"{#FILESIZEWIN}\":\""${put}"/$filep\", \"{#NAMEFILEWIN}\":\"$filep\"}"
SEP=", "
done
done
# Выводим результат в json
JSON="["$JSON"\n]"
# Вывод построчно с экранированными кавычками слешами '\\'
JSON=$(echo -e "${JSON}")
# Избавимся от одинарных кавычек ' и получим читаемый построчный вариант
echo "${JSON//\'/}"
fi
# Проверка на ошибки, так как для 1 узла одновременно могут быть указаны несколько программ одна из них может давать ошибку в этом случае от другой программы JONS не примется, поэтому скрываем ошибки
# Ответы с хоста|Преобразуем в 1 строку|Ищем регуляркой ошибки, если найдено выводим ERROR и убираем из вывода HW с ошибкой. А ошибки отправляем траппером в элемент "Ошибки Правила Обнаружения HM"|Скрыть вывод
check=$(echo "${get}"|tr -d '\r\n'| sed -n 's/No Instance(s) Available.*\|Node.*\|ERROR.*\|Invalid.*\|fatal:.*\|команда не найдена.*\|.*невозможно получить доступ.*\|.*Cannot obtain file information.*\|.*Нет такого файла или каталога.*\|.*No such file or directory.*\|.*Файл не найден.*/ERROR/Ip')
# Указываем IP или DNS Заббикс сервера, по умолчанию должно работать localhost так как скрипт находится на самом сервере заббикс.
IPZBXSERVER=localhost
# Очистить строки если ошибка в ПО, по имени программы удалим строки из вывода содержащие ее.; отправить траппер с ошибкой.
if [[ ${check} == *ERROR* ]]; then zabbix_sender -z $IPZBXSERVER -p $ACTIVPORT -s ""${HOSTNAME}"" -k errordiscoveryfile -o ""${get}"" > /dev/null;fi
if [[ $BLOCSCRIPT = "runscript" ]]
then
zabbix_get -s $IP -p $PORT -k system.run["$4 $5 $6 $7 $8 $9 ${10}",nowait]
# Для тестирования вывод в лог
#SDATE=`date '+%d.%m.%y %H:%M:%S'`
#echo ${SDATE} zabbix_get -s $1 -p $2 -k system.run["$4 $5 $6 $7 $8 $9 ${10}",nowait] >> /tmp/log
fi
if [[ $BLOCSCRIPT = "runscriptwin" ]]
then
# Удалим одинарные кавычки из входных переменных, так как они не принимаются в cmd нужны только 2-ные кавычки
four=`echo $4|sed 's/^'\''\|'\''$//g'`
five=`echo $5|sed 's/^'\''\|'\''$//g'`
six=`echo $6|sed 's/^'\''\|'\''$//g'`
seven=`echo $7|sed 's/^'\''\|'\''$//g'`
eight=`echo $8|sed 's/^'\''\|'\''$//g'`
nine=`echo $9|sed 's/^'\''\|'\''$//g'`
ten=`echo ${10}|sed 's/^'\''\|'\''$//g'`
zabbix_get -s $IP -p $PORT -k system.run["${four} ${five} ${six} ${seven} ${eight} ${nine} ${ten}",nowait]
# Для тестирования вывод в лог
#SDATE=`date '+%d.%m.%y %H:%M:%S'`
#echo ${SDATE} zabbix_get -s $1 -k system.run["${four} ${five} ${six} ${seven} ${eight} ${nine} ${ten}",nowait] >> /tmp/log
fi
2 Способ получение данных через trapper
Обнаружение происходит аналогично 1 способу, но прототипы элементов отличаются от первого варианта.
Для долгих запросов которые не успевают опоросится через Zabbix Agent.
Тип: Внешняя проверка
Ключ: size-file.sh[{HOST.CONN},{$HOST.PORTS},discovery,{$PUTFILE},{$FILTRFILE},{$HIDEFILE},{$KODR},{HOST.HOST},{$HOST.PORTSACTIV},trapper]
Интервал обновления: 24h
Период сохранения потерянных ресурсов: 7d
Описание:
Директория где искать задается в Макросе узла
Так же указать порт если он отличается от 10050
Для долгих запросов, используем скрипт, через крон или заббикс элемент и траппер для передачи данных информации о файлах
Тип: Zabbix траппер
Ключ: trapstimechange["{#FILESIZELINUX}"]
Тип информации: Текст
Группы элементов данных: Проверка файлов
Описание: в формате ДД.ММ.ГГГГ ЧЧ:ММ:СС
Создать активированным: V
Отличие в том что:
1.В имя добавлено: Trapper-
2.Тип: Zabbix траппер
3.Ключи: trapstimechange["{#FILESIZELINUX}"] ; trapstimemodify["{#FILESIZELINUX}"] ; trapstimeaccess["{#FILESIZELINUX}"] ; trapexists["{#FILESIZELINUX}"] ; trapsizefile["{#FILESIZELINUX}"]
Данные приходят в элементы при помощи скрипта который необходимо поместить на наблюдаемый узел.
Пример расположения: /etc/zabbix/scripts/dir-file-trappet.sh
Код: Выделить всё
#!/bin/bash
# Входные данные $1 -Имя узла сети {HOST.HOST} ; $2 -Активный порт агента ;$3 - директории через точку запятую какие нужно проверить
# Пример команды ./ИмяТекущегоСкрипта.sh "HOST.HOST" "/root;/var/www/owncloud/data"
# Данный скрипт в указанной папке сканирует файлы, далее поочередно запрашивает их размер
# Объявим входные переменные(variable) и если входная переменная пустая задаем дефолтные настройки для некоторых переменных
NAMEHOST=$1
PORT=${2:-10051}
DIRPUT=$3
FILTR=${4:-.*}
HIDE=${5:-^$}
# Для теста просмотр входных переменных
STV=$(date "+%F %T")
#echo "${STV}" "${NAMEHOST}" "${DIRPUT}" "${FILTR}" "${HIDE}" >> log
# Указываем IP или DNS Заббикс сервера, по умолчанию должно работать localhost так как скрипт находится на самом сервере заббикс.
IPZBXSERVER=192.168.175.111
# Проверка нескольких директорий на 1 хосте, делим через ;
IFS=';' read -ra sumdir < <(echo "${DIRPUT}")
# Печать разделенной строки
for puti in "${sumdir[@]}"
do
# # ls -aF a -отобразить все содержимое, параметр F -Добавить специальные символы к именам файлов, которые показывают, что это за файл|скроем из вывода директории (папки)
get=`ls -aF "${puti}"|grep -av "/"`
# Запрашиваем файлы циклом
IFS=$'\n'
for filep in $(echo "${get}" 2>/dev/null|sed 's/\*$\|\@$//g'|sed -n '/'$FILTR'/Ip'|sed -e '/'$HIDE'/d')
do
putfile="${puti}"/"${filep}"
#Наличие файла
if [ -f "${putfile}" ]; then exists=1; else exists=0; fi
# Получение размера в байтах и даты изменения
features=`du -sb --time "${putfile}"`
# Получение размера в байтах | первый столбец
sizefile=`echo "${features}"| awk '{print $1}'`
# Время изменения файла в формате ГГГГ.ММ.ДД ЧЧ:ММ
timemodify=`echo "${features}"| awk '{print $2, $3}'`
# Время изменения свойств файла в формате ГГГГ.ММ.ДД ЧЧ:ММ
timechange=`du -sb --time=ctime "${putfile}"| awk '{print $2, $3}'`
# Время последнего доступа в формате ГГГГ.ММ.ДД ЧЧ:ММ
timeaccess=`du -sb --time=atime "${putfile}"| awk '{print $2, $3}'`
# Формирование массива JONS
JSON=$JSON""${putfile}" exists:"${exists}" sizefile:"${sizefile}" timemodify:"${timemodify}" timechange:"${timechange}" timeaccess:"${timeaccess}"\n"
# Вывод по очередно и отправка траппетом для каждого файла отдельно, Для правила обнаружения Linux Обнаружение Файлов в определенной директории Trapper
#echo "${putfile}" exists:"${exists}" sizefile:"${sizefile}" timemodify:"${timemodify}" timechange:"${timechange}" timeaccess:"${timeaccess}"
# Отправка данных Наличие файла
#zabbix_sender -z "${IPZBXSERVER}" -p "${PORT}" -s ""${NAMEHOST}"" -k trapexists[\"""${putfile}""\"] -o ""${exists}""
# Отправка данных Размер файла
#zabbix_sender -z "${IPZBXSERVER}" -p "${PORT}" -s ""${NAMEHOST}"" -k trapsizefile[\"""${putfile}""\"] -o ""${sizefile}""
# Отправка данных Время изменения файла
#zabbix_sender -z "${IPZBXSERVER}" -p "${PORT}" -s ""${NAMEHOST}"" -k trapstimemodify[\"""${putfile}""\"] -o ""${timemodify}""
# Отправка данных Время изменения свойств файла
#zabbix_sender -z "${IPZBXSERVER}" -p "${PORT}" -s ""${NAMEHOST}"" -k trapstimechange[\"""${putfile}""\"] -o ""${timechange}""
# Отправка данных Время последнего доступа
#zabbix_sender -z "${IPZBXSERVER}" -p "${PORT}" -s ""${NAMEHOST}"" -k trapstimeaccess[\"""${putfile}""\"] -o ""${timeaccess}""
# Очистка переменных, от случайного попадания предыдущего значения
exists=
sizefile=
timemodify=
timechange=
timeaccess=
done
done
# Вывод одним списком для всех файлов и отправка в виде Лога, Для правила обнаружения Linux Обнаружение Файлов в определенной директории Trapper Логом, через элемент Info-File-Trapper-LOG-Linux
#echo -e "${JSON}"
# Вывод визуально построчно
JSON=$(echo -e "${JSON}")
zabbix_sender -z "${IPZBXSERVER}" -p "${PORT}" -s ""${NAMEHOST}"" -k filelog -o "${JSON}"
# Проверка на ошибки, так как для 1 узла одновременно могут быть указаны несколько программ одна из них может давать ошибку в этом случае от другой программы JONS не примется, поэтому скрываем ошибки
# Ответы с хоста|Преобразуем в 1 строку|Ищем регуляркой ошибки, если найдено выводим ERROR и убираем из вывода HW с ошибкой. А ошибки отправляем траппером в элемент "Ошибки Правила Обнаружения HM"|Скрыть вывод
check=$(echo "${get}"|tr -d '\r\n'| sed -n 's/No Instance(s) Available.*\|Node.*\|ERROR.*\|Invalid.*\|fatal:.*\|команда не найдена.*\|невозможно получить доступ.*\|Cannot obtain file information.*\|Нет такого файла или каталога.*\|No such file or directory.*\|.*Файл не найден.*/ERROR/Ip')
# Очистить строки если ошибка в ПО, по имени программы удалим строки из вывода содержащие ее.; отправить траппер с ошибкой.
if [[ ${check} == *ERROR* ]]; then zabbix_sender -z "${IPZBXSERVER}" -p "${PORT}" -s ""${NAMEHOST}"" -k errordiscoveryfile -o ""${get}"" > /dev/null;fi
Код: Выделить всё
# Отправка данных Наличие файла
zabbix_sender -z "${IPZBXSERVER}" -p "${PORT}" -s ""${NAMEHOST}"" -k trapexists[\"""${putfile}""\"] -o ""${exists}""
# Отправка данных Размер файла
zabbix_sender -z "${IPZBXSERVER}" -p "${PORT}" -s ""${NAMEHOST}"" -k trapsizefile[\"""${putfile}""\"] -o ""${sizefile}""
# Отправка данных Время изменения файла
zabbix_sender -z "${IPZBXSERVER}" -p "${PORT}" -s ""${NAMEHOST}"" -k trapstimemodify[\"""${putfile}""\"] -o ""${timemodify}""
# Отправка данных Время изменения свойств файла
zabbix_sender -z "${IPZBXSERVER}" -p "${PORT}" -s ""${NAMEHOST}"" -k trapstimechange[\"""${putfile}""\"] -o ""${timechange}""
# Отправка данных Время последнего доступа
zabbix_sender -z "${IPZBXSERVER}" -p "${PORT}" -s ""${NAMEHOST}"" -k trapstimeaccess[\"""${putfile}""\"] -o ""${timeaccess}""
Код: Выделить всё
#zabbix_sender -z "${IPZBXSERVER}" -p "${PORT}" -s ""${NAMEHOST}"" -k filelog -o "${JSON}"
Запуск происходит через элемент данных в заббиксе, при желании можно сделать через Cron указав переменные.
Тип: Zabbix Агент
Ключ: system.run['{$SCRIPT.TRAPFILE}' "{HOST.HOST}" "{$HOST.PORTSACTIV}" "{$PUTFILE}" "{$FILTRFILE}" "{$HIDEFILE}",nowait]
Тип информации: Числовой(целое положительное)
Интервал обновления: 6h
Группы элементов данных: Проверка файлов
Описание:
Запуск удаленного скрипта, через заббикс агент
Для получение данных о размере файлов через trapper
Вместо крона запуск со стороны заббикс сервера
Активировано:
Тип: Внешняя проверка
Ключ: size-file.sh[{HOST.CONN},{$HOST.PORTS},runscript,'{$SCRIPT.TRAPFILE}',"'{HOST.HOST}'","'{$HOST.PORTSACTIV}'","'{$PUTFILE}'","'{$FILTRFILE}'","'{$HIDEFILE}'"]
Тип информации: Числовой(целое положительное)
Интервал обновления: 6h
Группы элементов данных: Проверка файлов
Описание:
Запуск удаленного скрипта, через основной
Для получение данных о размере файлов через trapper
Вместо крона запуск со стороны заббикс сервера
Получаем команду
zabbix_get -s $IP -p $PORT -k system.run["$4 $5 $6 $7 $8 $9 ${10}",nowait]
Активировано:
3 Способ получение данных через trapper-Log
Похож на 2 способ, отличие в том что скрипт (тот же самый dir-file-trappet.sh) собирает данные и одним разом отправляет их в 1 элемент данных. Далее прототипы элементов данных Зависимы от основанного элемента куда пришли все данные, после предобработкой регулярным выражением разбираются данные.
Данная строка должны быть раскомментирована
Код: Выделить всё
zabbix_sender -z "${IPZBXSERVER}" -p "${PORT}" -s ""${NAMEHOST}"" -k filelog -o "${JSON}"
Возможно для таких случаев сделать условие в скрипте и добавить макрос. (лишний раз впустую не запускать zabbix_sender и не отправлять данные в никуда)
Данные будут попадать в элемент:
Тип: Zabbix траппер
Ключ: filelog
Тип информации: Текст
Период хранения истории: 90d
Группы элементов данных: Проверка файлов
Описание:
Для долгих элементов подсчета размера файлов
Общий Лог пути и размер файлов, на него настраиваем зависимые элементы
Активировать необходимо если используется правило авто обнаружения
Linux Обнаружение файлов в определенной директории Trapper Логом
Активировано: V
Тип: Внешняя проверка
Ключ: size-file.sh[{HOST.CONN},{$HOST.PORTS},discovery,{$PUTFILE},{$FILTRFILE},{$HIDEFILE},{$KODR},{HOST.HOST},{$HOST.PORTSACTIV},trapper_log]
Интервал обновления: 24h
Период сохранения потерянных ресурсов: 7d
Описание:
Директория где искать задается в Макросе узла
Так же указать порт если он отличается от 10050
Для долгих запросов,используем скрипт, через крон или элемент заббикс далее траппер отправляет данные одним разом (логом) в 1 элемент, после зависимые элементы распаривают данные.
Тип: Зависимый элемент данных
Основной элемент данных: Обнаружение файлов и запрос их размера: Info-File-Trapper-LOG-Linux
Ключ: logtimechange["{#FILESIZELINUX}"]
Тип информации: Текст
Группы элементов данных: Проверка файлов
Описание:
Получаем Время изменения свойств файла {#NAMEFILELINUX} с помощью скрипта и траппера , которые долго обсчитываются. Получаем их из общего лога элемента и обрабатываем регулярным выражением.
Полный путь {#FILESIZELINUX}
формате ГГГГ.ММ.ДД ЧЧ:ММ
Создать активированным: V
Предобработка
Регулярное выражение
{#FILESIZELINUX}.*timechange:(.*) timeaccess:
вывод \1
Отличие в том что:
1.В имя добавлено: Trapper-LOG-
2.Тип: Зависимый элемент данных
3.Основной элемент данных: Обнаружение файлов и запрос их размера: Info-File-Trapper-LOG-Linux
4.Ключи: logtimechange["{#FILESIZELINUX}"] ; logtimemodify["{#FILESIZELINUX}"] ; logtimeaccess["{#FILESIZELINUX}"] ; logexists["{#FILESIZELINUX}"] ; logsizefile["{#FILESIZELINUX}"]
5. Предобработка: регулярное выражение
{#FILESIZELINUX}.*timechange:(.*) timeaccess:
{#FILESIZELINUX}.*timemodify:(.*) timechange
{#FILESIZELINUX}.*timeaccess:(.*)
{#FILESIZELINUX}.*exists:(.*) sizefile:
{#FILESIZELINUX}.*sizefile:(.*) timemodify:
Вывод везде в: \1