18 июня 2015

Телефонная конференция по запросу.

Задача-  "Создание телеконференции по запросу пользователя". Речь идет о телефонном номере, позвонив на который пользователи объеденяются в телеконференцию.
Самый простой способ- создать конференцию вручную по запросу пользователя и отправить ему данные.

Но это не наш метод. Коференция будет "создаваться" автоматически, в ответ на электронное письмо пользователя.




Мое решение позволяет:
1. Проверять отправителя (письма только с домена организации).
2. Проверять соответствие уже созданных конференций и отправителя (1 конференция на пользователя).
3. Проверять лимит созданных конференция.
4. Не требует перезагрузки конфигурации Asterisk при создании новой конференции.

Получение почты и проверку отправителя отдадим fetchmail и procmail. Отправлять будет sendemail.
Установка и настройка:

cd /tmp/
wget http://caspian.dotconf.net/menu/Software/SendEmail/sendEmail-v1.56.tar.gz

tar -zxvf sendEmail-v1.56.tar.gz
cp -a sendEmail-v1.56/sendEmail /usr/local/bin
sudo chmod +x /usr/local/bin/sendEmail

touch /root/.fetchmailrc
chmod 700 /root/.fetchmailrc
mkdir /home/asterisk/meetings
touch /home/asterisk/meetmail/ok.mail
touch /home/asterisk/meetings/meetme.sh
touch /home/asterisk/meetings/meetme-clear.sh
chmod +x /home/asterisk/meetings/meetme.sh
chmod +x /home/asterisk/meetings/meetme-clear.sh
touch /home/asterisk/meetings/tmp.file
touch /home/asterisk/meetings/meetcount
touch /home/asterisk/meetings/meetcountmail
mkdir /home/asterisk/meetmail

yum install fetchmail

cat >/root/.fetchmailrc
port 110
user 'conference'
pass 'password'
mda "/usr/bin/procmail -d %T"
EOF

cat >/root/.procmailrcPATH=/usr/sbin:/usr/bin
MAILDIR=/home/asterisk/meetmail/
DEFAULT=$MAILDIR
VERBOSE=YES

:0:
*^From:.*(@shrainer\.me)
*^Subject: meetme
| formail -x From: >> /home/asterisk/meetmail/ok.mail

:1:
*^From:.*
/dev/null
EOF

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

Первый скрип отвечает на запросы пользователей. Procmail складывает в файл ok.mail только адреса и только отправителей прошедших проверку. В конце работы скрипт благополучно херит всю полученную почту, за не надобностью:

#cat /home/asterisk/meetings/meetme.sh
#!/bin/bash

BDPATH=/home/asterisk/meetings
TMPFILE=$BDPATH/tmp.file
ALRMAIL=$BDPATH/meetcountmail
FLOOR=1001
RANGE=9999

fetchmail -F
echo | sed 's/ *(.*)//; s/>.*//; s/.*[<] *//' /home/asterisk/meetmail/ok.mail | awk 'NR%2==0' >> $TMPFILE

if [ -s "$TMPFILE" ]
then

while read line; do
    MAIL=$line
    MAILCHECK=`grep $MAIL $ALRMAIL|wc -l`
    if [ $MAILCHECK -ne 0 ]
    then
        ROOMNUM=`grep $MAIL $ALRMAIL | awk '{print $1}'`
        PASS=`asterisk -rx "database get CONFERENCE/$ROOMNUM userpin" | grep -i 'Value:' | awk '{print $2}'`
        /usr/local/bin/sendEmail -f conference@shrainer.me -t $MAIL -o message-charset=utf-8 -o message-content-type=html -u "Конференция была создана ранее" -m "

Конференция по вашему запросу уже была создана ранее.

Данные конференции

Внешний номер телефона - 7-495-XXX-XX-XX (Россия, Москва)
Внутренний номер конференции - $ROOMNUM
пинкод - $PASS
Инструкция http://shrainer.me


Напоминаем! Срок жизни конференци до 23:59 текущего дня.
" -s pop.shrainer.me
    else
        MEETNUM=(`cat $BDPATH/meetcount`)
    
        if [[ "$MEETNUM" -gt "1005" ]];
        then
        /usr/local/bin/sendEmail -f conference@shrainer.me -t $MAIL -o message-charset=utf-8 -o message-content-type=html -u "Конференция не была создана" -m "

В настоящее время свободных комнат телеконференций нет.

Если телеконференция нужна вам сегодня, обратитесь в службу технической поддержки.
" -s pop.shrainer.me
        else
        if [[ "$MEETNUM" -le "0" ]];
        then ROOMNUM="1000"
        echo $ROOMNUM > $BDPATH/meetcount
        else ROOMNUM=$MEETNUM
        fi
        echo $((ROOMNUM+1)) > $BDPATH/meetcount
    
        PASS=`asterisk -rx "database get CONFERENCE/$ROOMNUM userpin" | grep -i 'Value:' | awk '{print $2}'`
    
        /usr/local/bin/sendEmail -f conference@shrainer.me -t $MAIL -o message-charset=utf-8 -o message-content-type=html -u "Конференция успешно создана" -m "

Данные конференции

Внешний номер телефона - 7-495-XXX-XX-XX (Россия, Москва)
Внутренний номер конференции - $ROOMNUM
пинкод - $PASS
Инструкция http://shrainer.me


Напоминаем! Срок жизни конференци до 23:59 текущего дня.
" -s pop.shrainer.me
        echo `date` $MAIL $ROOMNUM >> /var/log/tmpmeetings.log
        echo $ROOMNUM $MAIL >> $ALRMAIL
        fi
    fi
done < $TMPFILE

rm -rf TMPFILE

fi

rm -rf /home/asterisk/meetmail/*
cat /dev/null > $TMPFILE
cat /dev/null > /home/asterisk/meetmail/ok.mail

Скрипты будут запускаться кроном:

cat >>/etc/crontab<#*/10 * * * * root HOME=/root /bin/bash /home/asterisk/meetings/meetme.sh -s

#59 23 * * * root /bin/bash /home/asterisk/meetings/meetme-clear.sh



EOF

Теперь пользователь, отправив письмо на адрес conference@shrainer.me с темой meetme, получит данные номера телеконференции.

Не блогадарите.