По вашему запросу ничего не найдено :(
Убедитесь, что запрос написан правильно, или посмотрите другие
наши статьи:
При написании некоторых скриптов бывает нужно обратиться какому-либо ресурсу. Это может быть HTTP/HTTPS запрос какой-нибудь HTML странички сайта, FTP запрос на скачивание файла или же, это может быть GET/POST запрос к удалённому ресурсу, для передачи на него какой-либо информации.
Для этих целей в роутерах MikroTik предусмотрен инструмент Fetch, о нём и поговорим.
Инструмент Fetch позволяет настроить отправку HTTP и FTP запросов к сетевому ресурсу, чтобы скопировать с, или же загрузить на него определённые данеые (web-страничка, файл). Поддержка HTTPS включена по умолчанию, проверка сертификатов, предъявляемых сетевыми ресурсами при запросе, не осуществляется. Включить проверку цепочки сертификации можно с помощью опции check-certificate.
Чтобы начать работу с инструментом Fetch, введите команду:
/tool fetch
Далее нужно задавать параметры ресурса, к которому Вы хотите обратиться, метод обращения и данные, которые нужно получить или загрузить на этот ресурс.
Доступны следующие параметры:
address - задаёт IP адрес ресурса, к которому необходимо обратиться;
ascii - включает поддержку ASCII (по умолчанию - no);
check-certificate - включает проверку цепочки сертификации удаленного ресурса;
dst-path - название файла, который нужно скачать и полный путь к нему на удаленном ресурсе;
host - доменное имя ресурса, к которому нужно обратиться. Например - shareit.merionet.ru;
http-method - метод HTTP обращения. Доступны следующие методы: get, post, put, delete. По умолчанию используется get;
http-data - данные, которые нужно отправить на удаленный ресурс, при использовании методов put и post;
http-content-type - идентификатор данных, которые нужно отправить на удаленный ресурс в формате MIME. По умолчанию - application/x-www-form-urlencoded;
keep-result - если данный параметр активирован, то будет создан входной файл;
mode - задаёт протокол, по которому будет осуществляться соединение с удаленным ресурсом. Можно задать http, https, ftp или tftp;
password - задаёт пароль который нужен для аутентификации на удаленном ресурсе. (Используйте только если удаленный ресурс требует аутентификации подключения);
port - порт, по которому будет осуществляться соединение;
src-path - название файла, который нужно загрузить на удаленный ресурс;
upload - если данный параметр активирован, то инструмент fetch будет использоваться именно для загрузки локального файла на удаленный ресурс. При этом требуется, чтобы были указаны src-path и dst-path файла;
url - URL путь к файлу. Может быть использовано вместо address или src-path;
user - имя пользователя, которое нужно ввести для аутентификации на удаленном ресурсе (используйте только если удаленный ресурс требует аутентификации подключения);
Давайте рассмотрим несколько use кейсов, когда Вам может пригодиться инструмент fetch.
Скачивание файла с удаленного ресурса
В статье про защиту роутера MikroTik методом превентивного блокирования адресов из "черных" списков мы уже прибегали к этому методу.
Для этого мы писали такую команду:
/tool fetch address=www.squidblacklist.org host=www.squidblacklist.org mode=http src-path=/downloads/drop.malicious.rsc
В данном случае, мы обращаемся к ресурсу www.squidblacklist.org по протоколу http и скачиваем файл /downloads/drop.malicious.rsc
Допустим, мы имеем дело с FTP сервером, требующим аутентификации, тогда запрос может быть таким:
/tool fetch address=192.168.11.48 src-path=conf.rsc user=admin mode=ftp password=samplepass dst-path=sample.rsc port=21 host="" keep-result=yes
Можно также указать URL, по которому доступен нужный файл для скачивания:
/tool fetch url="https://wiki.merionet.ru/rukovodstvo-administratora-freepbx-na-russkom-yazyke/Rukovodstvo_Administratora_FreePBX_na_russkom_yazyke.pdf" mode=http
Загрузка файлов на удаленный сервер может быть нужна для автоматизации процесса резервного копирования конфигурации роутера
Ниже приведен пример команды для отправки файла с бэкапом по протоколу FTP, на удаленный сервер по адресу 192.168.11.56, который требует аутентификации:
/tool> fetch address=192.168.11.56 src-path=cnfig.rsc user=admin mode=ftp password=samplepass dst-path=backup.rsc upload=yes
Отправление информации на удаленный сервер
С помощью инструмента fetch можно также отправлять информацию на удаленный сервер, используя HTTP запросы. Например, ниже показан пример того, как можно через POST запрос отправить json массив данных на удаленный сервер:
/tool fetch http-method=post http-content-type="application/json" http-data="{ "as": "AS16509 Amazon.com, Inc.", "city": "Boardman", "country": "United States", "countryCode": "US", "isp": "Amazon", "lat": 45.8696, "lon": -119.688, "org": "Amazon", "query": "54.148.84.95", "region": "OR", "regionName": "Oregon", "status": "success", "timezone": "America/Los_Angeles", "zip": "97818" }" url="http://locator.loc/index.php"
Сохранять результат как переменную
В версии RouterOS v6.43, появилась возможность сохранить результат команды fetch в переменную. Это может быть полезно, например, для написания скриптов, которые производят какие-либо действия в зависимости от того, какой был ответ на HTTP запрос.
Например, ниже приведен пример скрипта, который отсылает письмо SERVICE FAILED, если при запросе страницы PHP (check.php) возвратился “0” и SERVICE RUNNING, если запрос был успешно обработан.
{ :local result [/tool fetch url=http://192.168.11.56/check.php as-value output=user]; :if ($result->"status" = "finished") do={ :if ($result->"data" = "0") do={ /tool e-mail send to="mnadmin@mndomain.ru" subject="$[/system identity get name] export" body="$[/system clock get date] SERVICE FAILED; } else={ /tool e-mail send to="mnadmin@mndomain.ru" subject="$[/system identity get name] export" body="$[/system clock get date] SERVICE RUNNING; } } }
Предварительно, нужно чтобы был настроен почтовый сервер - tool e-mail> set server=192.168.1.34 set port=25 from=”mnmikrotik@mndomain.ru”
Кстати, в WinBox нет отдельной реализации инструмента fetch. Однако, мы можем использовать его, когда пишем скрипты через инструмент Scripts. Например, можно туда добавить скрипт, который мы привели выше:
Вы забыли свой пароль пользователя root в Debian? Не волнуйтесь, мы покажем, как сбросить пароль root в Debian. Просто выполните следующие шаги и восстановите доступ и установите новый пароль root.
Сброс пароля
Запустите машину с Debian и нажмите любую клавишу, чтобы остановить процесс загрузки. Выберите “Debian GNU/Linux ” и нажмите клавишу “e” для редактирования параметров ядра в командной строке.
Используйте клавишу «стрелка вниз» для прокрутки вниз. Перейдите к строке, которая начинается со слова linux и с помощью стрелок перейдите к концу строки или нажмите кнопку «end», а затем там (после quiet) добавьте init =/bin/bash.
После добавления записи нажмите Ctrl + x или F10 для загрузки системы.
Debian теперь загрузится в однопользовательском режиме, а корневая файловая система смонтирована в режиме только для чтения (read-only mode). Поэтому используйте команду ниже для монтирования корневой файловой системы в режиме чтения-записи (read-write mode).
mount -o remount /
Наконец, измените пароль пользователя root с помощью команды passwd. Тут указываем новый пароль и подтверждаем его.
Перезагрузите систему и используйте новый пароль, который установили для пользователя root в вашей системе.
Ищешь бесплатное решение по реализации исходящих звонков из CRM Битрикс24 в связке с Asterisk? Поздравляем, нашел. Можешь закрыть все остальные вкладки и оставить только эту – пошаговое руководство по интеграции Б24 и Астериска в статье :)
Как это работает?
Легко (на этом можно было бы закончить). Мы создаем исходящий вебхук в Битрикс, он дергает php - скрипт на Asterisk каждый раз, когда мы будем нажимать на номер телефона в лиде, сделке, контакте – где угодно. Поехали.
Попробовать Битрикс24
Подготовка
Создадим AMI (Asterisk Manager Interface)– юзера, через которого будем инициировать вызовы. Откроем файл настройки:
vim /etc/asterisk/manager.conf
Обращаем внимание на секцию [general] - параметр enabled должен быть в значении yes:
[general]
enabled = yes // вот этот параметр :)
port = 5038
bindaddr = 0.0.0.0
Проверьте, чтобы в самом конце файла manager.conf были следующие строки (если их нет, добавьте):
#include manager_custom.conf
Проверили. А теперь открываем файл /etc/asterisk/manager_custom.conf (если его нет – создайте и дайте права) и добавляем туда:
[имя]
secret = пароль
deny=0.0.0.0/0.0.0.0
permit=127.0.0.1/255.255.255.0
permit=ip_адрес_Asterisk/маска
read = all,system,call,log,verbose,command,agent,user,config,originate
write = all,system,call,log,verbose,command,agent,user,config,originate
имя - придумайте имя для юзера;
пароль - создайте устойчивый к взломам пароль, с помощью сервисов онлайн генерации, например;
ip_адрес_Asterisk/маска - укажите вашу подсеть. В указанной подсети должен находится IP – адрес, с которого скрипт будет обращаться к AMI. Пример записи - 192.168.1.0/255.255.255.0;
Переходим в Битрикс24 и создаем вебхуки.
Вебхуки
Первый вебхук мы сделаем входящим – по нему наш скрипт будет получать внутренний номер сотрудника по его идентификатору. Переходим в раздел Приложения → Вебхуки. Нажимаем кнопку Добавить вебхук и выбираем Входящий вебхук. Делаем вот что:
Название - любое название, как вам удобно;
Описание - нужный момент, чтобы не запутаться в вебхуках;
Права доступа - отметьте галочкой Пользователи (user);
Нажимаем сохранить. Должно получиться примерно вот так:
Обратите внимание: на скриншоте, красной линией подчеркнут URL параметра Пример URL для вызова REST. Скопируйте его ровно до последней части /profile/. Например, у нас получилось:
https://merionet.bitrix24.ru/rest/2/1a2b3c4d5e6f7g8h
Сохраните этот URL – он нам еще пригодится :) Перед тем, как мы сделаем исходящий вебхук, давайте обсудим будущий URL нашего скрипта. Так как он будет располагаться в веб директории, мы предлагаем вам сгенерировать последовательно 3 директории, в которых будет лежать скрипт. И вот о чем мы: представим, что ваш домен выглядит вот так:
http://ilovemerionet.ru/
Гуд. Давайте последовательно сгенерируем 3 уникальных названия директорий, например:
IpVy7ul85sz1Doi
C49BNGJW3Yf30eo
qBN0NBC56lj07yh
После чего, в директории /var/www/html/ создадим три вложенных папки, чтобы наш файл в конечно итоге размещался в директории:
/var/www/html/IpVy7ul85sz1Doi/C49BNGJW3Yf30eo/qBN0NBC56lj07yh/
Сам файл скрипта, который мы сгенерируем, будет называться index.php, тем самым, вебхук со стороны Битрикс24 будет обращаться по следующему URL:
http://ilovemerionet.ru/IpVy7ul85sz1Doi/C49BNGJW3Yf30eo/qBN0NBC56lj07yh/
Кажется, разобрались :) Теперь создаем исходящий вебхук – прыгаем в раздел Приложения → Вебхуки. Нажимаем кнопку Добавить вебхук и выбираем Исходящий вебхук. Делаем вот что:
Код авторизации - это наш проверочный код, который мы используем в скрипте;
Адрес обработчика - как мы привели пример выше, тут будет http://ilovemerionet.ru/IpVy7ul85sz1Doi/C49BNGJW3Yf30eo/qBN0NBC56lj07yh/ - у вас, само собой, свой URL :);
Название - явное название, чтобы не запутаться. Сделайте Asterisk Calls, например?;
Комментарий - можете оставить комментарий для себя, чтобы было проще разобраться;
Тип события - выбираем Инициация звонка через приложение (ONEXTERNALCALLSTART);
Великолепно. Мы выходим на финишную прямую.
Скрипт для Asterisk
Ловите скрипт, который будет принимать вебхуки от Битрикс24. Комментарии к самым важным строкам, как всегда, присутствуют:
<?php
$check_token = "Код_авторизации"; // это значение будет прилетать нам в вебхуке. А мы будем его сравнивать, чтобы быть уверенными, что это Битрикс;
$user_hook_url = "Часть_входящего_вебхука"; // нужно, для получения внутреннего номера пользователя, которые инициирует звонок;
$ami_login = "ami_логин"; // логин к AMI, который мы создавали ранее;
$ami_password = "пароль"; // пароль к AMI, который мы создавали ранее;
$strhost = "IP_адрес"; // IP - адрес вашего Asterisk;
if (strcmp($_POST['auth']['application_token'], $check_token) === 0) {
function writeToLog($data, $title = '') {
$log = "
------------------------
";
$log .= date("Y.m.d G:i:s") . "
";
$log .= (strlen($title) > 0 ?
$title : 'DEBUG') . "
";
$log .= print_r($data, 1);
$log .= "
------------------------
";
file_put_contents(getcwd() . '/hook.log', $log, FILE_APPEND);
return true; }
writeToLog($_REQUEST, 'incoming');
$UID = $_POST['data']['USER_ID'];
$bitrix_contact_url = "$user_hook_url/user.get.json?ID=$UID";
$btc = curl_init();
curl_setopt ($btc, CURLOPT_URL,$bitrix_contact_url);
curl_setopt ($btc, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6");
curl_setopt ($btc, CURLOPT_TIMEOUT, 60);
curl_setopt ($btc, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt ($btc, CURLOPT_RETURNTRANSFER, 1);
$bitrix_contact = curl_exec ($btc);
curl_close($btc);
$bitrix_contact_o = json_decode($bitrix_contact, true);
$cid = $bitrix_contact_o['result'][0]['UF_PHONE_INNER'];
$strport = "5038";
$timeout = "5";
$num = str_replace("+","",$_POST['data']['PHONE_NUMBER_INTERNATIONAL']);
$callid = $_POST['data']['CALL_ID'];
$c="from-internal";
$p="1";
$errno=0 ;
$errstr=0 ;
$sconn = fsockopen($strhost, $strport, &$errno, &$errstr, $timeout) or die("Connection to $strhost:$strport failed");
if (!$sconn) { echo "$errstr ($errno)
"; }
else {
$sconn1 = fsockopen($strhost, $strport, &$errno, &$errstr, $timeout) or die("Connection to $strhost:$strport failed");
if (!$sconn1) { echo "$errstr ($errno)
"; }
else {
fputs($sconn1, "Action: login
");
fputs($sconn1, "Username: $ami_login
");
fputs($sconn1, "Secret: $ami_password
");
fputs($sconn1, "Events: off
");
usleep(500);
fputs($sconn1, "Action: Setvar
");
fputs($sconn1, "Variable: B24ID
");
fputs($sconn1, "Value: $callid/$cid
");
fputs($sconn1, "Action: Logoff
");
usleep(500);
$wrets1=fgets($sconn1,128);
fclose($sconn1);}
fputs($sconn, "Action: login
");
fputs($sconn, "Username: $ami_login
");
fputs($sconn, "Secret: $ami_password
");
fputs($sconn, "Events: off
");
usleep(500);
fputs($sconn, "Action: Originate
");
fputs($sconn, "Channel: SIP/$cid
");
fputs($sconn, "Callerid: $cid
");
fputs($sconn, "Timeout: 20000
");
fputs($sconn, "Context: $c
");
fputs($sconn, "Exten: $num
");
fputs($sconn, "Priority: $p
");
fputs($sconn, "Async: yes
" );
usleep(500);
$wrets=fgets($sconn,128);
fclose($sconn);
exit;
}} else {
exit;
};
?>
Скачать скрипт интеграции
После загрузки файла, сохраните его с расширением .php
В нем вам нужно поменять 5 переменных:
$check_token - код авторизации, который вы получили на этапе создания исходящего вебхука;
$user_hook_url - та часть входящего вебхука, которая подчеркнута на скриншоте до слов /profile/;
$ami_login - логин в AMI, создавали ранее;
$ami_password - пароль в AMI;
$strhost - IP - адрес вашего Asterisk;
Чтобы скрипт заработал, нужно, как мы говорили ранее, загрузить его в директорию /var/www/html/IpVy7ul85sz1Doi/C49BNGJW3Yf30eo/qBN0NBC56lj07yh/ (после генерации директорий у вас будет свой путь!) и дать следующие команды:
dos2unix /var/www/html/IpVy7ul85sz1Doi/C49BNGJW3Yf30eo/qBN0NBC56lj07yh/index.php
chown asterisk:asterisk /var/www/html/IpVy7ul85sz1Doi/C49BNGJW3Yf30eo/qBN0NBC56lj07yh/index.php
chmod 775 /var/www/html/IpVy7ul85sz1Doi/C49BNGJW3Yf30eo/qBN0NBC56lj07yh/index.php
Кстати, профит этого скрипта в том, что он ведет логирование в файле hook.log, который будет располагаться в той же директории. Если кто – то из ваших менеджеров скажет, что не смог позвонить клиенту – это будет легко проверить :)
Почти готово. Остался только один штрих. Снова открываем CRM Битрикс24, переходим в сегмент Телефония → Настройки и в параметре Настройка номеров по-умолчанию выбираем созданный нами вебхук (у нас он называется Приложения: Asterisk Calls:
А вот теперь готово. Звоним
Звонит :) Но! Не закрывает карточку и не добавляет отметку об исходящем звонке в сущность CRM (запись разговора). Внимательные пользователи обратят внимание – в AMI сегменте скрипта, который обсуждали ранее, мы кинули команду Setvar (присвоение переменной) к B24ID = $callid. Тем самым, на всем протяжении звонка у нас будет идентификатор этой телефонной транзакции.
Фактически, чтобы получить отметку о звонке, запись разговора и прочее, по факту окончания разговора нужно методом telephony.externalcall.finish кинуть массив данных, где будет отметка об идентификаторе вызова (которую передаем через диалплан), телефон инициатора вызова, длительность и ссылка на запись разговора.
Если данная статья вызовет интерес, мы покажем, как это сделать. Удачи с настройкой :)