пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ
Слишком длинный поисковый запрос.
По вашему запросу ничего не найдено :(
Убедитесь, что запрос написан правильно, или посмотрите другие наши статьи:
img
В сегодняшней статье рассмотрим модуль, который стал доступен во FreePBX только с версии 13 и который позволяет создать первичную низкоуровневую защиту нашей IP-АТС - Firewall. Нужно отметить, что попытки создать нечто подобное на ранних версиях FreePBX всё-таки были, но все они не увенчались успехом и заставляли пользователей так или иначе идти на компромиссы для сохранения доступности функционала IP-АТС. Модуль Firewall был разработан с глубоким пониманием существующих проблем и его основной целью является защита “средней”, или другими словами, типовой инсталляции при обязательном сохранении VoIP сервисов. /p> Данный модуль отслеживает и блокирует атаки, пропуская при этом разрешенный трафик, а также непрерывно контролирует конфигурацию системы, автоматически открывая и закрывая порты для необходимых транков. Настройка модуля Firewall Перейдём к настройке. Для того, чтобы попасть в модуль, нужно перейти по следующему пути: Connectivity -> Firewall, откроется следующее окно: Чтобы включить модуль, нажмите кнопку Enable Firewall. Обратите внимание, после включения модуля никакие правила ещё не задействованы, их нужно настроить. Первое о чём сообщает модуль, это то, что IP-адрес, под которым мы зашли на IP-АТС не является членом “зоны доверия” (Trusted Zone) и предлагает добавить его для исключения возможных блокировок: Для наибольшего понимания, давайте разберёмся с понятием зоны (Zone), которым оперирует модуль Firewall. Все сетевые соединения, поступающие на VoIP-сервер считаются частью зоны. Каждый сетевой интерфейс и данные, поступающие на него принадлежат к определенной зоне. Стандартные зоны делятся на следующие: Reject - Все соединения, относящиеся к данной зоне, запрещены. Обратите внимание, что эта зона по-прежнему принимает RTP трафик, но никакие другие порты по умолчанию не прослушиваются. Трафик данной зоны может быть обработан с помощью Responsive Firewall, о котором будет сказано далее. External - Позволяет только https соединения для доступа к интерфейсу управления и UCP порту, если они определены. Трафик данной зоны может также быть обработан с помощью Responsive Firewall Other - Используется на доверенных внешних сетях, или других хорошо известных сетях. По умолчанию, позволяет получить доступ к UCP, а также обеспечивает нефильтрованный SIP и IAX. Internal - Используется на внутренних локальных сетях, по умолчанию позволяет получить доступ ко всем сервисам IP-АТС. Trusted - Все сетевые соединения данной зоны разрешены. Пропускается весь трафик от доверенной зоны. Именно сюда нам предложат добавить наш IP-адрес при первом включении модуля. Итак, чтобы добавить наш IP-адрес в список доверенных, нужно нажать You can add the host automatically here. Мы попадём во вкладку Preconfigured. Предлагается два варианта, это добавление адреса хоста и добавление подсети Add Host и Add Network соответственно: Проверить, что адрес (или сеть) добавлены в список доверенных можно во вкладке Zones в разделе Networks. В модуле Firewall есть также дополнительный элемент, который отслеживает сигнализационные запросы определённых сервисов и блокирует возможные атаки - Responsive Firewall. Такими запросами могут быть запросы протоколов сигнализации SIP или IAX, например, запросы авторизации или вызова. Когда Responsive включен, то любой сигнализационный пакет исходящий от хоста проходит через Firewall, если после некоторого количества таких пакетов, хост отправлявший их не прошёл успешную регистрацию, то весь трафик от этого хоста сбрасывается на короткий промежуток времени (60 сек). Если после данной блокировки хост продолжает слать пакеты с запросом регистрации и безуспешно пытается зарегистрироваться, то блокируется уже его IP-адрес на 24 часа. Кроме того, если на сервере настроен fail2ban, то система ещё и письмо отправит о данном событии. Чтобы включить данный функционал, на вкладке Responsive нужно нажать на кнопку Enable: Далее необходимо указать, для каких протоколов должен работать данный функционал: Известные IP-адреса или даже целые подсети, которые проявляли подозрительную активность и которые не должны иметь доступа к IP-АТС можно заблокировать во вкладке Zones -> Blacklists. И последний по счёту, но не по значимости, функционал модуля Firewall, о котором хотелось бы рассказать - Safe Mode. Данный функционал позволяет получить доступ к IP-АТС если случайно была применена неправильная конфигурация, которая привела к потере доступа, а доступа к консоли у вас нет. При включении модуля Firewall, Safe Mode уже доступен, но чтобы его активировать, необходимо дважды перезапустить систему. Сначала необходимо выполнить перезапуск один раз, дождаться, пока сервер полностью загрузится, а затем произвести вторую перезагрузку. После чего, система отложит загрузку правил Firewall’а, а вы сможете спокойно убрать ту конфигурацию, из-за которой потеряли доступ. О том, что система находится в Safe Mode, будет говорить огромное уведомление в самом верху страницы, которое исчезнет через пять минут, тогда же запустятся правила Firewall.
img
Привет, коллега. Сегодня хотим сделать небольшой обзор двух продуктов компании Cisco, а именно, сервер обеспечения голосовых сообщений Cisco Unity Connection (CUC) и сервер обмена мгновенным сообщениями и доступностью абонента Cisco Unified Presence (Instant Messaging and Presence, IM&P). Cisco Unity Connection Данное решение компании Cisco Systems предназначено для сервиса голосовых сообщений, голосовой почты и распознавания голоса. Сервер CUC обеспечивает доступ пользователей к голосовой почте в рамках архитектуры Unified Communications. Один высокопроизводительный сервер может обеспечить взаимодействие с 20 000 пользователей. Функционал распознавания речи, который создан как для внутренних так и для внешних пользователей, позволяет управлять системой с помощью голоса. Встроенный почтовый сервер обеспечивает автоматическую отправку голосовых сообщений, а так же, предоставляется возможность прослушивать свою почту через WEB – интерфейс через интернет браузер. Cisco Unity Connection – одно из пяти продуктов компании Cisco базирующихся на операционной системе Linux. Вся информация, такая как медиа данные, а так же статистические данные хранятся локально на сервере в БД IBM Informix. Сервер CUC поддерживает интеграцию с различными телефонными станциями, поддерживая соединение как через IP, так и через TDM. Для удобства одновременной настройки большого числа пользователей, понимает стандартный формат Comma-Separated Values (CSV). Данный файл содержит информацию о множестве пользователей, может быть создан через Microsoft Office и импортирован через консоль Unity Connection. Параллельно, поддерживается ручная настройка пользователей и синхронизация с Active Directory по протоколу Lightweight Directory Access Protocol (LDAP). Сервер Cisco Unity Connection обеспечивает традиционный телефонный интерфейс пользователя Telephone User Interface (TUI) для взаимодействия через Dual-Tone Multi-Frequency (DTMF) протокол. Лицензирование Следующие лицензии на CUC предоставляется производителем: SpeechView - данная технология распознает голосовое сообщение и отправляет его в виде текста на почтовый ящик. Распространяется в расчете 1 лицензия / 1 пользователь. Голосовой ящик - лицензия на 1 пользовательский ящик для голоса. Аппаратная платформа Продукт Cisco Unity Connection может быть установлен на различных аппаратных платформах, например, HP или IBM. Рекомендуется инсталляция на сервера Cisco Convergence Server (MCS). Cisco Unified Presence (Instant Messaging and Presence, IMP) Данное решение компании Cisco Systems предназначено для расширения базовых статусов доступности и состояния абонента, передающихся с Cisco Unified Communications Manager (CUCM), таких как трубку поднята или снята. Продукт IMP предназначен для передачи информации о состоянии коллег и бизнес партнеров (доступен, занят и отошел), которая видна пользователю еще до звонка. Корпоративный обмен мгновенными сообщениями, Instant Messaging (IM), обеспечивает чат –группами или индивидуальными чат – сессиями отдельных пользователей. Основная цель IM&P это сокращение времени дозвона до абонента корпоративной сети, путем обеспечения статуса доступности этого абонента. Пользователи могут самостоятельно менять статус, а так же, сообщать тип устройства через которое они доступны, например, это может быть мобильный или стационарный телефон. Сервер IM&P настраивается в связке с CUCM, который обеспечивает телефонную сигнализацию и базовый статус о доступности, такой как поднятие и снятие телефонной трубки. Основные протоколы, обеспечивающие передачу статусов пользователей, это SIP for Instant Messaging and Presence Protocol (SIMPLE) и Extensible Messaging and Presence Protocol (XMPP). Итак, Instant Messaging and Presence предоставляет следующие конкурентные преимущества: Корпоративный обмен мгновенными сообщениями - коммуникации сотрудников в режиме реального времени путем обмена сообщениями в чате. Решение предоставляет возможность как индивидуального, так и группового обмена мгновенными сообщениями Архивация и хранение данных - решение предоставляет возможность сохранять листинг переписки в PostgreSQL базе данных. Это позволяет всегда вернуться к важной корпоративной переписке. Виртуальное присутствие - удобная визуализация статуса доступности абонента делает решение максимально привлекательным для корпоративного сегмента.
img
Промис в JavaScript — это заменитель (прокси) для значения текущей операции. Обычно мы используем промис для управления ситуациями, когда необходимо дождаться результата операции. Например, при загрузке файлов на сервер и ожидании ответа от API, или просто при запросе у пользователя выбора файла с их компьютера. В этой статье вы узнаете о промисах в JavaScript, создавая реальное приложение, похожее на приведенное ниже: Что такое промис?  Промис — это просто функция, она возвращает объект, к которому можно прикрепить обратные вызовы. Обратные вызовы, прикрепленные к объекту промиса, будут вызываться только после завершения операции. Обратные вызовы будут ожидать, пока операция не будет выполнена или отклонена. fetch(`some_api_url`).then((response) => { // Everything here will wait the fetch operation to complete }); Прежде чем промис окончательно решится (то есть либо выполнится, либо будет отклонен), он должен пройти через разные состояния: Состояние Описание Обратный вызов Ожидание Операция все еще выполняется, и промис находится в ожидании - Выполнен Операция завершена успешно .then() Отклонен Операция завершена с ошибкой .catch() Завершен Промис либо разрешен, либо отклонен, в любом случае вызывается этот обратный вызов .finally() Когда создается промис, начальное состояние — ожидание. Затем, в зависимости от результата операции, промис либо выполняется, либо отклоняется. Из таблицы выше можно легко увидеть обратный вызов, который будет вызван в зависимости от состояния промиса: fetch(`some_api_url`).then((response) => {  // This will get called when the promise fulfills }).catch((error) => {  // This will get called when the promise is rejected }).finally(() => {  // This will get called all the time }) Как использовать промисы в JavaScript Теперь, когда вы узнали, что такое промис, давайте покажем, как вы можете использовать промисы в JavaScript, создав приложение для поиска фильмов, которое мы видели ранее. Базовое приложение для поиска фильмов должно иметь поле ввода, где пользователи могут искать свои любимые фильмы. Также должно быть пользовательский интерфейс для отображения базовой информации о найденном фильме. Давайте начнем с создания HTML. Как написать HTML Для целей этого руководства и чтобы показать живые примеры, я буду использовать Codepen, но вы можете использовать ваш любимый редактор кода. Создайте файл index.html и добавьте следующий код:             Movie
               
                                         
                        
         
      
                                           
                       
            
                           

Details

                               
  • Premiered: 
  •                 
  • Rating: 
  •                 
  • Runtime: 
  •                 
  • Status: 
  •                            
                                           Watch Movie           
                                                
                  
    Мы создали скелет нашего приложения для фильмов. Теперь давайте оживим его с помощью CSS: %[https://codepen.io/Spruce_khalifa/pen/wvygzLq?editors=0100] Как получить фильм Чтобы получить наш фильм, мы будем использовать API TVMAZE. Создайте файл main.js и добавьте следующий код: const get_movie = (value = "Game of thrones") => {   fetch(    `https://api.tvmaze.com/singlesearch/shows?q=${value}&embed=episodes`  ).then((response) => create_UI(response.json())); }; Мы создали функцию get_movie(value = "Game of thrones"), которая использует API fetch в JavaScript. Мы используем его для выполнения GET запроса к нашему API фильмов. API fetch возвращает промис. Чтобы использовать ответ от API, мы прикрепляем обратный вызов .then(), в который передаем response.json() в новую функцию create_UI(). Давайте создадим функцию create_UI: const create_UI = (data) => { const movie_img = document.querySelector("#img_src"); const movie_icon = document.querySelector("#img_icon"); const movie_title = document.querySelector(".movie_title"); const movie_desc = document.querySelector(".movie_desc"); const movie_link = document.querySelector(".btn"); const movie_date = document.querySelector("#movie_date"); const movie_rating = document.querySelector("#movie_rating"); const movie_runtime = document.querySelector("#movie_runtime"); const movie_status = document.querySelector("#movie_status"); // set the UI  movie_icon.src = data.image.medium;  movie_img.src = data.image.original;  movie_title.textContent = data.name;  movie_desc.innerHTML = data.summary;  movie_link.href = data.officialSite;  movie_date.textContent = data.premiered;  movie_rating.textContent = data.rating.average;  movie_runtime.textContent = data.runtime;  movie_status.textContent = data.status; }; Эта функция, как следует из названия, помогает нам создать пользовательский интерфейс для нашего приложения фильмов. Но нам все еще нужен способ получить имя фильма от пользователей, так что давайте это исправим. Первое, что нам нужно сделать, это добавить обработчик события onsubmit в нашу HTML-форму:
      //
    Теперь в нашем файле main.js мы можем обработать то, что происходит при отправке формы: // handle form submit const search = (event) => {  event.preventDefault(); const value = document.querySelector(".header_form-input").value; get_movie(value); }; Каждый раз, когда пользователь отправляет форму, мы получаем значение, которое они ввели в поле поиска, и передаем его в функцию get_movie(value = "Game of thrones"), которую мы создали ранее. Цепочка промисов В отличие от того, что мы видели в предыдущих примерах, обратный вызов .then() не является концом. Дело в том, что когда вы возвращаете значение промиса, вы получаете другой промис. Это становится очень полезным, когда вы хотите выполнить серию асинхронных операций по порядку. Например, наше API фильмов не только возвращает информацию о фильме, но и информацию обо всех эпизодах. Допустим, что мы действительно не хотим отображать все эпизоды "Игры престолов", нам нужны только первые четыре (4) эпизода. С помощью цепочки промисов мы можем легко этого достичь: const get_movie = (value = "Game of thrones") => {  fetch(`https://api.tvmaze.com/singlesearch/shows?q=${value}&embed=episodes`)    .then((response) => response.json())    .then((data) => {      if (data._embedded.episodes.length > 0) {        const new_data = data._embedded.episodes.slice(0, 4);        create_UI(data);        return create_episodesUI(new_data);      } else {        return create_UI(data);      }    }); }; Это все та же функция get_movie(), но на этот раз, вместо того чтобы передавать данные в функцию create_UI, мы возвращаем ответ .then((response) => response.json()). Это создает новый промис, к которому мы можем прикрепить дополнительные обратные вызовы. В идеале эта цепочка может продолжаться бесконечно. Помните, что все, что вам нужно сделать, это вернуть значение промиса. Как обрабатывать ошибки в промисах Ошибки, которые происходят в промисе, немедленно попадают в обратный вызов .catch(): fetch(`https://api.tvmaze.com/singlesearch/shows?q=${value}&embed=episodes`)    .then((response) => response.json())    .then((data) => {      // any error here will trigger the .catch() callback    }).catch((error) => {    // all errors are caught and handled here    }) Обратный вызов .catch() является сокращением для .then(null, (error) => {}). Вы также можете написать это так: fetch(`https://api.tvmaze.com/singlesearch/shows?q=${value}&embed=episodes`)    .then((response) => response.json())    .then((data) => {      // any error here will trigger the .catch() callback    }, (error) => {    // all errors are caught and handled here    }) В нашем приложении для поиска фильмов, например, когда мы сталкиваемся с ошибками, мы можем обработать и отобразить пользователям приятное сообщение об ошибке в обратном вызове .catch(): const get_movie = (value = "Game of thrones") => { fetch(`https://api.tvmaze.com/singlesearch/shows?q=${value}&embed=episodes`)    .then((response) => response.json())    .then((data) => {      if (data._embedded.episodes.length > 0) {        const new_data = data._embedded.episodes.slice(0, 4);        create_UI(data);        return create_episodesUI(new_data);      } else {        return create_UI(data);      }    })    .catch((error) => {      console.log(error.message);      // Challange: display your error here    }); }; Теперь, если по какой-то причине мы получаем ошибку, обратный вызов .catch() будет вызван, и мы отобразим корректную ошибку пользователю. Как создать промисы в JavaScript Теперь, когда мы узнали, что такое промисы и как их использовать, давайте посмотрим, как мы можем создать промис в JavaScript. Чтобы создать промис в JavaScript, используйте конструктор промиса. Конструктор принимает один аргумент: функцию с двумя параметрами, resolve и reject: const is_true = true const new_promise = new Promise((resolve,reject) => {  if(is_true) {    // everything went fine    resolve()  } else {    // Oops there was an error    reject()  } }) Затем мы можем использовать наш new_promise, прикрепляя к нему обратные вызовы: new_promise .then((response) => {    // everything went fine }) .catch((error) => {    // handle errors }); Подведем итоги В этом руководстве мы узнали о промисах, что это такое и как их использовать, создавая приложение для поиска. Счастливого кодинга!
    ЗИМНИЕ СКИДКИ
    40%
    50%
    60%
    До конца акции: 30 дней 24 : 59 : 59