Mikrotik. Управление через SMS при помощи WEB сервера +12


Доброго всем дня!

На этот раз решил описать ситуацию, которая вроде бы и не особо описана в интернете, хотя некоторые намеки на нее есть, но большая часть досталась просто долгим методичным копанием кода и вики самого Mikrotik.

Собственно задача: реализовать при помощи SMS управлением несколькими устройствами, на примере включения и выключения портов.

Имеется:

  1. Второстепенный маршрутизатор CRS317-1G-16S+
  2. Точка доступа Mikrotik NETMETAL 5
  3. LTE модем R11e-LTE

Начнем с того что чудесная точка доступа Netmetal 5 имеет на борту распаянный разъем для сим карты и порт для установки LTE модема. Потому для этой точки был куплен по сути лучший модем из того, что было доступно и поддерживалось операционной системой самой точки, а именно R11e-LTE. Точка была разобрана, все установлено на свои места (хотя надо знать, что сим карта расположена под модемом и без снятия основной платы ее не возможно достать), потому проверьте сим карту на работоспособность, иначе придется несколько раз разбирать точку доступа.

Далее просверлили пару отверстий в корпусе, установили 2 пигтейла и концы закрепили на модеме. К сожалению фото процесса не сохранилось. С другой стороны на пигтейлы закрепили универсальные антенны с магнитным основанием.

Основные этапы настройки описаны в интернете достаточно хорошо, кроме мелких косяков взаимодействия. Например модем перестает принимать сообщения SMS, когда из поступает 5 штук и они висят в Inbox, очистка сообщений, перезапуск модема не всегда решают проблему. Но в версии 6.44.1 прием работает более стабильно. В Inbox отображается 4 последние sms, остальные автоматически стираются и жизни не мешают.

Основная цель эксперимента тушить и поднимать интерфейсы на двух маршрутизаторах в одной физической сети. Основная сложность заключалась в том, что Mikrotik не поддерживает управление через SNMP, а позволяет только считывать значения. Потому пришлось копать в другую сторону, а именно Mikrotik API.

Четкой документации о том, как управлять нет, потому пришлось экспериментировать и для будущих попыток сделана эта инструкция.

Для управления несколькими устройствами потребуется доступный и рабочий WEB сервер в локальной сети, на него возлагается необходимость управления по командам Mikrotik.

1. На Netmetal 5 нужно сделать пару скриптов для включения и выключения соответственно

system script
add dont-require-permissions=no name=disableiface owner=admin policy=    ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source=    "/tool fetch http://WEB_SERVER_IP/di.php "
add dont-require-permissions=no name=enableiface owner=admin policy=    ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source=    "/tool fetch http://WEB_SERVER_IP/en.php "

2. Создать 2 скрипта на веб сервере (конечно на системе в данном случае должен быть установлен php):

<?php
# file en.php enable interfaces    
require('/usr/lib/zabbix/alertscripts/routeros_api.class.php');

    $API = new RouterosAPI();
    $API->debug=true;

if ($API->connect('IP управляемого Mikrotik', 'логин администратора', 'пароль администратора')) {
    $API->comm("/interface/ethernet/enable", array(
    "numbers"=>"sfp-sfpplus16",));
}
   $API->disconnect();
?>

<?php
#file di.php disable interfaces
    require('/usr/lib/zabbix/alertscripts/routeros_api.class.php');

    $API = new RouterosAPI();
    $API->debug=true;

if ($API->connect('IP управляемого Mikrotik', 'логин администратор', 'пароль администратора')) {
    $API->comm("/interface/ethernet/disable", array(
    "numbers"=>"sfp-sfpplus16",));
}
   $API->disconnect();
?>

3. Скачать с форума Mikrotik routeros_api.class.php и расположить его в доступном каталоге на сервере.

вместо sfp-sfpplus16 нужно указать имя отключаемого/включаемого интерфейса.

Теперь при отправке сообщения на номер в виде

:cmd СЕКРЕТНЫЙКОД script enableiface
или
:cmd СЕКРЕТНЫЙКОД script disableiface 

NETMETAL будет запускать соответствующий скрипт, а тот в свою очередь выполнение команды на WEB сервере.

Скорость выполнения операций при получении смс доли секунды. Работает стабильно.

