Ad Widget

Collapse

Скрипт уровня сигнала модема

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • bboymig
    Member
    • Aug 2016
    • 30

    #1

    Скрипт уровня сигнала модема

    Добрый день.
    Нашел скрипт уровня сигнала GSM модема. Работает.
    Создаю скрипт:
    nano /etc/zabbix/alertscripts/gsm.sh
    echo -e "AT+CSQ\r\n" > /dev/ttyUSB0
    timeout 1 gawk '/^+CSQ/{print gensub(/,.*/,"","g",$2)*2-113; exit}' /dev/ttyUSB0
    Назначаю ему права на запуск:
    chmod 0645 /etc/zabbix/alertscripts/gsm.sh
    Редактирую конфиг агента
    nano /etc/zabbix/zabbix_agentd.conf
    UserParameter=GSM,/etc/zabbix/alertscripts/gsm.sh
    Перезапускаю агента
    service zabbix-agent restart
    Zabbix получает значение -83.
    Но выдает ошибку:
    Received value [-83] is not suitable for value type [Numeric (unsigned)] and data type [Decimal].
    Мне требуется создать триггер с условием:
    {GSM:gsm.last()}<-90
    Какой тип данных выбрать при создании элемента? Спасибо.
  • Kos
    Senior Member
    Zabbix Certified SpecialistZabbix Certified Professional
    • Aug 2015
    • 3406

    #2
    Originally posted by bboymig
    Мне требуется создать триггер с условием:
    {GSM:gsm.last()}<-90
    Какой тип данных выбрать при создании элемента? Спасибо.
    Ну, раз Numeric (unsigned) не подходит из-за того, что нужно обрабатывать и отрицательные величины тоже, а сравнивать надо на "больше/меньше" (т.е. как число), то, как говорится, при всём богатстве выбора другой альтернативы нет: остаётся лишь Numeric (float). Не бойтесь, этот тип вполне нормально работает и с целочисленными значениями тоже, но может хранить также и величины со знаком.

    Comment

    • bboymig
      Member
      • Aug 2016
      • 30

      #3
      Originally posted by Kos
      Ну, раз Numeric (unsigned) не подходит из-за того, что нужно обрабатывать и отрицательные величины тоже, а сравнивать надо на "больше/меньше" (т.е. как число), то, как говорится, при всём богатстве выбора другой альтернативы нет: остаётся лишь Numeric (float). Не бойтесь, этот тип вполне нормально работает и с целочисленными значениями тоже, но может хранить также и величины со знаком.
      Спасибо. Все настроил. Все получилось. Может кому пригодится.


      Настройка - Узлы сети - Zabbix Server - Элементы данных - Создать элемент данных
      Имя db
      Тип Zabbix Агент
      ключ GSM
      Тип информации Числовой с плавающей точкой
      Группы элементов данных - Zabbix agent
      Описание Signal GSM Modem

      Триггер
      Имя GSM
      Выражение:
      {Zabbix server:GSM.last()}<-95
      Описание GSM Signal low

      Важность Предупреждение

      Comment

      • bboymig
        Member
        • Aug 2016
        • 30

        #4
        Все заработало. Единственный момент. Если модем не ответил на запрос, то как быть? Можно ли сделать с тригере дополнительную функцию, что если информация не поступила, принимать её за -200?

        Настройка - Узлы сети - Zabbix Server - Элементы данных - Создать элемент данных
        Имя db
        Тип Zabbix Агент
        ключ GSM
        Тип информации Числовой с плавающей точкой
        Группы элементов данных - Zabbix agent
        Описание Signal GSM Modem

        Триггер
        Имя GSM
        Выражение:
        {Zabbix server:GSM.last()}<-95
        Описание GSM Signal low

        zabbix 3.0.4
        Debian 8.5
        Модем HUAWEI E3131
        Last edited by bboymig; 10-08-2016, 13:03.

        Comment

        • rugo
          Junior Member
          • Apr 2013
          • 21

          #5
          Originally posted by bboymig
          Если модем не ответил на запрос, то как быть? М
          Для этого можно использовать выражение nodata триггера.
          {Zabbix server:GSM.nodata(1m)}=1

          Comment

          • bboymig
            Member
            • Aug 2016
            • 30

            #6
            Спасибо. Все работает как надо.

            Comment

            • bboymig
              Member
              • Aug 2016
              • 30

              #7
              Рано радовался.
              Элемент выдает вот такую ошибку:
              Received value [] is not suitable for value type [Numeric (float)]
              Триггер {Zabbix server:GSM.nodata(3m)}=1
              Состояние неизвестно.
              Как быть?

              Comment

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

                #8
                Originally posted by bboymig
                Рано радовался.
                Элемент выдает вот такую ошибку:
                Received value [] is not suitable for value type [Numeric (float)]
                Триггер {Zabbix server:GSM.nodata(3m)}=1
                Состояние неизвестно.
                Как быть?
                Логично. Если тип данных числовой, то и значение должно ему соответствовать, а не быть пустой строкой.

                Видимо, Ваш вопрос
                Если модем не ответил на запрос, то как быть?
                был понят неверно.
                В этом случае Ваш скрипт должен возвращать какое-то другое числовое значение - заведомо далёкое от правды, но числовое. И на его получение, при необходимости, можно настроить другой триггер. Но делать анализ того, вернул что-то модем или нет, должен именно Ваш скрипт.

                Например, строку
                Code:
                timeout 1 gawk '/^+CSQ/{print gensub(/,.*/,"","g",$2)*2-113; exit}' /dev/ttyUSB0
                можно модифицировать следующим образом:
                Code:
                timeout 1 gawk '/^+CSQ/{print gensub(/,.*/,"","g",$2)*2-113; exit 0} END {exit 1}' /dev/ttyUSB0 || echo 0
                (при отсутствии ответа от модема возвращать ноль. Ну, или сколько Вам будет нужно - это число в самом конце строки).

                Comment

                • bboymig
                  Member
                  • Aug 2016
                  • 30

                  #9
                  Данная модификация скрипта выдает ответ Уровень сигнала и 0 следующей строкой:
                  -87
                  0
                  Я в скриптах не плохо разбираюсь, но смысл уловил. Если сигнал от модема пришел пустой, значение должно быть 0 и мы делаем триггер:
                  {zabbix server:gsm.last()}=0
                  Только мне бы до конца допилить скрипт и я буду очень рад.
                  Last edited by bboymig; 12-08-2016, 09:47.

                  Comment

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

                    #10
                    Да, действительно, чуть лажанулся: секция END в gawk выполняется даже при выходе через exit.
                    попробуйте так:
                    Code:
                    timeout 1 gawk '/^+CSQ/{print gensub(/,.*/,"","g",$2)*2-113;RC=-1;exit} END {exit RC+1}' /dev/ttyUSB0 || echo 0

                    Comment

                    • bboymig
                      Member
                      • Aug 2016
                      • 30

                      #11
                      Спасибо. Буду тестировать.

                      Comment

                      • bboymig
                        Member
                        • Aug 2016
                        • 30

                        #12
                        Все работает. Думаю изменить триггер на следующее, если в течении 5 минут значение элемента будет равнятся 0, тогда триггер срабатывает. Сделал через конструктор выражений. Выдало следующее:
                        {Zabbix server:GSM.last(,5m)}=0
                        Правильно ли я все сделал?

                        Comment

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

                          #13
                          Originally posted by bboymig
                          Правильно ли я все сделал?
                          Нет, неправильно.

                          Comment

                          • bboymig
                            Member
                            • Aug 2016
                            • 30

                            #14
                            Спасибо за решение вопроса! На днях сильная гроза была и сигнал периодический пропадал. За ночь было около 200 сообщений на почту.

                            Comment

                            • bboymig
                              Member
                              • Aug 2016
                              • 30

                              #15
                              Помогите дописать скрипт

                              echo -e "at+csq\r\n" > /dev/ttyusb0
                              sleep 1
                              gawk '/^+csq/{print gensub(/,.*/,"","g",$2)*2-113;rc=-1;exit} end {exit rc+1}' /dev/ttyusb0 || echo 0
                              Можно ли данный скрипт немного улучшить? Если даннная строчка возвращает 0, то требуется еще раз повторить скрипт. Если по истечении 5 попыток вернулся 0, то отправить 0.
                              Понимаю, что требуется цикл сделать, но я синтаксис не знаю.
                              На почту в сутки могут упасть около 100 сообщений, хотя стоит триггер на 5 минут, а значение он отсылает сразу:
                              {zabbix server:gsm.max(5m)}=0

                              Comment

                              Working...