Собираем linux systemd сервис из программы на Python


Будем делать systemd сервис из приложения на Питоне. Часто это необходимо, если вам нужно, чтобы при старте операционной системы (и сети) запускался ваш код на Python. 

Начнем с bash скрипта, который будет отвечать за старт и рестарт приложения.

Обновить openssl до последней версии на Linux

Если вдруг вам необходимо обновить openssl до последней официальной версии например на Ubuntu/Debian, вы столкнётесь с тем, что через менеджер пакетов это сделать не получится.

Необходимо скачать последнюю/необходимую версию с сайта и выполнять ряд простых действий.

Asterisk: защита от подбора паролей к SIP аккаунтам

Заметил, что у некоторых клиентов в Asterisk, который расположен за роутером и не имеет проброшенных к нему портов снаружи, стучатся боты пытаясь подобрать пароли к SIP аккаунтам. Как это происходит при отсутствии dnat, тема отдельной статьи. Тут мы разберем простые методы, которыми можно этому противостоять.

Asterisk: отслеживаем события AMI и отправляем POST запрос в CRM (Python)


Поступила задача связать Asterisk c неизвестной CRM системой. Среди прочего требовалось отправлять POST запрос в формате JSON в момент ответа оператором на входящий звонок. В момент, когда оператор поднимает трубку - необходимо в CRM открывать для него карточку клиента/заказа.

Bitrix24: поиск номера телефона по ID, php скрипт для Asterisk

Потребовалось получить номер телефона клиента из Bitrix24 по ID записи. Нужно это для соединения сотрудников с клиентами без предоставления им реального номера телефона (номер телефона скрыт для группы пользователей). То есть, сотрудник зная id клиента сможет дозвониться до него не имея прямого доступа к номеру телефона. В целом необходимость данного решения - вопрос спорный. Мы же рассмотрим лишь техническую реализацию. Возможно механизм решения кому-то пригодится для быстрой интеграции, хотя возможно удобнее будет использование AGI и, например, PAMI.

OpenVPN: быстрая настройка на Ubuntu 18.04

Ну что же, очередной мануал по настройке OpenVPN.
Надоело каждый раз искать и вспоминать, когда нужно быстро настроить OpenVPN сервер, так что описал быструю настройку. Этот пост в большей мере написан для себя. В моём случае используется Ubuntu 16 или 18 и все просто работает.

Zimbra: сообщение от вымогателя с моего адреса, подмена адреса отправителя

Пользователям стали приходить почтовые сообщения вымогателя отправленные якобы с их же адреса с заголовком "Ваше устройство взломано злоумышленниками. Немедленно смените пароль!". Тело сообщения начиналось словами: "Как вы могли заметить, я отправил вам это электронное письмо из вашего почтового аккаунта. Это означает, что у меня есть полный доступ к вашему устройству".

Итак, проверим свою почтовую систему отправив анонимное сообщение на свой адрес через сервис anonymailer.net указав отправителем свой адрес. Если сообщение приходит и в качестве отправителя - ваш email, нужно настроить Зимбру (в моем случае 8.8.15) следующим образом.

MySQL (MariaDB): репликация базы Master - Slave

Репликация позволяет иметь копию рабочей базы на другом сервере и обновлять её в режиме реального времени. Можно снизить нагрузку на рабочем сервере делая SELECT запросы в базу на слейве, или бекапить данные с копии на слейве не нагружая основной сервер.

В моём случае между серверами настроено VPN подключение, через которое будет происходить обмен данными. Репликацию базы будем делать по схеме Master (10.1.254.1) - Slave (10.1.254.3).

Nextcloud: долгий выход в Google Chrome

https://settled70.blogspot.com/2019/11/nextcloud-google-chrome.html
При использовании Nextcloud заметил проблему с долгим выходом (logout) при использовании браузера Google Chrome. Выход из web-приложения может занимать до нескольких минут. Как выяснилось, проблема была на стороне Chrome (и всех браузеров на движке Chromium) - при выходе он долго удалял куки и кеш сайта. Если это сделать до выхода из меняю настройки браузера, то операция совершалась быстро. Исправляем ситуацию на стороне nextcloud, подошло это решение.

Открываем файл /var/www/nextcloud/core/Controller/LoginController.php, находим и комментируем там строчку: $response->addHeader('Clear-Site-Data', '"cache", "storage"') - у меня это на 131 строке, далее добавляем свой код. Получиться должно следующее:

