Пользователь
0,0
рейтинг
8 октября 2012 в 19:41

Администрирование → The Dude. Отправка SMS-уведомлений из песочницы

Я хотел бы рассказать о небольшой доработке системы мониторинга 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-modeswitch. Устанавливаем его и выполняем команду:

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_port\n";
    $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

Update. Если материал вызовет интерес — опишу модификацию скрипта, позволяющую отправлять SMS уведомления через любой 3G модем, подключенный к Asterisk посредством chan_dongle.
Владислав @Vengant
карма
8,0
рейтинг 0,0

Самое читаемое Администрирование

Комментарии (9)

  • 0
    Dude — отличная система мониторинга.
    Настраивал подобно оповещение через email-sms шлюз. ибо свистка под рукой не было
    • +1
      Это еще что, я в свое время хохмы ради настраивал оповещения с нее на пейджер. Было это пару лет назад, делал экспериментальный пейджинговый передатчик, управляемый с компа самописной софтиной, ну и научил ее принимать сислог и выдавать в эфир.
    • 0
      Как раз искал такой шлюз, посоветуйте? (Украина)
  • 0
    usb-modeswirch на usb-modeswich

    лишняя буква
    • 0
      Спасибо, но правильно таки modeswitch :)
    • 0
      и сам опечатался — usb-modeswitch
  • 0
    Использовать die для замены корректного выхода?!

    If you need to exit the process with a specific exit code, see exit.
  • 0
    а у кого-то есть опыт отправки уведомлений в skype? даже и не обязательно с Dude, а с какого-то другого syslog-колектора?
    • 0
      Врать не буду, но Skype насколько помню имеет свой API, через который можно взаимодействовать с клиентом. Я бы посмотрел в этом направлении. По крайней мере, siptosis работал именно так.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.