Рубрика «Python»

Как определить максимально дешевый маршрут звонка в Asterisk

Asterisk+Python: два метода определения самого дешевого маршрута для звонка

Недавно у моих коллег возникла задача – распределять исходящие звонки с Asterisk по транкам в соответствии с тем, чьему пулу принадлежит номер. В примитивной реализации достаточно просто добавить шаблоны телефонов по префиксам в маршруты FreePBX(927Х. – мегафон, 906Х. – билайн), однако, например, префикс 999 делят несколько операторов, а вообще в официальной таблице распределения DEF-номеров более 52 тысяч строк!

Основные критерии решения, которым хотелось бы следовать, были таковы:
1. Хочется получить совместимость не только с FreePBX, но и с чистым Asterisk, и любыми другими системами телефонии
2. Не хочется “ломать” логику диалплана FreePBX
3. Нужна простота настройки, так как заказ коммерческий, и нужно написать howto
4. Возможно, в будущем потребуется доработка, например, распределение исходящих звонков на городские номера в соответствии с регионом

Из вышесказанного следует, что:

1. Никакой работы с базой напрямую из диалплана
2. Изменения в диалплане должны быть минимальны, никаких extensions_override_freepbx
3. Кажется, пора расчехлять Python

Были разработаны две схемы: одна с использованием официального реестра распределения таблицы DEF-номеров от РосСвязьНадзора, вторая – с использованием API мегафона(единственный доступный публично), который легко может быть заменен на официальный API от оператора базы данных перенесенных номеров.

Первый вариант технически сложнее в реализации, и не учитывает номера, которые были переведены от оператора к оператору, но более надежный, быстрый и не зависит от проблем с каналом и сторонним API;

Второй, в свою очередь, более точный, учитывает перенесенные номера, но менее надежный и более медленный.

Суть реализации с точки зрения asterisk в разрезе FreePBX такова: в кастомном включении в from-internal вызываем скрипт, который по набранному номеру отдаст префикс, уникальный для каждого оператора, затем передаем звонок обратно на стандартное поведение FreePBX и настраиваем распределение по транкам на основе шаблонов маршрутов по префиксам. Для “чистого” asterisk достаточно просто добавить пару условных операторов для опредения алгоритма звонка по префиксу.

Для первого варианта бэкэнда, если так можно выразиться, связка получилась такая: один скрипт по расписанию стягивает(если получается) csv с сайта РосСвязьНадзора и парсит его в БД. Второй, вызываемый из астера, обращается к БД, находит название оператора по номеру и отдает префикс в соответствии с конфигурационным файлом.

Для второго все гораздо проще – просто обращаемся к API GET-запросом, получаем json, из которого берем код оператора по классификатору MNC, и уже его отдаем в asterisk.

Листинги обоих реализаций и более подробное описание смотрите по ссылкам.

Через CSV

Через API

 

Добавился на github

На прошлой неделе я наконец дозрел до создания своего первого репозитория на гитхабе! Размещенный там код – довольно простой пример реализации многопоточного сокет-сервера на Python. Код я показывал многоопытным товарищам, и конечно он не идеален, но вполне работоспособен. С полным описанием задачи и ее решением можно ознакомиться в wiki или в vk.

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

Собираем иерархию свитчей

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

Получилось немного строк питон-быдлокода, который можно посмотреть по ссылке. Надеюсь, у меня дойдут руки скомпоновать все это безобразие если не в пакет, то хотя бы в архив с инструкцией по установке.

Что делать, если при монтаже не подписали порты?

В компании, где я сейчас имею честь работать, вырисовалась такая проблемка: куча умных свитчей, куча клиентских машин, а ethernet-порты толком не подписаны. Возникает элементарнейшая проблема – машина отвалилась от сети – а где искать конец, какой коннектор жмякать? Помучившись недельку, а заодно освоив всякие глубины питона, lldp, cdp и snmp, я все-таки родил решение. Поначалу я хотел сниффить на всех машинах lldp от свитчей, но как ни бился, не смог добиться цели без установки на все сотни и тысячи машин всякие libpcap и прочую лабуду. Так что пришел к цели иным путем. А каким именно – читайте в wiki!

Python и свитчи

А вот сегодня возникла задачка – кое-что перенастроить на свитчах фирмы HP. Точнее, массово сменить пароли. Интересная особенность этого вендора – передать команды в ssh-подключении не выходит – говорит, что передача команд через SSH не поддерживается и рвет сессию.

Было решено попытаться помучить питона. В результате получился скриптик, который работает. Наверняка косой с точки зрения реализации, но работает же!

Подробности, как всегда, в wiki

Как скопировать файл на несколько компьютеров

Начал вникать в Python

Собственно, сабж. Начал тут помаленьку разбираться с Python и с чем его едят. Как минимум в качестве относительно кроссплатформенного скриптового языка для решения задач админства. Bash конечно привычней и понятней, но не будешь ж на нем под богомерзкую винду писать…  А тут на работе как раз возникла острая необходимость раскидать некий файл на несколько десятков рабочих столов. С групповыми политиками это было бы долго (никакого объединяющего признака у этих компов нет, а создавать отдельно OU ради каких-то ярлыков коллеги не захотели), а руками.. мы че, не админы что ли! В общем, получилось что получилось. Скомпилированный файл доступен по ссылке, а сам быдлокод в вики. На какой-нибудь git я стесняюсь.  Для работы скрипта запускать его надо от пользователя, которым без дополнительной авторизации доступны целевые каталоги на подопытных компах (например, от админа домена), скармливаем скрипту файл со списком компов (каждый с новой строки, ip или доменные имена – не важно), файл, который собственно надо залить и каталог назначения. Не забываем указывать расширения файлов, а каталог назначения указываем без слешей в начале и в конце, типа d$\test\script. Ну да, я – ленивая задница, не добавил обработки этих штук, но и скрипт – во-первых, первый в жизни на питоне, во-вторых, нужен был “вчера”, в-третьих, все-таки для админов.

Буду иногда выкладывать свои “достижения” в сфере разработки….