Asterisk: кто ответил клиенту в очереди

Нам нужно получить номер оператора, который ответил клиенту в очереди. В случае, если мы используем Asterisk CDR Viewer Mod, то в поле Куда звонили нам нужно отображать номер оператора принявшего звонок. На данный момент в случае работы очереди, там отображается "s" (триггер по умолчанию также отображал неверный номер при использовании очереди).
Сначала добавим новое поле в mysql базу, потом научим астериск писать туда номер ответившего сотрудника, далее напишем mysql триггер, который будет перезаписывать поле dst нужным номером в случае попадания в очередь (из диалплана dst доступен только для чтения, поэтому мы будем подменять его триггером).

Asterisk: отправить сообщение при ожидании клиента в очереди более 3 минут

Потребовалось реализовать следующее: если клиент ожидает в очереди ответа более 3 минут - необходимо отправить сообщение в Telegram с именем (CallerID) и номером телефона клиента. Здесь мы рассмотрим как реализовать это самым простым способом, напрямую из диалплана.

Итак, клиент заходит в очередь, ему проигрывается сообщение автоинформатора и начинает играть фоновая музыка пока оператор не ответит на его звонок. Если клиенту не отвечают в течение 21 минуты, мы выходим из очереди и выполняем с ним дальнейшие действия (например, кладем трубку).

Соединение двух серверов Asterisk по протоколу IAX2

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

Для начала соединим сервера в одну сеть используя VPN. После этого мы настроим связь между серверами используя протокол IAX2 (The Inter-Asterisk eXchange protocol, version 2). Это собственный протокол Asterisk, для работы он использует всего один порт 4569 и с ним удобнее работать через NAT.

Шлюз на Ubuntu: автоматический обход блокировок сайтов

Представим ситуацию, в которой сотрудникам компании необходимо получить доступ к заблокированным провайдерами РФ ресурсам. Статья не призывает нарушать закон (хотя, ничего противозаконного в этом нет), а лишь показывает возможность обхода блокировок. Итак, у нас есть шлюз на базе Ubuntu 18.04, сервис бесплатного VPN доступа protonvpn.com и сервис со списком заблокированных IP адресов antifilter.download. С сервиса мы будем брать список недоступных подсетей и создавать маршруты к ним через наш VPN. В итоге пользователи получат доступ к заблокированным ресурсам автоматически без использования дополнительных программ на своей стороне.

MySql: подключаем таблицу из удаленной базы

Нужно из локальной базы MySql на первом сервере обратиться к таблице в базе на втором сервере. Чтобы не тянуть всю базу, не настраивать сложные условия синхронизации было принято решение организовать локальную FEDERATED таблицу, которая будет обращаться к удаленной таблице. Это быстрее, часто безопаснее (при правильной настройке) и проще.

Порядок действия следующий: включаем поддержку FEDERATED на первом сервере MySQL, создаем на нем federarted таблицу с такой же структурой (либо только с необходимыми полями), настраиваем VPN доступ до необходимого сервера, на втором сервере создаем пользователя mysql с требуемыми правами доступа к необходимой таблице с требуемого IP адреса.

Asterisk не отвечает на INVITE, проблемы с NAT? SIP ALG

Случилась у одного клиента такая ситуация: звонки с транка (Билайн подключенный по SIP) не приходят на астериск. Судя по tcpdump-у запросы INVITE приходят, но с каким-то левым destination port и в дебаге астериска их не видно. При этом исходящие соединения проходят без проблем. Билайн уверяет, что проблема на нашей стороне. Что делать, если все проверили и не может разобраться в чем дело? В моём случае оказалось, что на роутере Zyxel Keenetic Giga был включен SIP ALG по умолчанию.

Рассмотрим несколько решений проблемы с ответом сервера, когда ваш Astertisk находится за NAT:

PHP авторизация LDAP через Active Directory для Asterisk CDR Viewer

В этой статье мы прикрутим авторизацию через Active Directory к Asterisk CDR Viewer используя PHP скрипт. Это решение актуально для авторизации корпоративных пользователей, которым нужно предоставить доступ к какому-то web ресурсу внутри сети на основе присутствия пользователя в группе в домене AD. Вы можете легко переделать скрипт под свои нужны и использовать для доступа к подобным сервисам или страничкам.

