Напомню, что у Мегафона есть услуга "Мультифон", которая позволяет использовать номер своего мобильного телефона на [теоретически] любом SIP-устройстве. На практике, как это обычно водится, её запустили в production не допилив как следует. Ну и плюс к тому, оборудование оператора не всегда справляется с пиковыми нагрузками, да и реализация SIP-протокола там идёт конкретно мимо RFC.
В результате при попытке привязать мультифоновский аккаунт к Asterisk 1.6 периодически наблюдаем неприятный эффект. С непонятной закономерностью SIP-registrar мегафона в ответ на очередное обновление регистрации клиента без видимых причин выдает "403 Forbidden - wrong password on authentication". После чего Asterisk прекращает всякие попытки перерегистрироваться заново, аккаунт "отваливается", звонки не проходят.
Проблема эта известная, уже много раз обсуждалась. Ей уже года два, так что это бородатый боян. И как водится, товарищам из Мегафона исправлять свой косяк лень, так что приходится подставлять собственные костыльки на клиентской стороне.
Кто-то решает вопрос обновлением Asterisk до версии 1.8. Говорят, помогает. Я пошел другим путем. Написал shell-скрипт и поставил его на запуск по cron-у каждые 5 минут. Если кому ещё надо, забирайте.
Если в выхлопе "sip show registry" видим строчку "No Authentication", то комментируем в конфиге все упоминания о Мультифоне, делаем "sip reload". Выдерживаем небольшую паузу, раскомментируем всё обратно и снова делаем "sip reload". Неэстетично, зато дешево, надежно и практично.
#!/bin/bash
CONF="/etc/asterisk/sip.conf"
COND="193.201.229.35"
GREP="/bin/grep"
SED="/bin/sed"
ASTERISK="/usr/sbin/asterisk"
REGEX="@multifon.ru"
if $ASTERISK -rx 'sip show registry' | grep "$COND" | grep "No Authentication" > /dev/null; then
$SED -i "/$REGEX/s/^/;/g" $CONF
$ASTERISK -rx 'sip reload'
sleep 5
$SED -i "/$REGEX/s/^\ *;*//g" $CONF
$ASTERISK -rx 'sip reload'
fi
exit 0
Ретранслировано из Я.ру