Ad Widget

Collapse

Подскажите как сделать триггер сравнени&

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • Viewer
    Senior Member
    • Oct 2012
    • 131

    #1

    Подскажите как сделать триггер сравнени&

    Добрый день!
    Zabbix 3.0.1
    Есть item (тип "Текст") возвращающий дату обновлений антивируса.
    Например "20160302".
    Как настроить триггер, проверяющий что дата обновлений не старше 5 дней?
    пробовал различные функции отсюда, но что то не нахожу нужной конструкции.
  • sadman
    Senior Member
    • Dec 2010
    • 1611

    #2
    Originally posted by viewer
    Добрый день!
    Zabbix 3.0.1
    Есть item (тип "Текст") возвращающий дату обновлений антивируса.
    Например "20160302".
    Как настроить триггер, проверяющий что дата обновлений не старше 5 дней?
    пробовал различные функции отсюда, но что то не нахожу нужной конструкции.
    Кажется, что штатно - никак. Тем, что закидывает дату, отдавать уже разницу - не выйдет?

    Comment

    • glebs.ivanovskis
      Senior Member
      • Jul 2015
      • 237

      #3
      Функция data(), применённая к любому элементу данных выдаст текущую дату в таком же формате. А далее нужно сравнивать эти даты как числа. Простое выражение "дата1 - дата2 > 5" не пойдёт, потому как смена месяца в таком формате - это как бы 100 дней, а смена года - это 10000 дней. Но в принципе можно придумать что-то извращённое даже для учёта високосных/невисокосных лет...

      Comment

      • Viewer
        Senior Member
        • Oct 2012
        • 131

        #4
        Originally posted by sadman
        Кажется, что штатно - никак. Тем, что закидывает дату, отдавать уже разницу - не выйдет?
        Шаблон вот этот https://www.zabbix.com/forum/showthread.php?t=48580
        item:
        Code:
        vfs.file.regexp["C:\ProgramData\Symantec\Symantec Endpoint Protection\CurrentVersion\Data\Definitions\VirusDefs\definfo.dat","([0-9]{8})",,,,\1]

        Comment

        • Viewer
          Senior Member
          • Oct 2012
          • 131

          #5
          Originally posted by glebs.ivanovskis
          Функция data(), применённая к любому элементу данных выдаст текущую дату в таком же формате.
          Я пробовал эту функцию в разных вариациях. Что то не вышло добиться нужного.
          Change вроде должен подойти, но я что то с синтаксисом мудрю.

          Comment

          • glebs.ivanovskis
            Senior Member
            • Jul 2015
            • 237

            #6
            Originally posted by Viewer
            Я пробовал эту функцию в разных вариациях. Что то не вышло добиться нужного.
            Change вроде должен подойти, но я что то с синтаксисом мудрю.
            В каких вариациях?

            change() не подойдёт, это разница двух значений айтема. Я Вам с уверенностью заявляю, что стандартных средств сравнения дат в Zabbix'е нет. И даже запросов на такую фичу я что-то не нашёл, так что можете смело писать ZBXNEXT.

            Comment

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

              #7
              А почему Item имеет тип данных именно "Text"? Что мешает определить его как "Numeric (unsigned)"? Тогда можно было бы без проблем делать сравнения не только на равно/не равно, но и на больше/меньше.

              Как вариант: Linux-овая команда
              Code:
              date --date="5 days ago" "+%Y%m%d"
              выдаст в аналогичном формате дату, которая была 5 дней назад. Забираем её с любой Linux-машины, например, через UserParameters или zabbix_sender; либо с сервера через External checks. Причём достаточно забирать её раз в сутки (в Zabbix 3.x можно задать конкретное время в расписании).

              В триггере сравниваем это значение со значением Вашего Item-а, где дата последнего обновления антивируса. Насколько сильно они будет различаться - в данном случае неважно, важно только больше или меньше.

              А вот то, что сравнения дат в Zabbix-е нет - это да, странно, что никому раньше не требовалось. Как и вычисление не только сегодняшней даты. Что-нибудь вроде
              Code:
              {host.item.last()}<{host.item.date(-3d)}
              сильно бы помогло в данном случае. Да и вряд ли это так уж сложно реализовать.

              Comment

              • sadman
                Senior Member
                • Dec 2010
                • 1611

                #8
                Originally posted by Kos
                Как вариант: Linux-овая команда
                Code:
                date --date="5 days ago" "+%Y%m%d"
                выдаст в аналогичном формате дату, которая была 5 дней назад. Забираем её с любой Linux-машины, например, через UserParameters или zabbix_sender; либо с сервера через External checks. Причём достаточно забирать её раз в сутки (в Zabbix 3.x можно задать конкретное время в расписании).
                Раз уж external script вмешался, то уж проще сразу разницу получать. Это и универсальней будет, так как на удаленной машине время иначе может идти

                Comment

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

                  #9
                  Originally posted by sadman
                  Раз уж external script вмешался, то уж проще сразу разницу получать. Это и универсальней будет, так как на удаленной машине время иначе может идти
                  Да, согласен
                  Просто я не очень силён в скриптах под Windows, а антивирус у автора темы проверяется, судя по пути в настройках айтема, именно на этой платформе. Хотя, autoit позволяет там тоже делать волшебные вещи

                  Comment

                  • sadman
                    Senior Member
                    • Dec 2010
                    • 1611

                    #10
                    Волшебные вещи на PowerShell тоже возможны:

                    Code:
                    Param (
                            [Parameter(Mandatory = $False)] 
                            [string]$DATFile = ".\definfo.dat"
                    )
                    
                    If ($False -eq (Test-Path $DATFile)) {
                       Write-Warning "No DAT file found";
                       Exit;
                    }
                    
                    $Content = Get-Content $DATFile;
                    $LastUpdate = $Content | % { $k,$v = ($_.Trim()).Split('='); if ('CurDefs' -eq $k) { $v.Split('.') | Select-Object -First 1 } };
                    if ($LastUpdate) {
                       $ParsedDate = [DateTime]::ParseExact($LastUpdate,‘yyyymmdd’,$null);
                       $LastUpdateInUnixTime = (New-TimeSpan -Start (Get-Date -Date "01/01/1970") -End $ParsedDate).TotalSeconds; 
                       Write-Host "Last update (timestamp): $LastUpdateInUnixTime";
                       $NotUpdateInDays = (New-TimeSpan -Start $ParsedDate -End (Get-Date)).Days; 
                       Write-Host "Not updated for $NotUpdateInDays days";
                    } else {
                       Write-Warning "No info in `"$DATFile`" was found";
                    }
                    Code:
                    powershell.exe -ExecutionPolicy "RemoteSigned" -file "DefInfo.ps1" -DATFile ".\definfo.dat"
                    
                    Last update (timestamp): 1388535000
                    Not updated for 792 days

                    Comment

                    • Viewer
                      Senior Member
                      • Oct 2012
                      • 131

                      #11
                      Всем большое спасибо!
                      Отвлекся на другие производственные задачи, попробую - отпишусь.
                      Last edited by Viewer; 17-03-2016, 11:34.

                      Comment

                      • Viewer
                        Senior Member
                        • Oct 2012
                        • 131

                        #12
                        Upd.
                        Спасибо, всё что хотел сделал.
                        Спасибо, что направили на получение нужных ключей через userparam и powershell.
                        Дополнительно ещё настроил получение версии SEP "(Get-ItemProperty -Path Registry::'HKEY_LOCAL_MACHINE\SOFTWARE\Symantec\Sy mantec Endpoint Protection\CurrentVersion' | select -expandproperty Productversion)"
                        и количество объектов в карантине "(Get-ChildItem 'C:/ProgramData/Symantec/Symantec Endpoint Protection/CurrentVersion/Data/Quarantine' | Measure-Object ).Count"
                        c триггерами на изменение.

                        Upd2. Но родной функционал заббикса по чтению значений реестра и файлов конечно бы существенно упростил всё. Не нужно бы было по клиентам лазить, обновлять конфиги и перезапускать zabbix agent-а.

                        Comment

                        • sadman
                          Senior Member
                          • Dec 2010
                          • 1611

                          #13
                          По клиентам можно и через GPO... А перезагружать всех сразу рубильником на щитке

                          К слову - для коротких скриптов pipeline не очень правильный выбор, особенно для частодергаемых:

                          Code:
                          (Measure-Command { (Get-ChildItem 'C:\Windows\System32\' | Measure-Object ).Count }).TotalMilliseconds
                          (Measure-Command { @(Get-ChildItem 'C:\Windows\System32\').Count }).TotalMilliseconds
                          У пайпа проигрыш по скорости в два раза.

                          Code:
                          519,8359
                          233,6976
                          И да, мой фрагмент с поиском CurDefs тоже можно и нужно оптимизировать.

                          Comment

                          • Viewer
                            Senior Member
                            • Oct 2012
                            • 131

                            #14
                            Originally posted by sadman

                            И да, мой фрагмент с поиском CurDefs тоже можно и нужно оптимизировать.
                            Да, я убрал лишнее , исправил ‘yyyymmdd’ на ‘yyyyMMdd’ в ParseExact и сделал else write-host "1000" чтоб триггер срабатывал когда проблемы с парсингом будут.

                            Для рестарта агента и подмены конфига надо скрипт написать. Каждый раз гадаю что быстрее: руками на нескольких серверах(2,3,10...) или скрипт делать )

                            Comment

                            Working...