Денис Пестрецов
31.05.2020
4303

Добавление нового ключа в fwconsole, и создание fwconsole password.

В этой статье рассмотрим как добавляются новые ключи в утилиту fwconsole на примере простого вывода пароля от внутреннего номера (или группы внутренних номеров) в командной строке. Утилита fwconsole позволяет из командной строки управлять некоторыми процессами FreePBX, к примеру перезагружать, применять конфигурационные файлы, включать/отключать транки. Более подробно о возможностях fwconsole можно прочесть в статье Использование fwconsole […]

В этой статье рассмотрим как добавляются новые ключи в утилиту fwconsole на примере простого вывода пароля от внутреннего номера (или группы внутренних номеров) в командной строке.

Правки кода будем рассматривать для FreePBX 13 версии.

Утилита fwconsole позволяет из командной строки управлять некоторыми процессами FreePBX, к примеру перезагружать, применять конфигурационные файлы, включать/отключать транки. Более подробно о возможностях fwconsole можно прочесть в статье Использование fwconsole во FreePBX 13.

Но, к сожалению, список таких параметров ограничен. В этой статье рассмотрим, как можно расширить параметры своими функциями.

Правки кода

В этом разделе рассмотрим, какие правки в код FreePBX необходимо внести для добавления новых ключей в fwconsole.

Большинство основных ключей fwconsole описаны классами в каталоге …/admin/libraries/Console/.

Создадим здесь новый файл Pass.class.php и откроем его в режиме редактирования.

Перед объявлением класса необходимо прописать пространство имён и всё, что по-стандарту используется:

namespace FreePBX\Console\Command;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
Теперь переходим к описанию самого класса. В файл вставляем следующий код:
class Pass extends Command
{
…
}

Внутрь данного класса будем помещать методы и свойства.

Так как отображать пароли необходимо не только одного-двух внутренних номеров, но и целого диапазона, ограничим его ширину. Установим максимальную ширину одного диапазона — не более 1000 внутренних номеров. Для этого прописываем следующее свойство:

private $max_length_range = 1000;

Теперь объявим конфигурацию нашего ключа. Делается это следующим методом:

protected function configure()
{
    $this->FreePBXConf = \FreePBX::Config();
    $this->setName('pass')
    ->setAliases(array('password'))
    ->setDescription(_('Get secret of extensions'))
    ->setDefinition(array(
        new InputArgument('args', InputArgument::IS_ARRAY, null, null),));
}

Здесь, в параметре setName указываем имя ключа, по которому будем обращаться; в setAliases указываем возможные алиасы (удобные для запоминания) имена; в setDescription указываем описание работы fwconsole с этим ключом. Массивы аргументов оставляем по умолчанию.

Перейдём к описанию метода выполнения. Объявляется он стандартно для большинства классов ключей fwconsole:

protected function execute(InputInterface $input, OutputInterface $output)
{
…
}

В тело данного метода помещается код, описывающий работу ключа. В нашем случае, код следующий:

$args = $input->getArgument('args');
foreach ($args as $ext)
{
    if (strpos($ext, '-') !== false)
        $this->getPassByRange($ext, $output);
    else
    {
        $ext_info = \FreePBX::Core()->getDevice($ext);
        if (empty($ext_info['secret']))
            $ext_info['secret'] = 'Not found';
        $output->writeln($ext . ' : ' . $ext_info['secret']);
    }
}

Коротко рассмотрим код, описанный выше. Сперва, стандартным методом getArgument получаем список всех аргументов (внутренних номеров и диапазонов), пароль которых необходимо получить. Если данный аргумент является диапазоном, то вызываем метод getPassByRange (её описание рассмотрим ниже). Если данный аргумент является обычным внутренним номером, то вызываем метод getDevice модуля Core, с помощью которого получаем пароль.Его выводим в консоль с помощью метода writeln. Каждый такой вывод будет располагаться в отдельной строке.

Метод getDevice возвращает множество различных данных по внутреннему номеру, поэтому его можно использовать и для вывода других параметров. Для этого понадобится вывести другие элементы массива $ext_info.

Теперь рассмотрим функцию getPassByRange:

private function getPassByRange($range, $output)
{
    $range_list = explode('-', $range);
    if (empty($range_list[0]) || empty($range_list[1]))
    {
        $output->writeln($range . ' : Incorrect! Left or right part of range is empty');
        return true;
    }
    $begin = trim($range_list[0]);
    $end = trim($range_list[1]);
    if (!is_numeric($begin) || !is_numeric($end) || $begin > $end)
    {
        $output->writeln($range . ' : Incorrect range!');
        return true;
    }
    $length = $range_list[1] - $range_list[0];
    if ($length > $this->max_length_range)
    {
        $output->writeln($range . ' : exts counts more '. $this->max_length_range . '. If you really need this, please set another value for $max_length_range variable in file .../admin/libraries/Console/Pass.class.php');
        return true;
    }
    $i = $begin;
    while ($i <= $end)
    {
        $ext_info = \FreePBX::Core()->getDevice($i);
        if (empty($ext_info['secret']))
            $ext_info['secret'] = 'Not found';
        $output->writeln($i . ' : ' . $ext_info['secret']);
        $i = $this->customInc($i);
    }
}

