Asterisk конференции — создание через почту

в 9:20, , рубрики: asterisk, bash, Серверное администрирование, метки: ,

Asterisk конференции — создание через почту
Конференц-колы это очень удобный и нужный сервис. Собирать участников просто(они сами дозваниваются и подключаются), количество абонентов почти не ограничено(пока канал не кончится), телефонные линии свободны (если конференции у вас висят на отдельном sip номере с неограниченным количеством сессий.) Есть только одно неудобство — конференция создается по заявке. И если у админа заявок море, а то и заболел (уснул, напился, умер), то создание конференц-кола сильно затягивается. К тому же пароль у постоянных конференций тоже постоянный. И в этом случае бывший участник всегда сможет к ней подключиться, а то и вообще собрать там свой митинг, что ни есть гуд. Вот такие мысли крутились в моей голове после помпезного объявления по компании о запуске конференц-колов. И решено было создание телеконференций автоматизировать.

Но! Делать мы это будем через почту. Схема следующая. Пользователь пишет письмо с определенной темой на определенный адрес. Через некоторое время ему возвращается ответ с данными телеконференции.
Действующие лица и исполнители:
Crontab — Хроноголик. Постоянно испытывает потребность следить за временем, запускает bash скрипт и сопутствующие команды.
Fetchmail — Несчастный пролетарий, которого постоянно гоняют на почту и если таковая обнаруживается бедолага вынужден тащить неподъемные сообщения на сервер при помощи MTA.
Sendmail — та самая MTA при помощи которой fetchmail таскает письма на сервер.
Sendemail — легкомысленная профурсетка, которая, думая что шлет пользователям любовные записки, на самом деле, будучи жестоко обманутая bash скриптом, отправляет ответ с настройками конференции.
Bash скрипт — злостный эксплуататор всех вышеописанных персонажей. Тем не менее тоже не в масле катается, обрабатывает полученные письма, анализирует их и создает конференции.

Прежде всего необходимо установить и настроить fetchmail. А sendmail можно просто установить, настраивать для наших целей необязательно. Я руководствовался данной статьей (http://www.opennet.ru/base/net/fetchmail_setup.txt.html) чего и вам желаю. Для тех же кому некогда: в профиле пользователя, который имеет права на /etc/asterisk необходимо создать файл .fetchmailrc в котором прописать настройки подключения к серверу:

Пример.

	poll address.mail.server
	port 995
        proto POP3
        user 'account'
        pass 'password'
        ssl

Проверить подключение можно командой fetchmail -k. В случае правильных настроек по адресу /var/spool/mail/username появиться отправленное письмо.

Далее. Crontab каждые 10 минут запускает срипт. А около 12 ночи стирает счетчик конференций и файл с временными конференциями.

*/10 * * * * cd /opt/bbb/meetings/ && ./mkmeet
59 23 * * * cat /dev/null > /etc/asterisk/meetme_additional.conf && cat /dev/null > /opt/neoflex/metings/meetcount

Ну и наш жестокий эксплуататор:

#!/bin/bash

#Проверяем почту и удаляем письма с сервера
fetchmail -F

#Форматируем полученные письма, записываем результат во временный файл
echo | sed -n '/From:/p; /Subject:/p' /var/spool/mail/username | sed s'/From/from/'g | sed s'/Subject/subject/'g | sed 's/ *(.*)//; s/>.*//; s/.*[:<] *//' | sed s'/:/ /'g >> tmp.file

#Путь к временному файлу
bdpath=/opt/bbb/meetings

#Временный файл
num=(`cat $bdpath/tmp.file`)

#Счетчик номера конференции
meetc=(`cat $bdpath/meetcount`)

#Если номер конференции меньше чем ноль, то tmpconf = 5000, иначе равен счетчику
if [[ "$meetc" -le "0" ]];
then 
tmpconf="5000"
echo "${tmpconf[$c]}" > meetcount
else
tmpconf=$meetc
fi

#Задаем значение переменных
a=0
b=`expr $a + 1`
c=0

#Начинаем цикл
while [ ${num[$a]} ]
do

#Генерируем пароль
FLOOR=10000
pass=0
while [ "$pass" -le $FLOOR ]
do
pass=$RANDOM
done

#Задаем значение переменных
mail=${num[$a]}
subj="${num[$b]}"
cut=`echo ${num[$a]} | sed 's/^.*@//'`

#Проверяем что письмо пришло от "наших", а не кого попало.
if [[ "$cut" != "firma.ru" ]];
then subj="khuy"
fi

Если тема письма meetme, создаем конференцию и отправляем пользователю данные.
if [[ "$subj" == "meetme" ]];
then 
echo "conf => ${tmpconf[$c]},$pass" >> /etc/asterisk/meetme_additional.conf
/usr/sbin/asterisk -rx "reload"
sendemail -f asterisk@firma.ru  -t $mail -o message-charset=utf-8 -o message-content-type=html -u "Conference call was successfully created" -m "<p>Данные конференции
</p><p>Внешний номер телефона - 8(XXX)XXX-XXXX<br>Внутренний номер телефона - 550<br>Номер конференции - ${tmpconf[$c]}<br>пароль - $pass<br>Ссылка на инструкцию
 https://wiki.firma.ru/pages/viewpage.action?pageId=28066722<p><b>Напоминаем!!! Срок жизни конференци до 23:59 сегодняшнего дня.</b></p>" -s mail.firma.ru -xu asterisk@firma.ru -xp "password"
echo `date` $mail ${tmpconf[$c]} >> /var/log/tmpmeetings.log
tmpconf=`expr ${tmpconf[$c]} + 1`
fi

a=`expr $a + 2`
b=`expr $b + 2`

done

rm tmp.file
echo "$tmpconf" > meetcount
cat /dev/null > /var/spool/mail/root

Вот и все. Теперь рассылаем не менее помпезное заявление о создании временных телеконференций и… На ваш вкус :))

Автор: Bansher

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js