The Dude. Отправка SMS-уведомлений

в 15:41, , рубрики: Сетевые технологии, системное администрирование, метки:

Я хотел бы рассказать о небольшой доработке системы мониторинга Mikrotik The Dude. Эта система ранее уже упоминалась читателями gsandul и cedr. Доработку, о которой пойдет речь, я когда-то описывал в своем блоге, но здесь ее сможет увидеть и оценить большее количество народа.

Итак, вкратце: The Dude — довольно мощная и гибкая система мониторинга сетевых устройств, поддерживающая различные типы проверок доступности сервисов и умеющая опрашивать устройства по SNMP. Она поддерживает два типа отправки сообщений о событиях во внешний мир: это e-mail и syslog.

Для оповещения админа по SMS о каких-либо алертах можно пойти традиционным способом — то есть через email-sms шлюз, но в этом случае есть вероятность, что при падении аплинка система до шлюза не достучится и сообщение отправлено не будет. У меня же в наличии были приблудившийся откуда-то 3G модем Huawei E220 от красно-белого оператора, корпоративная симка с условно-безлимитными SMS и собственно сама машина, на которой стояла The Dude — работала она через wine под Ubuntu.

Итак, подключаем модем к той же машине, на которой через wine работает Dude. Ubuntu бодро определяет его:

Bus 003 Device 002: ID 12d1:1003 Huawei Technologies Co., Ltd. E220 HSDPA Modem / E270 HSDPA/HSUPA Modem

Однако система видит модем как USB CD-ROM. Логично, ибо в этом режиме модем работает по умолчанию, чтобы с него же поставить под виндами дрова и управляющую программу, которая и переводит его в режим модема. Здесь нам на помощь придет пакет usb-modeswirch. Устанавливаем его и выполняем команду:

echo ‘SUBSYSTEM==»usb», SYSFS{idProduct}==»1003″, SYSFS{idVendor}==»12d1″, RUN+=»/lib/udev/modem-modeswitch –vendor 0x12d1 –product 0×1003 –type option-zerocd»‘ | sudo tee /etc/udev/rules.d/45-huawei220.rules

После этого нужно отключить и снова подключить модем. Проверяем, что он переключился в нужный режим:

    ~# ls -l /dev | grep ttyUSB
    lrwxrwxrwx 1 root root 7 2011-12-30 15:00 gsmmodem -> ttyUSB0
    crw-rw—- 1 root dialout 188, 0 2011-12-31 15:09 ttyUSB0
    crw-rw—- 1 root dialout 188, 1 2011-12-30 15:00 ttyUSB1

Если порты ttyUSB не появились, то нужно дополнительно выполнить команду:

    ~# modprobe usbserial vendor=0x12d1 product=0×1003

Теперь все должно быть в порядке. Для работы с SMS сообщениями будем использовать gnokii. Устанавливаем, настраиваем:

    [global]
    port = /dev/ttyUSB0
    model = AT
    initlength = default
    connection = serial
    use_locking = yes
    serial_baudrate = 115200

Обязательно снимаем с SIM карты запрос PIN. Проверяем:

    ~# gnokii --identify
    GNOKII Version 0.6.29
    IMEI : ***************
    Manufacturer : huawei
    Model : E220
    Product name : E220
    Revision : 11.117.10.00.184

    ~# gnokii --getnetworkinfo
    GNOKII Version 0.6.29
    Network : MTS (Российская Федерация)
    Network code : 250 01
    LAC : 0000 (0)
    Cell id : 00000000 (0)

Итак, gnokii определяет модем и видит сеть. Пробуем отправить SMS:


    ~# echo test | gnokii --sendsms +7**********
    GNOKII Version 0.6.29
    Send succeeded with reference 40!

Если SMS доставлена по назначению, то все работает. Переходим к настройке связки gnokii с The Dude. Она, как я уже говорил, умеет отправлять уведомления о событиях двумя способами: по e-mail либо через syslog. Как раз вторым способом мы и воспользуемся, благо можно задать любой внешний IP и любой порт, куда по протоколу UDP в открытом виде будут отсылаться уведомления. Наша задача – слушать порт, куда их будет отправлять The Dude, и передавать эти сообщения в gnokii. Для этого я написал небольшой скрипт на perl:

    #!/usr/bin/perl -w
    use strict;
    use IO::Socket;

    my($server, $newmsg,

    $max_len, $server_port);
    $max_len = 160;
    $server_port = 12345;

    $server = IO::Socket::INET->new(LocalPort=>$server_port, Broadcast=>0, Proto=>"udp")
    or die "Error starting UDP Server on port $server_port: $@n";
    print "UDP Server started on port $server_portn";
    $newmsg = "";
    while($server->recv($newmsg,$max_len)){
    if($newmsg){
    #my($port, $ipaddr) = sockaddr_in($server->peername);
    print "Received: $newmsg n";
    open(GNOKII, "| gnokii --sendsms +7**********») || die "Starting gnokii failed: $!n";
    print GNOKII $newmsg;
    close(GNOKII);
    }
    }

    die "recv: $!";

Как видно из кода, скрипт прослушивает порт 12345 и передает все приходящие в него сообщения не длиннее 160 знаков (максимальная длина SMS сообщения) в gnokii, указав номер мобильного, куда нужно их отправить.

В Dude создаем новое оповещение типа syslog, в качестве IP указываем IP-адрес машины, где подключен модем и запущен скрипт (в моем случае это один и тот же сервер), порт выбираем аналогичный указанному в скрипте.

image

Теперь нажимаем «Test». Если все сделано правильно, на указанный в скрипте номер придет тестовое сообщение от The Dude.

image

Автор: Vengant

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js