Для использования нужных функций нам понадобится установить модуль php-ldap.
Далее мы создадим группу в AD с именем Статистика Asterisk и включим в неё всех пользователей, которым необходим доступ.

Asterisk 16: работаем с AstDB, используем встроенную базу данных

Итак, Asterisk имеет простую встроенную базу данных AstDB, которая позволяет хранить данные в формате "Группа => ключ => значение". Используя встроенную БД можно реализовать настройку переадресации звонка пользователем, создание черного списка, привязки абонента к конкретному оператору и т.п. Для доступа к этой базе данных мы будем использовать следующие функции:

Wordpress: WooCommerce счет на оплату в формате PDF

Занялся Интернет-магазином на базе Woocommerce. Заказчик попросил добавить метод оплаты по счету для клиентов без привязки к какой-либо платежной системе. Поискав в сети обнаружил, что готового плагина для этих целей нет. Cоздавать свой плагин для этой цели нет ни возможности, ни бюджета. В данной статье мы воспользуемся 2 плагинами: WooCommerce PDF Invoices & Packing Slips для создания счёта на оплату и WooCommerce Invoice Gateway для добавления метода оплаты по счёту.

Bash cкрипт парсинга событий в логах в реальном времени

Пишем простой скрипт, который будет парсить лог программы в реальном времени и при нахождении нужной строки отправлять сообщение. В нашем случае будем смотреть лог Asterisk и при попытке подбора паролей оповещать по Telegram админа сервера.

MySQL: основные команды, бекап, bash скрипт, сброс root пароля

Простой скрипт, который локально на сервере бекапит сайт и данные в домашнюю папку пользователя и хранит копии за последние 7 дней. Можно быстро сохранить сайт изменив пути в скрипте и использовать для переноса сайта на новый хостинг.

В данном примере имя базы данных: site_base, файлы располагаются по адресу /var/www/site-dir.

ESXi vSphere CLI: завершение работы виртуальных машин, скрипт на bash / sh

В жизни ИТ специалистов могут возникать ситуации, когда нужно максимально быстро завершить работу серверов. В нашем случае речь идет о виртуальных машинах на гипервизоре VMware ESXi, которые нужно попытаться мягко выключить и после этого погасить сервер.

Если машины мягко не выключатся (зависли или на них не установлены vm-tools), то ждем 10 секунд и выключаем "аппаратно" т.к. в данном случае мы идем на оправданный риск.

BigBlueButton: демонстрация экрана, плагин для Google Chrome

Пост больше про то, как создать свой плагин для Google Chome с постоянным ID без публикации в Chrome WebStore (установка из папки). Пост для себя.

SSL сертификат: бесплатное получение и продление, wildcard на все поддомены

Решил обновить статью по получению и продлению бесплатных SSL сертификатов для сайтов на выделенном сервере. Пишу больше для себя, поэтому если возникнут вопросы - пишите в комментариях. Пользоваться будем сервисом letsencrypt.org. На их сайте рекомендуется использовать клиента Certbot. В качестве web сервера у меня nginx, соответственно будем использовать его для подтверждения хоста при получении сертификата.

Установка клиента

Вы можете самостоятельно выбрать на сайте сертбота вашу операционку для добавления репозитория и дальнейшей установки через менеджер пакетов. Я буду использовать скрипт, он ставится на любую ОС, сам доустанавливает нужные пакеты и работает так же, как и любая другая версия.
wget https://dl.eff.org/certbot-auto
chmod a+x certbot-auto
./certbot-auto
В первый раз при запуске скрипт установит все зависимости для работы.

Asterisk: SQL запросы, время ожидания в очереди, переменные в dialplan из файла

К моим клиентам в call центр иногда поступает большой поток звонков. Одни их них придумали свой нестандартный способ переключения режима фоновой музыки (автоинформатора) в очереди астериска в зависимости от нагрузки на операторов, который не реализуется штатными средствами.  Мы будем анализировать логи очередей и по заданным условиям менять настройки диалплана. Условия были озвучены следующие:
1. Если за последний час в очереди было не менее 4х клиентов ожидающих ответа более 4 минут, то менять режим сообщений информатора очереди на усиленный (3852-hard).
2. Если за последний час в очереди было менее 4х клиентов ожидающих ответа более 6 минут, то возвращаем режим сообщений информатора очереди на обычный (3852-soft).