По вашему запросу ничего не найдено :(
Убедитесь, что запрос написан правильно, или посмотрите другие наши статьи:
img
Продолжаем рассказывать про Terraform. Предыдущая статья тут. В данной статье мы разберем динамичные блоки кода в Terraform, которые можно использовать в своей работе. Данный функционал значительно облегчает написание кода Terraform с помощью которого мы управляем сервисами Amazon. В статье будет описан сценарий с генерацией кода Terraform. Данный функционал был добавлен в terraform 0.12 версии. Для работы создадим новую директорию, можно путем копирования из предыдущего урока. Директорию назовем lesson-5. Для написания кода мы по-прежнему используем текстовый редактор Atom. Мы можем создать файлик с именем DynamicSecurityGroup.tf или переименуем существующий webserver.tf если вы добавили папку путем копирования. Если вы создавали путем копирования отредактируем файл, убрав строчки, которые создают веб-сервер. Удаляем. Теперь мы начнем писать код Terraform, чтобы у нас появилась динамическая группа безопасности. В прошлой статье мы прописывали 2 правила. Данные правила открывали нам порты 80 и 22, аналогично можно прописать, чтобы открывался порт 443 ну или любой другой, который нам необходим для корректного инстанса и работоспособности сервиса. А теперь представим, что нам необходимо открыть еще 20 разных портов. Можно сделать это с помощью copy-paste, т.е. копированием и вставкой уже существующих блоков кода с редактированием протокола и номеров портов. В terraform версии 0.12 добавили функционал и назвали его DynamicBlocks, что позволит генерировать кусочки кода в Terraform. Добавим следующую часть кода: dynamic "ingress" { for_each = ["80", "443", "8080", "1541", "9092"] content { from_port = ingress.value to_port = ingress.value protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] } } Разберем для лучшего понимания. Функция Dynamic, далее кавычки двойные и внутри мы пишем, что-будет динамическим, в нашем случае это функция Ingress. Открываем фигурные скобки и пишем цикл с помощью for_each = ["номерпорта1", "номерпорта2"] указывая номера портов. Следовательно, цикл for_each пройдется по каждому из параметров и будет применена конструкция content. Значения внутри конструкции content, будут заменены, а именно с какого порта на какой порт открывается доступ. Далее в конструкции content описываем используемый протокол сетевого уровня и cider_blocks – с каких IP или диапазонов IP разрешено использовать данной правило. Конструкция 0.0.0.0/0 позволяет указать, что данное правило с данным портом разрешено использовать всему интернету вне зависимости от IP адреса. В целях информационной безопасности рекомендую использовать конкретные подсети или конкретные IP адреса, конечно, если это не публичный сервис. Если посмотреть на пример, то написанное таким образом правило, сгенерирует нам 5 отдельных правил, т.е. получается достаточно удобно и сокращает нам количество строчек в коде, а также потенциально количество ошибок. Код становится более читаемым и легким. После использования в коде функции dynamic, мы можем удалить все ставшие ненужными функции ingress. Не забывайте изменить имя ресурса. Это делается путем редактирования переменной name в разделе функции resource, для читаемости кода и удобства управления ресурсами в облаке AWS. После того, как у нас готов наш код, мы можем его запустить. Так как, была создана новая папка, нам необходимо инициализировать ее использования. Переходим в необходимую директорию, в которой находится файл. И запускаем инициализацию стандартной командой terraform init. После ввода команды ожидаем пару минут, пока Terraform скачает все необходимые модули для подключения и работы. Следующей командой terraform apply мы запускаем код на исполнение. И получаем запрос на подтверждение операции. Среди вывода мы можем видеть: Это значит что все порты, которые были указаны в аргументах будут созданы. Осталось подтвердить и дождаться успешного выполнения операции.
img
Привет всем! В сегодняшней статье мы хотим рассказать об одном крайне полезном трюке, который поможет сохранить время Вам и клиентам, позвонившим в Вашу компанию. Демонстрировать этот функционал мы будем на IP-АТС Asterisk через графический интерфейс FreePBX 14. Данная статья будет особенно актуальна для тех, кто пользуется переадресацией входящих звонков на мобильный телефон. Возможно, кто-то уже использует данный способ, но многие могут о нем и не знать. Кейс Итак, представим себе такую гипотетическую ситуацию: К нам в компанию позвонил клиент; Звонок поступил на ринг группу 345, в которой находится 3 внутренних номера; Звонки с этих внутренних номеров переадресовываются на мобильные номера менеджеров; И вот на своём мобильном телефоне звонок клиента принял менеджер Алексей; Они общаются, и тут у клиента возникает вопрос к инженеру, клиент просит перевести его на инженера; Алексей может находиться вне офиса и не за стационарным телефоном и не может перевести звонок клиента обратно; Он просит клиента перезвонить на общий номер компании и донабрать внутренний номер инженера; Ситуация вполне нормальная, но мы вынуждены просить нашего клиента звонить повторно, донабирать номер, тратить свое время и так далее. Вот бы было здорово иметь возможность перевести звонок клиента на нужный номер прямо с мобильного? А ещё лучше, если мы сможем поговорить с человеком, на которого нужно перевести звонок и узнать не занят ли он, прежде чем делать трансфер! Такая возможность есть и сейчас мы объясним как её реализовать. Решение Дело в том, что когда звонки с нашей IP-АТС переводятся на мобильный телефон, то канал между ними не разрывается. Например, если у вас включена запись, то вы можете увидеть, что такие звонки также записываются. А значит, мы можем контролировать такие звонки на любом устройстве, даже на мобильном телефоне. Делать трансфер, ставить на ожидание, парковать и так далее. Для того, чтобы открылась возможность сделать трансфер на другой номер, находясь в звонке, нужно передать приложению Asterisk Dial() нужный аргумент. Во FreePBX это настраивается в Settings → Advanced Settings в разделе Dialplan and Operational. Здесь есть два поля - Asterisk Dial Options, в котором можно добавить аргументы Dial() при совершении внутренних звонков и Asterisk Outbound Trunk Dial Options, который отвечает за обработку аргументов Dial() при совершении внешних звонков через транк, как раз это поле нам и нужно. По умолчанию в данном поле всего один аргумент - большая буква T. Этот аргумент позволяет позвонившей стороне сделать трансфер используя feature code - ## Сервисный код ## соответствует функции “слепого” трансфера -In-Call Asterisk Blind Transfer Однако, когда мы принимаем звонок на мобильном телефоне, то являемся вызываемой стороной, поэтому нам нужен другой аргумент – маленькая буква t. С помощью данного аргумента, мы сможем делать трансфер находясь в звонке, используя всё тот же feature code - ##. Итак, можно добавить аргумент t в поле Asterisk Outbound Trunk Dial Options, но тогда этот функционал распространится на все транки, которые созданы на вашей IP-АТС. Есть более безопасный способ включить трансфер на принимающей стороне. Для этого переходим в Connectivity → Trunks и в настройках транка на вкладке General ищем опцию Asterisk Trunk Dial Options По умолчанию, в данной опции мы так же увидим аргумент T, так как стоит параметр System, который просто подтягивает значения аргумента из Asterisk Outbound Trunk Dial Options в Advanced Settings Выбрав параметр Override, мы можем записать сюда какие угодно аргументы и они будут действовать только для данного конкретного транка. Запишем сюда маленькую t. Итак, теперь, если Вы приняли вызов на мобильном телефоне, а человек, с которым Вы разговариваете просит перевести его на другого сотрудника, Вы можете просто: Нажать ## на своём мобильном телефоне, после чего Вы услышите в трубке сообщение “перевод”; Набрать нужный номер (например - 529). В это время позвонивший будет слышать музыку на ожидании; Вызов автоматически завершится, а звонок будет переадресован тому, чей номер Вы набрали; Profit; А помните мы говорили, что можно ещё поговорить с тем, кому нужно перевести вызов, прежде чем его переводить, чтобы уточнить не занят ли этот человек? Так вот такая возможность при принятии звонка на мобильном тоже есть! Если мы откроем возможные сервисные коды (feature code) функций трансфера, то увидим, что их два - ## - In-Call Asterisk Blind Transfer, который мы уже знаем, и *2 - функция консультативного трансфера - In-Call Asterisk Attended Transfer. Таким образом, можно также пользоваться консультативным трансфером, в этом случае нужно: Нажать *2 на своём мобильном телефоне, после чего Вы услышите в трубке сообщение “перевод”; Набрать нужный номер (например - 529). В это время позвонивший будет слышать музыку на ожидании; Дождаться, пока человек, которому нужно перевести вызов, ответит и узнать у него можно ли делать перевод. Если он сбросит или не возьмёт трубку, то ваш разговор с ожидающим на линии абонентом возобновится и Вы сможете объяснить ему, что соединиться не удалось; Если человек, которому нужно перевести вызов готов поговорить с ожидающим на линии абонентом, то нужно просто завершить вызов. Тогда разговор продолжится уже между ними; Кстати! Номер, который Вы набираете после того или иного сервисного кода, не обязательно должен быть внутренним. Это может быть любой другой номер (например, мобильный - *289012345678). Главное набирать его в таком формате, чтобы Ваша IP-АТС могла до него дозвониться.
img
Друзья, сегодня речь пойдет о синтезе речи в Asterisk. Этот простой способ позволит вам озвучивать требуемое голосовое сообщение в структурах IVR или обычных приветствиях. Да где угодно. Профит этого решения: Единый голос для всех аудио – файлов; Кэширование и сохранение озвученных текстов, фраз в виде медиа - файлов, для последующего использования на Asterisk; Получаем токен Приступим. Прежде всего нужно получить API - токен на использование сервиса от Яндекс. Этот процесс расписан в статье по ссылке ниже (раздел Получение API - токена Yandex.SpeechKit): Получение токена Возвращайтесь с токеном и будем приступать к коду :) Кодим! Для начала создадим директорию /var/lib/asterisk/tts/ и дадим права. Там мы будем хранить текстовый файл, благодаря которому, сможем идентифицировать аудио – файлы по совпадению MD5 названия. Внутри файла будет фраза: mkdir /var/lib/asterisk/tts/ chown asterisk:asterisk /var/lib/asterisk/tts/ chmod 775 /var/lib/asterisk/tts/ В зависимости от дистрибутива и вариантов установки IP – АТС Asterisk, звуковые файлы могут располагаться в другой директории. Вы можете самостоятельно поправить это в скрипте. Использовать будем AGI приложение. Традиционно, комментарии к коду прикладываются: #!/usr/bin/php -q <?php error_reporting(0); // выключаем ошибки, необязательно, нужно в процесcе дебага скрипта require('phpagi.php'); $agi = new AGI(); $str = $agi->request['agi_arg_1']; //записываем в переменную текст, который необходимо озвучить $str = iconv('cp1251', 'utf-8', $str); // конвертируем в кириллическую кодировку $md5 = md5($str); //вычисляем md5 - хэш от переменной $str $prefix = '/var/lib/asterisk/sounds/ru/custom/'; //устанавливаем директорию для файлов. Мы ее создавали по ходу движения $filename = $prefix.$md5; //устанавливаем название файла(оно будет равно md5 текста) $format = 'wav'; //устанавливаем формат получаемого файла от Яндекс $quality = 'hi'; //устанавливаем качество $speaker = 'oksana'; //выбираем голос. На момент написания статьи доступны женские голоса: jane, oksana, alyss и omazh и мужские голоса: zahar и ermil. $emotion = 'evil'; // выбираем интонацию голоса, good — радостный, доброжелательный, evil — раздраженный, neutral — нейтральный (используется по умолчанию). Будем злее :) $speed = '0.9'; // данный параметр отвечает за скорость (темп) речи, подбирается опытным путем на слух, в данном случае оптимальный $key = 'Ваш_токен'; //ваш токен, который вы получили ранее. if (!file_exists($filename.'.wav')) { $qs = http_build_query(array("format" => $format,"quality" => $quality,"lang" => "ru-RU","speaker" => $speaker,"speed" => $speed,"key" => $key,"emotion" => $emotion, "text" => $str)); //формируем строку запроса $ctx = stream_context_create(array("http"=>array("method"=>"GET","header"=>"Referer: "))); $soundfile = file_get_contents("https://tts.voicetech.yandex.net/generate?".$qs, false, $ctx); //запрашиваем файл $file = fopen("file1.wav", "w"); //открываем файл для записи fwrite($file, $soundfile); // пишем в файл данные fclose($file); //закрываем файл shell_exec('sox -t raw -r 48k -e signed-integer -b 16 -c 1 file1.wav -t wav -r 8k -c 1 '.$filename.'.wav'); //конвертируем файл под требования Asterisk и закидываем в директорию для аудио shell_exec('chown asterisk:asterisk '.$filename.'.wav'); shell_exec('chmod 775 '.$filename.'.wav'); // даем файлу нужные пермишны; shell_exec('rm -f file1.wav'); // удаляем файл, который создали в процессе обращения к API; shell_exec('echo '.$str.' > /var/lib/asterisk/tts/'.$md5.'.txt'); // добавляем магии ;-) о ней ниже в тексте статьи. } $agi->exec('Playback',"custom/$md5"); //проигрываем файл звонящему. Скачать скрипт синтеза речи После загрузки файла, сохраните его с расширением .php Сохраняем скрипт как texttospeech.php и закидываем его в директорию /var/lib/asterisk/agi-bin. После, даем последовательность следующих команд: dos2unix /var/lib/asterisk/agi-bin/texttospeech.php chown asterisk:asterisk /var/lib/asterisk/agi-bin/texttospeech.php chmod 775 /var/lib/asterisk/agi-bin/texttospeech.php Как вы могли заметить, скрипт настраивается. Голос, интонация, скорость речи, качество получаемого файла – подлежат корректировке для вашей задачи. Схема работы всего процесса следующая: Скрипт получает из диалплана текст по AGI и сохраняет в переменной; Если у нас уже существует аудио – файл для заранее записанной фразы, мы отдаем в диалплан команду на воспроизведение. Если нет – обращаемся к API; Скрипт отправляет запрос в сторону API Яндекса; Происходит конвертация полученного аудио – файла в нужный формат; Даем права файлу для воспроизведения на Asterisk и удаляем временный файл; Делаем отметку о создании файла в служебный текстовый файл; Воспроизводим файл; А как заставить скрипт работать? Очень просто. Открываем файл /etc/asterisk/extensions_custom.conf для редактирования и добавляем в него следующую запись: [text_to_speech] exten => s,1,Answer() exten => s,2,AGI(texttospeech.php,"Привет! Это Мерион Нетворкс. Если ты слышишь это сообщение, значит все сделал правильно!") Сохраняем изменения и прыгаем в FreePBX. Будем вызывать кастомный контекста из FreePBX. Для этого воспользуемся модулем Custom Destinations. Переходим по пути Admin → Custom Destinations и нажимаем Add Destination: Настроили и сохранили. Наша задумка такова – человек звонит на наш номер, набирает 13 и попадает на синтезированное сообщение. Переходим в главный IVR и в секции IVR Entries добавляем следующее: Звоним, проверяем. Работает :) Если хотите заменить фразу, которую нужно озвучить, просто поправьте ее в файле /etc/asterisk/extensions_custom.conf.
ВЕСЕННИЕ СКИДКИ
40%
50%
60%
До конца акции: 30 дней 24 : 59 : 59