Ad Widget

Collapse

Мониторинг создания новых файлов

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • LeoZepp
    Member
    • Jun 2016
    • 47

    #1

    Мониторинг создания новых файлов

    Есть задача: необходимо мониторить появление новых файлов в папке на вин сервере. При появлении алармить.

    Пробовал настроить через Zabbix траппер - но не понял где прописывается путь к папке которую необходимо мониторить.

    Буду признателен за помощь, возможно есть другое решение?
  • aceko
    Member
    • Aug 2013
    • 32

    #2
    CMD/PowerShell скрипт мониторит папку и если находит файл передает таперу в качестве ключа -o ***

    Code:
    $Zabbix_send = "C:\zabbix\zabbix_sender.exe"
    $zabbix_config = "C:\zabbix\zabbix_agentd.win.conf"
    $cmd = "$Zabbix_send -c $zabbix_config -k `"$key`" -o $value"
    Код взят с https://habrahabr.ru/post/267189/

    Comment

    • LeoZepp
      Member
      • Jun 2016
      • 47

      #3
      Originally posted by aceko
      CMD/PowerShell скрипт мониторит папку и если находит файл передает таперу в качестве ключа -o ***

      Code:
      $Zabbix_send = "C:\zabbix\zabbix_sender.exe"
      $zabbix_config = "C:\zabbix\zabbix_agentd.win.conf"
      $cmd = "$Zabbix_send -c $zabbix_config -k `"$key`" -o $value"
      Код взят с https://habrahabr.ru/post/267189/
      Можно выполнить через UserParametr в настройках агента? не очень пока понятно как реализовано.

      Comment

      • aceko
        Member
        • Aug 2013
        • 32

        #4
        Возможно. но думаю проще писать в лог файл и запускать планировщиком системы если не сильно часто и потом этот лог уже забиксом вытягивать.

        Я так сделал для поиска скрытых папок на файловом севере(вирусы скрывают и подменяют екзшниками).

        Comment

        • LeoZepp
          Member
          • Jun 2016
          • 47

          #5
          Originally posted by aceko
          Возможно. но думаю проще писать в лог файл и запускать планировщиком системы если не сильно часто и потом этот лог уже забиксом вытягивать.

          Я так сделал для поиска скрытых папок на файловом севере(вирусы скрывают и подменяют екзшниками).
          увы, но дергать скрипт придется часто (проверка хотя бы раз в 10мин) поэтому планировщик задач не очень подходит.

          Comment

          • LeoZepp
            Member
            • Jun 2016
            • 47

            #6
            Как альтернативный вариант - проверять время изменения папки и если изменилось, то выдавать аларм.

            Comment

            • Kos
              Senior Member
              Zabbix Certified SpecialistZabbix Certified Professional
              • Aug 2015
              • 3404

              #7
              Originally posted by leozepp
              Есть задача: необходимо мониторить появление новых файлов в папке на вин сервере. При появлении алармить.
              Задача слишком нечётко поставлена, чтобы предлагать что-то конкретное.
              Вас интересует появление только одного конкретного файла с заранее известным именем, любого файла в папке или же какого-то промежуточного варианта (например, по маске - вроде файлов с определённым расширением)?
              В нормальном состоянии папка должна быть пустой (т.е. допустимо реагировать на признак "непустая") или же в ней могут быть какие-то файлы?
              Если файлы уже есть - как на них реагировать (т.е. как отличить "старые" от "новых")?
              Если нормальное состояние - пустая папка, то кто и каким образом её чистит?
              Если в папке появилось несколько файлов - то нужно слать оповещение на каждый из них, или же один раз на всю папку? По какому критерию сбрасывать сработавший триггер (кто-то удалил файл, кто-то удалил все файлы, просто по тайм-ауту и т.п.)?
              ...ну и так далее. Словом, опишите задачу подробнее - зачем Вам это надо, может, что-нибудь и предложим.

              Comment

              • LeoZepp
                Member
                • Jun 2016
                • 47

                #8
                Originally posted by kos
                Задача слишком нечётко поставлена, чтобы предлагать что-то конкретное.
                Вас интересует появление только одного конкретного файла с заранее известным именем, любого файла в папке или же какого-то промежуточного варианта (например, по маске - вроде файлов с определённым расширением)?
                В нормальном состоянии папка должна быть пустой (т.е. допустимо реагировать на признак "непустая") или же в ней могут быть ккие-то файлы?
                Если файлы уже есть - как на них реагировать (т.е. отичить "старые" от "новых")?
                Если нормальное состояние - пустая папка, то кто и каким образом её чистит?
                Если в папке появилось несколько файлов - то нужно слать оповещение на каждый из них или же один раз на всю папку? По какому критерию сбрасывать сработавший триггер (кто-то удалил файл, кто-то удалил все файлы, не ждать удалений, а сбрасывать по тайм-ауту и т.д.)?
                ...ну и так далее. Словом, опишите задачу подробнее - зачем Вам это надо, может, что-нибудь и предложим.
                Аларм при появлении любого файла, в ней есть другие файлы (их в исключения добавить). На уже имеющиеся файлы никак не реагировать. Если появилось несколько файлов, то можно оповещать и по каждому отдельно, и на всю папку оповещение (первое предпочтительнее). Сброс триггера при удалении файла.

                Comment

                • aceko
                  Member
                  • Aug 2013
                  • 32

                  #9
                  Originally posted by leozepp
                  Аларм при появлении любого файла, в ней есть другие файлы (их в исключения добавить). На уже имеющиеся файлы никак не реагировать. Если появилось несколько файлов, то можно оповещать и по каждому отдельно, и на всю папку оповещение (первое предпочтительнее). Сброс триггера при удалении файла.
                  удалено ошибся.
                  Last edited by aceko; 27-10-2016, 12:24.

                  Comment

                  • Kos
                    Senior Member
                    Zabbix Certified SpecialistZabbix Certified Professional
                    • Aug 2015
                    • 3404

                    #10
                    Ну, например, у меня была подобная задача: информировать о новых XML-файлах, если они появляются в заданных папках C:\WORK\AAA\ или C:\WORK\BBB\ (проверять раз в 5 минут).
                    Потом добавилась ещё задача: информировать об XML-файлах, которые появились в папке C:\WORK\CCC\ и лежат там более пяти минут (если меньше - то всё ОК). Правда, имена файлов были определённого вида (как минимум, я знал, что они имеют одинаковую длину).

                    Решал с помощью такого скрипта:
                    Code:
                    @echo off
                    rem Автор: Константин Ошмян
                    rem Выдаём список файлов для директории, которых не было в прошлый раз.
                    rem Результаты последнего просмотра сохраняем в файле %DIR%.TXT, предыдущего просмотра - %DIR%.OLD.
                    rem
                    rem Если вторым параметром передавать "OLD", то выдаём список файлов, которые есть сейчас и были
                    rem в прошлый раз, но не было перед этим. Результат пред-предыдущего просмотра - файл %DIR%.OL1.
                    rem
                    rem Скрипт корректно работает только с файлами, имеющими непересекающиеся имена.
                    rem Например, если один файл называется 1.XML, а другой - 01.XML,
                    rem то могут быть некорректные срабатывания.
                    
                    set DIR=%1
                    if .%DIR% == . (
                    echo Parameter needed: subdirectory name
                    exit
                    )
                    
                    set OLDDIR=%CD%
                    cd %0\..
                    
                    if .%2 == .OLD (
                    if NOT EXIST %DIR%.OLD echo.>%DIR%.OLD
                    if EXIST %DIR%.OL1 del %DIR%.OL1
                    rename %DIR%.OLD %DIR%.OL1
                    )
                    
                    if NOT EXIST %DIR%.TXT echo.>%DIR%.TXT
                    if EXIST %DIR%.OLD del %DIR%.OLD
                    rename %DIR%.TXT %DIR%.OLD
                    
                    dir /b C:\WORK\%DIR%\*.XML >%DIR%.TXT 2>nul
                    FOR /F %%F IN (%DIR%.TXT) do (
                    if .%2 == .OLD (
                    find "%%F" %DIR%.OL1 >nul || find "%%F" < %DIR%.OLD
                    ) else (
                    find "%%F" %DIR%.OLD >nul || echo %%F
                    )
                    )
                    
                    if .%2 == .OLD (del %DIR%.OL1) else del %DIR%.OLD
                    cd %OLDDIR%
                    exit
                    В файле zabbix_agentd.conf прописываем что-то вроде:
                    Code:
                    UserParameter=dir,C:\путь\нашСкрипт.cmd $1 $2
                    и создаём три элемента данных: dir[AAA], dir[BBB] и dir[CCC,OLD] (каждый с именем "New files in folder $1", типом "Text" и интервалом 5 минут).
                    На каждый из них навешиваем триггер с именем "New file(s) in folder ИмяПапки" вида:
                    Code:
                    {Хост:dir[ИмяПапки].strlen()}>0 and {Хост:dir[ИмяПапки].nodata(30)}=0
                    который срабатывает при получении непустого значения, приводит в действие отправку уведомления, а через полминуты закрывается.

                    Думаю, далее сможете доработать напильником под свои нужды :-)
                    Только нужно иметь в виду, что при наличии в папке большого количества файлов (десятки тысяч) такой подход неэффективен (скрипт будет работать чересчур долго). Но если их там до сотни - то вполне нормально.
                    Last edited by Kos; 17-03-2021, 11:21.

                    Comment

                    • Semiadmin
                      Senior Member
                      • Oct 2014
                      • 1625

                      #11
                      А если так: написать LLD (например, парсинг вывода dir), прототип айтема: имя - имя файла, значение - размер. Прототип триггера на то, что размер >0. Можно сделать триггер сбрасываемым вручную (v3.2), чтобы погасить его для легитимного файла. При появлении файла - триггер срабатывает, при удалении - становится неподдерживаемым, или гасится, в 3.2 можно исхитриться.

                      Comment

                      • LeoZepp
                        Member
                        • Jun 2016
                        • 47

                        #12
                        Originally posted by semiadmin
                        А если так: написать lld (например, парсинг вывода dir), прототип айтема: имя - имя файла, значение - размер. Прототип триггера на то, что размер >0. Можно сделать триггер сбрасываемым вручную (v3.2), чтобы погасить его для легитимного файла. При появлении файла - триггер срабатывает, при удалении - становится неподдерживаемым, или гасится, в 3.2 можно исхитриться.
                        Так исхитриться не получится - у меня 3.0

                        Comment

                        • LeoZepp
                          Member
                          • Jun 2016
                          • 47

                          #13
                          Originally posted by Kos
                          Ну, например, у меня была подобная задача: информировать о новых XML-файлах, если они появляются в заданных папках C:\WORK\AAA\ или C:\WORK\BBB\ (проверять раз в 5 минут).
                          Потом добавилась ещё задача: информировать об XML-файлах, которые появились в папке C:\WORK\CCC\ и лежат там более пяти минут (если меньше - то всё ОК). Правда, имена файлов были определённого вида (как минимум, я знал, что они имеют одинаковую длину).

                          Решал с помощью такого скрипта:
                          Code:
                          @echo off
                          rem Автор: Константин Ошмян
                          rem Выдаём список файлов для директории, которых не было в прошлый раз.
                          rem Результаты последнего просмотра сохраняем в файле %DIR%.TXT, предыдущего просмотра - %DIR%.OLD.
                          rem
                          rem Если вторым параметром передавать "OLD", то выдаём список файлов, которые есть сейчас и были
                          rem в прошлый раз, но не было перед этим. Результат пред-предыдущего просмотра - файл %DIR%.OL1.
                          rem
                          rem Скрипт корректно работает только с файлами, имеющими непересекающиеся имена.
                          rem Например, если один файл называется 1.XML, а другой - 01.XML,
                          rem то могут быть некорректные срабатывания.
                          
                          set DIR=%1
                          if .%DIR% == . (
                          	echo Parameter needed: subdirectory name
                          	exit
                          )
                          
                          set OLDDIR=%CD%
                          cd %0\..
                          
                          if .%2 == .OLD (
                          	if NOT EXIST %DIR%.OLD echo.>%DIR%.OLD
                          	if EXIST %DIR%.OL1 del %DIR%.OL1
                          	rename %DIR%.OLD %DIR%.OL1
                          )
                          
                          if NOT EXIST %DIR%.TXT echo.>%DIR%.TXT
                          if EXIST %DIR%.OLD del %DIR%.OLD
                          rename %DIR%.TXT %DIR%.OLD
                          
                          dir /b C:\WORK\%DIR%\*.XML >%DIR%.TXT 2>nul
                          FOR /F %%F IN (%DIR%.TXT) do (
                          	if .%2 == .OLD (
                          		find "%%F" %DIR%.OL1 >nul || find "%%F" < %DIR%.OLD
                          	) else (
                          		find "%%F" %DIR%.OLD >nul || echo %%F
                          	)
                          )
                          
                          if .%2 == .OLD (del %DIR%.OL1) else del %DIR%.OLD
                          cd %OLDDIR%
                          exit
                          В файле zabbix_agentd.conf прописываем что-то вроде:
                          Code:
                          UserParameter=dir,C:\путь\нашСкрипт.cmd $1
                          и создаём три элемента данных: dir[AAA], dir[BBB] и dir[CCC,OLD] (каждый с именем "New files in folder $1", типом "Text" и интервалом 5 минут).
                          На каждый из них навешиваем триггер с именем "New file(s) in folder ИмяПапки" вида:
                          Code:
                          {Хост:dir[ИмяПапки].strlen()}>0 and {Хост:dir[ИмяПапки].nodata(30)}=0
                          который срабатывает при получении непустого значения, приводит в действие отправку уведомления, а через полминуты закрывается.

                          Думаю, далее сможете доработать напильником под свои нужды :-)
                          Только нужно иметь в виду, что при наличии в папке большого количества файлов (десятки тысяч) такой подход неэффективен (скрипт будет работать чересчур долго). Но если их там до сотни - то вполне нормально.
                          Задача немного иная: уведомлять что в папке c:\xxx\yyy\ появился новый файл. Расширение может быть произвольным, как и имя, и размер. Отключение триггера при удалении файла или автозакрытие спустя скажем 10мин.

                          Comment

                          • Semiadmin
                            Senior Member
                            • Oct 2014
                            • 1625

                            #14
                            Ну, тогда значение прототипа айтема м.б. временем изменения файла, и триггер на него. Автозакрытие через 10 мин. можно сделать через условие триггера, заодно и старые файлы отсечь. Вот только при удалении файла в течение этих 10 мин. триггер не погаснет, а станет неподдерживаемым, но можно сделать на это оповещение.

                            Comment

                            • LeoZepp
                              Member
                              • Jun 2016
                              • 47

                              #15
                              Originally posted by Semiadmin
                              Ну, тогда значение прототипа айтема м.б. временем изменения файла, и триггер на него. Автозакрытие через 10 мин. можно сделать через условие триггера, заодно и старые файлы отсечь. Вот только при удалении файла в течение этих 10 мин. триггер не погаснет, а станет неподдерживаемым, но можно сделать на это оповещение.
                              Тоже думал над этим, ведь при добавлении файла в папку меняется время изменения всей папки, соответственно сделать триггер на это: если последнее полученное значение отличается от текущего - аларм, автозакрытие после 10 минут.
                              Проблема возникла в другом
                              делаю Элемент данных (айтем) следующий:

                              Тип:zabbix-agent
                              ключ: vfs.file.time[c:\xxx\yyy\]
                              Тип информаии: текст (не понял что именно указать, возможно числовой целый)

                              Триггер:
                              {dir:vfs.file.time[D:\Download].date()}>20161027

                              И понятное дело - не отрабатывает как надо.

                              Comment

                              Working...