Коротко рассмотрим описанный выше код. В массив $range_list помещаем левую и правую границы диапазона. Затем проверяем, что эти границы существуют и являются числовыми. Также проверяем, что размер диапазона не превышает максимально допустимого max_length_range, объявленного ранее.

Если все условия выполнены, то запускаем цикл от левой границы диапазона до правой с шагом 1, в котором получаем пароль с помощью метода getDevice и выводим его.

Для инкремента счётчика цикла используем кастомную функцию customInc:

private function customInc($i)
{
    $len = strlen($i);
    $i++;    
    while(strlen($i) < $len)
        $i = '0' . $i;
    return $i;
}

Она необходима для правильного инкремента внутренних номеров с ведущим нулём, к примеру: 0008, 0009. Ведь если увеличивать стандартной функцией inc, то получим: inc(0008) = 9, а номер 0009 и 9 вовсе не одно и то же для Asterisk.

На этом описание класса Pass.class.php завершено.

Теперь необходимо изменить владельца этого файла на пользователя asterisk. Делается это командой:

chown asterisk:asterisk Pass.class.php

из директории …/admin/libraries/Console/.

Можно переходить к тестированию функционала.

Выведем в консоль пароли внутренних номеров 101, 111, несуществующего номера 106 и диапазона номеров 0020-0022. Для этого воспользуемся командой:

fwconsole pass 101 111 116 0020-0022

Рис. 1. Получение паролей

Как видим из скриншота выше, получили запрашиваемые пароли. В случае с несуществующим номером 116 получаем сообщение “Not Found”.

На этом статья по добавлению нового ключа в fwconsole на примере создания нового ключа password завершена.

Подписаться
Уведомить о
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии

Остались вопросы?

Я - Першин Артём, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.

VoIP оборудование

ближайшие курсы

ближайшие Вебинары

ONLINE

10 доводов в пользу Asterisk

Распространяется бесплатно.

Asterisk – программное обеспечение с открытым исходным кодом, распространяется по лицензии GPL. Следовательно, установив один раз Asterisk вам не придется дополнительно платить за новых абонентов, подключение новых транков, расширение функционала и прочие лицензии. Это приближает стоимость владения станцией к нулю.

Безопасен в использовании.

Любое программное обеспечение может стать объектом интереса злоумышленников, в том числе телефонная станция. Однако, сам Asterisk, а также операционная система, на которой он работает, дают множество инструментов защиты от любых атак. При грамотной настройке безопасности у злоумышленников нет никаких шансов попасть на станцию.

Надежен в эксплуатации.

Время работы серверов некоторых наших клиентов исчисляется годами. Это значит, что Asterisk работает несколько лет, ему не требуются никакие перезагрузки или принудительные отключения. А еще это говорит о том, что в районе отличная ситуация с электроэнергией, но это уже не заслуга Asterisk.

Гибкий в настройке.

Зачастую возможности Asterisk ограничивает только фантазия пользователя. Ни один конструктор шаблонов не сравнится с Asterisk по гибкости настройки. Это позволяет решать с помощью Asterisk любые бизнес задачи, даже те, в которых выбор в его пользу не кажется изначально очевидным.

Имеет огромный функционал.

Во многом именно Asterisk показал какой должна быть современная телефонная станция. За многие годы развития функциональность Asterisk расширилась, а все основные возможности по-прежнему доступны бесплатно сразу после установки.

Интегрируется с любыми системами.

То, что Asterisk не умеет сам, он позволяет реализовать за счет интеграции. Это могут быть интеграции с коммерческими телефонными станциями, CRM, ERP системами, биллингом, сервисами колл-трекинга, колл-бэка и модулями статистики и аналитики.

Позволяет телефонизировать офис за считанные часы.

В нашей практике были проекты, реализованные за один рабочий день. Это значит, что утром к нам обращался клиент, а уже через несколько часов он пользовался новой IP-АТС. Безусловно, такая скорость редкость, ведь АТС – инструмент зарабатывания денег для многих компаний и спешка во внедрении не уместна. Но в случае острой необходимости Asterisk готов к быстрому старту.

Отличная масштабируемость.

Очень утомительно постоянно возвращаться к одному и тому же вопросу. Такое часто бывает в случае некачественного исполнения работ или выбора заведомо неподходящего бизнес-решения. С Asterisk точно не будет такой проблемы! Телефонная станция, построенная на Asterisk может быть масштабируема до немыслимых размеров. Главное – правильно подобрать оборудование.

Повышает управляемость бизнеса.

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

Снижает расходы на связь.

Связь между внутренними абонентами IP-АТС бесплатна всегда, независимо от их географического расположения. Также к Asterisk можно подключить любых операторов телефонии, в том числе GSM сим-карты и настроить маршрутизацию вызовов по наиболее выгодному тарифу. Всё это позволяет экономить с первых минут пользования станцией.