Оповещение пользователей Asterisk о звонке на почту и jabber


Захотелось извещать пользователей Asterisk о поступающих им звонках. Наваял такой макрос:

[macro-notice_by_call]
exten => s,1,Verbose(4,Starting notification macros)
exten => s,n,Set(TIME_STRING=${STRFTIME($EPOCH,,%d %B %Y -  %T)})
exten => s,n,Set(SUBJECT_STRING=You call from ${CALLERID(name)} (${CALLERID(number)}))
exten => s,n,Set(MESSAGE_STRING=You call from ${CALLERID(name)} (${CALLERID(number)}). Time: ${TIME_STRING})

exten => s,n,GotoIf($[${ISNULL(${DB(abonent/${MACRO_EXTEN}/notyfication_jabber)})}]?skip_jabber_notification)
exten => s,n,GotoIf($[${DB(abonent/${MACRO_EXTEN}/notyfication_jabber)}=0]?skip_jabber_notification)
exten => s,n,jabbersend(asterisk,${DB(abonent/${MACRO_EXTEN}/jabber)},${MESSAGE_STRING})
${STRFTIME($EPOCH,,${TIME_STRING})})
exten => s,n(skip_jabber_notification),NoOp(No need jabber notification)
 
exten => s,n,GotoIf($[${ISNULL(${DB(abonent/${MACRO_EXTEN}/notyfication_email)})}]?skip_email_notification)
exten => s,n,GotoIf($[${DB(abonent/${MACRO_EXTEN}/notyfication_email)}=0]?skip_email_notification)
exten => s,n,system(echo "${MESSAGE_STRING}" | mail -s "${SUBJECT_STRING}" ${DB(abonent/${MACRO_EXTEN}/email)});
exten => s,n(skip_email_notification),NoOp(No need email notification)

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

Добавляем информацию в базу следующим образом:

asterisk -rx "database put abonent/101 email user@example.com"
asterisk -rx "database put abonent/101 jabber user@jabber.ru"
asterisk -rx "database put abonent/101 notyfication_email 1"
asterisk -rx "database put abonent/101 notyfication_jabber 1"

Соответственно, в нужное место диалплана втыкаем

exten => 101,1,Macro(notice_by_call)

Если мы воткнем до звонка абоненту, то он будет знать о всех входящих звонках, на мой взгляд это более правильно, будет палить всех. Можно воткнуть и после звонка, но тогда человек будет узнавать о звонке, только в том случае, если ему будут звонить дольше чем это задано в команде DIAL.

Соответственно, если кому-то хочется извещать другими путями, то в общем-то скелет, вроде, вполне рабочий.

P.S. Жаждущие могут прикрутить SQL по вкусу.