Помимо этого есть функционал отправки СМС на телефоны системой мониторинга Zabbix и открытие резервного выхода в интернет при падении оптики. Пожалуй это выходи за рамки этой статьи, но скажу сразу, при отправке смс их длина должна укладываться в стандартный размер одного сообщения, т.к. Mikrotik не делит их на части, а при поступлении длинного сообщения просто его не отправляет, кроме того нужно фильтровать знаки передаваемые в сообщения, в противном случае СМС не отправится.

P.S. Дополняю теперь про косяки в предыдущих версиях RouterOS, которые были и как с ними бороться.
1. Максимальная длина сообщения и используемые знаки в сообщениях ограничены, потому пришлось бороться на уровне Zabbix, а именно исправлять шаблон отправки сообщения, чтобы в кратце, но было понятно о чем речь сообщения.
Настройка — Действия — Report to sms — Операции — Тема: Problem: {HOST.NAME} {TRIGGER.NAME}
А на восстановление Report to sms — Операции восстановления Тема: Resolved: {HOST.NAME} {TRIGGER.NAME}

2. Дополнительно сам скрипт, отправляющий данные в модем также режет максимальную длину отправляемого сообщения, т.к. если оно слишком длинное, то сообщение не отправится.
#!/bin/bash

strz=$1 $2 $3
php /usr/lib/zabbix/alertscripts/ro.php "8926ххххххх" "${strz:0:150}"

echo ${strz:0:150}\" >> /var/log/sendsms.history


Скрипт на php, отправляющий данные
<?php
    require('/usr/lib/zabbix/alertscripts/routeros_api.class.php');

    $API = new RouterosAPI();
    $API->debug=true;

if ($API->connect('IP модема', 'логин администратора', 'пароль администратора')) {
    $API->comm("/tool/sms/send", array(
    "port"=>"lte1",
    "phone-number"=>$argv[1],
    "message"=>$argv[2],));
}

   $API->disconnect();

    echo $argv[1];
    echo $argv[2];

?>



3. Очистка входящих сообщений для RouterOS < 6.44
System-Sheduler
/system scheduler
add disabled=yes interval=1m name=removeSMS on-event="/system script run 7" \
policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \
start-date=nov/01/2018 start-time=19:32:00


Если скрипт ниже у Вас будет иметь другой порядковый номер, то в планировщике потребуется изменить run 7, на соответсвтвующий номер

System-Script
/system script
add dont-require-permissions=no name=removeSMS owner=admin policy=\
ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="/\
tool sms inbox remove 0\r\
\n/delay 1\r\
\n/tool sms inbox remove 0\r\
\n/delay 1\r\
\n/tool sms inbox remove 0\r\
\n/delay 1\r\
\n/tool sms inbox remove 0\r\
\n/delay 1\r\
\n/tool sms inbox remove 0\r\
\n/delay 1\r\
\n/tool sms inbox remove 0\r\
\n/delay 1\r\
\n/tool sms inbox remove 0\r\
\n/delay 1\r\
\n/tool sms inbox remove 0\r\
\n/delay 1\r\
\n"

Скрипт с порядковым номером 7

4. На версиях ниже 6.38 помогала перезагрузке модема также встроенными скриптами и планировщиком
/system script
add dont-require-permissions=no name=rebootLTE owner=admin policy=\
ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="/\
interface lte disable 0\r\
\ndelay 10\r\
\n/interface lte enable 0\r\
\n/tool sms set receive-enabled=false\r\
\ndelay 10\r\
\n/tool sms set receive-enabled=true\r\
\n"


5. И немного про пополнение команд. Для отправки смс допустимо скажем на хосте с Zabbix генерировать RSC файл, а затем скриптом его отправлять на ftp на Mikrotik, далее в самом модеме уже скриптом в планировщике запускать требуемый файл, команды выполняются, но мне показалось более удобным использовать механизм выше.
В случае такой отправки генерируемый код достаточно прост.
/tool sms send lte1 +7926xxxxxxx message "Problem: High ICMP ping response time Problem started at 17:08:04 on 2018.07.10 Problem name: High ICMP ping response time Host: Netgear7212 Severity: Warning Original problem ID: 5403803"

В этом примере лишние символы уже убраны, а длина не ограничена. Скрипт, обрабатывающий запуск по такому методу после отрабатывания должен внутри Mikrotik скопировать пустой RSC файл на место существующего.
Данный метод не понравился, поскольку в принципе отсутствует защита от глюков и возможна неконтролируемая неотправка сообщений.

В версии RouterOS 6.44.1 проблемы по переполнению входящих уже устранены, потому к колхозным способам очистки можно не прибегать




К сожалению, не доступен сервер mySQL