Asterisk: SMS и SIP сообщения. Отправка сообщений оффлайн.

Данная настройка поможет осуществить отправку сообщений абонентам, которые в данное время не подключены к серверу.
После отправки сообщения абоненту, который находится оффлайн, вы получите уведомление о том что он недоступен. И при следующем входе абонента, он получит сообщение автоматически.

Данную схему использовал на Elastix 4.0.76, Asterisk 11.25.3.

Редактируем конфиги.

В файл sip_general_custom.conf добавляем следующие строки:
accept_outofcall_message = yes
outofcall_message_context = messages
auth_message_requests = yes

В файл extensions_custom.conf:
[messages]
exten => _X.,1,NoOp(SMS receiving dialplan invoked)
exten => _X.,n,NoOp(To ${MESSAGE(to)})
exten => _X.,n,NoOp(From ${MESSAGE(from)})
exten => _X.,n,NoOp(Body ${MESSAGE(body)})
exten => _X.,n,Set(ACTUALTO=${CUT(MESSAGE(to),@,1)})
exten => _X.,n,ExecIf($["${ACTUALTO}" != "sip:${EXTEN}"]?Set(ACTUALTO=sip:${EXTEN}))
exten => _X.,n,MessageSend(${ACTUALTO},${MESSAGE(from)})
exten => _X.,n,NoOp(Send status is ${MESSAGE_SEND_STATUS})
exten => _X.,n,GotoIf($["${MESSAGE_SEND_STATUS}" != "SUCCESS"]?sendfailedmsg)
exten => _X.,n,Hangup()
;
; Handle failed messaging
exten => _X.,n(sendfailedmsg),NoOp(Sending error to user)
exten => _X.,n,Set(SRC=${MESSAGE(from)})
exten => _X.,n,Set(DST=${MESSAGE(to)})
exten => _X.,n,Set(MSG=${MESSAGE(body)}) 
exten => _X.,n,Set(DESTDEV=${EXTEN})
exten => _X.,n,Set(THISDEVSTATE=${DEVICE_STATE(SIP/${DESTDEV})})
exten => _X.,n,Set(MESSAGE(body)="[${STRFTIME(${EPOCH},,%d%m%Y-%H:%M:%S)}] В данное время абонент ${EXTEN} недоступен.")
exten => _X.,n,Set(ME_1=${CUT(MESSAGE(from),<,2)})
exten => _X.,n,Set(ACTUALFROM=${CUT(ME_1,@,1)})
exten => _X.,n,MessageSend(${ACTUALFROM},SupportBot)
exten => _X.,n,GotoIf($["${INQUEUE}" != "1"]?startq)
exten => _X.,n,Hangup()
;
exten => _X.,n(startq),NoOp(Queueing messaging for offline)
exten => _X.,n,Set(MSGTIME=${STRFTIME(${EPOCH},,%d%m%Y-%H:%M:%S)})
exten => _X.,n,SYSTEM(/var/lib/asterisk/agi-bin/astqueue.sh –SRC '${SRC}' –DST '${DST}' –MSG '${MSG}')
exten => _X.,n,Hangup()

[app-fakeanswer]
exten => _X.,1,NoCDR
exten => _X.,n,Set(DESTDEV=${EXTEN})
exten => _X.,n,Set(THISDEVSTATE=${DEVICE_STATE(SIP/${DESTDEV})})
exten => _X.,n,GotoIf($["${THISDEVSTATE}" = "UNAVAILABLE"]?hang)
exten => _X.,n,GotoIf($["${THISDEVSTATE}" = "UNKNOWN"]?hang)
exten => _X.,n,Answer
exten => _X.,n,Hangup()
exten => _X.,n(hang),Hangup()

Создаем скрипт обработки.

Временная папка:
mkdir /var/spool/asterisk/temp
chown -R asterisk:asterisk /var/spool/asterisk/temp

Сам скрипт:
nano /var/lib/asterisk/agi-bin/astqueue.sh

Содержимое фала скрипта:
#!/bin/bash
# v0.2
# copyleft Sanjay Willie sanjayws@gmail.com
# SCRIPT PURPOSE: GENERATE SMS OFFLINE QUEUE
# GEN INFO: Change variables sections
###########################################
#
#VARIABLES
maxretry=2880
retryint=30
#
#CONSTANTS
ERRORCODE=0
d_unique=`date +%s`
d_friendly=`date +%T_%D`
myrandom=$[ ( $RANDOM % 1000 ) + 1 ]
#
function bail(){
      echo "SMS:[$ERRORCODE] $MSGOUT. Runtime:$d_friendly. UniqueCode:$d_unique"
    exit $ERRORCODE
}
source=$2
dest=$4
message=$6
#
#
if [[ "$source" == "" ]]; then
    echo "ERROR: No source. Quitting."
    ERRORCODE=1
    bail
fi
if [[ "$dest" == "" ]]; then
    echo "ERROR: No usable destination. Quitting."
    ERRORCODE=1
    bail
fi
if [[ "$message" == "" ]]; then
    echo "ERROR: No message specified.Quitting."
    ERRORCODE=1
    bail
fi
#
# generate call file
mydate=`date +%d%m%y`
logdate=`date`
#
# Check to see if extension exist
destexten=`echo $dest | cut -d @ -f1 | cut -d : -f2`
ifexist=`asterisk -rx "sip show peers" | grep -c $destexten`
if [[ "$ifexist" == "0" ]]; then
    echo "Destination extension don't exist, exiting.."
    ERRORCODE=1
    bail
fi
# If that conditions pass, then we will queue, 
# you can write other conditions too to keep the sanity of the looping
filename="$destexten-$d_unique.$myrandom.call"
echo -e "Channel: Local/$destexten@app-fakeanswer
CallerID: $source
Maxretries: $maxretry
RetryTime: $retryint
Context: messages
Extension: $destexten
Priority: 1  
Set: MESSAGE(body)=$message
Set: MESSAGE(to)=$dest
Set: MESSAGE(from)=$source
Set: INQUEUE=1 "> /var/spool/asterisk/temp/$filename
# move files
chown asterisk:asterisk /var/spool/asterisk/temp/$filename
chmod 777 /var/spool/asterisk/temp/$filename
sleep 3
mv /var/spool/asterisk/temp/$filename /var/spool/asterisk/outgoing/
#
ERRORCODE=0
bail

maxretry — максимальное количество повторов отправки сообщения.
retryint — интервал между повторами

Поправим права на файл:
chown asterisk:asterisk /var/lib/asterisk/agi-bin/astqueue.sh
chmod +X /var/lib/asterisk/agi-bin/astqueue.sh

Оригинал: highsecurity.blogspot.com/2013/01/asterisk-10-or-11-messaging-smssip.html
Thanks SANJAY WILLIE'S for this script.
Поделиться:

Нет комментариев