Как стать автором
Поиск
Написать публикацию
Обновить

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

Время на прочтение5 мин
Количество просмотров15K
Доброго всем дня!

На этот раз решил описать ситуацию, которая вроде бы и не особо описана в интернете, хотя некоторые намеки на нее есть, но большая часть досталась просто долгим методичным копанием кода и вики самого 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 проблемы по переполнению входящих уже устранены, потому к колхозным способам очистки можно не прибегать
Теги:
Хабы:
Всего голосов 12: ↑12 и ↓0+12
Комментарии9

Публикации

Ближайшие события