Конфигурация:
; extensions.conf
[globals]
MD110 => DAHDI/g1
MEGAFON => DAHDI/g0
[general]
static=yes
writeprotect=yes
autofallthrough=yes
clearglobalvars=no
priorityjumping=no
; обработка входящих звонков
[from-hacker]
exten => s,1,Hangup ; дефолтный контекст для sip, iax, etc.
[from-pcm0] ; от мегафона
include => switching ; коммутатор
[from-pcm1] ; от офисной MD110
include => compatibility ; временная подстановка номеров на время перехода
include => switching ; коммутатор
include => to-megafon ; спб на мегафон
;include => to-sipnet ; россию на сипнет
;include => to-easyvoip ; европу на изи
[from-factory] ; от шлюза Addpac 2640 в другом городе
include => compatibility ; временная подстановка номеров на время перехода
include => switching ; коммутатор
include => to-megafon ; спб на мегафон
;include => to-sipnet ; россию на сипнет
;include => to-easyvoip ; европу на изи
[from-sipphone] ; звонки от сипфонов, подключенных к самому астериску
include => compatibility ; временная подстановка номеров, пока переделываю телефонную сеть
include => switching ; коммутатор
include => to-megafon ; спб на мегафон
;include => to-sipnet ; россию на сипнет
;include => to-easyvoip ; европу на изи
[to-megafon] ; исходящий в город
; сейчас все звонки идут через мегафон, sipnet и easyvoip в отпуске
; международный вызов (номер начинается с 8-10)
; если у звонящего определенный номер, то разрешаем
; по умолчанию - запрещено
exten => _810.,1, NOOP()
same => n, GotoIf($["${CALLERID(num)}" = "1355"]?allow) ; мой домашний телефон
same => n, Goto(disallow) ; по умолчанию - нельзя звонить на международные линии
same => n(allow), Dial(${MEGAFON}/${EXTEN}) ; вызов через мегафон
same => n(disallow), Answer
same => n, Playtones(info)
same => n, Wait(10)
same => n, HangUp
; междугородный вызов (номер начинается с 8-(кроме единицы))
; если у звонящего определенный номер, то разрешаем
; по умолчанию - запрещено
exten => _8[023456789].,1, NOOP()
same => n, GotoIf($["${CALLERID(num)}" = "1355"]?allow) ; мой домашний телефон
same => n, GotoIf($["${CALLERID(num)}" = "1420"]?allow) ; секретарь
same => n, GotoIf($["${CALLERID(num)}" = "1421"]?allow) ; секретарь
same => n, GotoIf($["${CALLERID(num)}" = "1433"]?allow) ; факс секретаря
same => n, GotoIf($["${CALLERID(num)}" = "1502"]?allow) ; главбух
same => n, GotoIf($["${CALLERID(num)}" = "1717"]?allow) ; директор
same => n, GotoIf($["${CALLERID(num)}" = "1707"]?allow) ; замначцеха 1
same => n, GotoIf($["${CALLERID(num)}" = "1701"]?allow) ; начцеха 1
same => n, GotoIf($["${CALLERID(num)}" = "1706"]?allow) ; начцеха 2
same => n, Goto(disallow) ; по умолчанию - нельзя звонить на междугородные линии
same => n(allow), Dial(${MEGAFON}/${EXTEN}) ; вызов через мегафон
same => n(disallow), Answer
same => n, Playtones(info)
same => n, Wait(10)
same => n, HangUp
; мобильный вызов (номер начинается с 8-9XX)
; если у звонящего определенный номер - запрещаем
; по умолчанию разрешено
; (NB: код 8-9XXX у Осетии, Дагестана или чего-то такого, поэтому возможен вызов в эти области)
exten => _89XXXXXXXXX,1, NOOP()
same => n, GotoIf($["${CALLERID(num)}" = "1742"]?disallow) ; кладовщики
same => n, Goto(allow) ; по умолчанию - можно звонить на моб телефоны
same => n(allow), Dial(${MEGAFON}/${EXTEN}) ; вызов через мегафон
same => n(disallow), Answer
same => n, Playtones(info)
same => n, Wait(10)
same => n, HangUp
; местный вызов (в номере семь цифр)
; по умолчанию выпускаем, но для некоторых можно сделать исключение
exten => _XXXXXXX,1, NOOP()
same => n, GotoIf($["${CALLERID(num)}" = "1742"]?disallow) ; кладовщики
same => n, Goto(allow) ; по умолчанию - можно звонить на городские номера
same => n(allow), Dial(${MEGAFON}/${EXTEN}) ; вызов через мегафон
same => n(disallow), Answer
same => n, Playtones(info)
same => n, Wait(10)
same => n, HangUp
; экстренные службы (112, 01, 02, 03, 04, 010, 020, 030, 040, 060)
; выпускаются независимо от других разрешений и уровней звонящего
exten => _0[1234],1, Dial(${MEGAFON}/${EXTEN})
exten => _0[12346]0,1, Dial(${MEGAFON}/${EXTEN})
exten => 112,1, Dial($MEGAFON}/${EXTEN})
[switching] ; распределение звонков в зависимости от номера
; унификация набранных номеров
; это нужно:
; 1. для обработки номеров из сип-клиентов: номера в записной книжке сотового телефона обычно в международном формате
; 2. чтобы не запрещать звонки на 8-812-123-45-67: хоть и через восьмерку, но это местный звонок
;
exten => _+., 1, Goto(810${EXTEN:1},1) ; если номер пришел в международном формате (+1-555-555-55-55), отрезаем плюс и приделываем 810
exten => _+7.,1, Goto(8${EXTEN:2},1) ; если номер пришел в международном формате (+7-931-555-55-55), отрезаем +7 и приделываем 8
exten => _+7812.,1, Goto(${EXTEN:5},1) ; если номер пришел в международном формате (+7-812-555-55-55), отрезаем +7812
exten => _8107.,1, Goto(8${EXTEN:4},1) ; если звонок в Россию через 8-10-7, то отрезаем 8-10-7 и приделываем 8
exten => _8812.,1, Goto(${EXTEN:4},1) ; если звонок в Петербург через 8-812, то отрезаем 8-812
exten => _8107812.,1, Goto(${EXTEN:7},1) ; если звонок в СПб через 8-10-7-812, то отрезаем 8-10-7-812
; распределение входящих звонков (заодно звонки из офиса самим себе не тарифицируются)
exten => 4234560,1,Goto(opt_ivr,s,1) ; ivr оптового отдела
exten => 4234561,1,Goto(opt_ivr,s,1) ; временно свободный номер: ivr оптового отдела
exten => 4234562,1,Dial(${MD110}/1722,180) ; кладовщик
exten => 4234563,1,Dial(${MD110}/1709,180) ; максим ловкий
exten => 4234564,1,Goto(opt_ivr,s,1) ; временно свободный номер: ivr оптового отдела
exten => 4234565,1,Goto(opt_ivr,s,1) ; временно свободный номер: ivr оптового отдела
exten => 4234566,1,Dial(SIP/1523,180) ; программисты
exten => 4234567,1,Goto(roznica_ivr,s,1) ; ivr розницы
exten => 4234568,1,Goto(lesopilka_ivr,${EXTEN},1) ; ivr лесопилки
exten => 4315248,1,Goto(lesopilka_ivr,${EXTEN},1) ; ivr лесопилки (бывший Лосево)
exten => 4442523,1,Goto(lesopilka_ivr,${EXTEN},1) ; ivr лесопилки (бывший Поле)
exten => 4242424,1,Dial(${MD110}/4242424) ; disa на md110 (пока не сделал удобную здесь)
exten => 4299032,1,Dial(${MD110}/1720,180) ; соседний офис
; автоматический факс
exten=> 1300,1,Goto(opt_ivr,2,1)
; диктофон для записи автоответчика
exten => 1399,1,Noop(Recorder)
same => n, Festival('это диктофон. говорите после сигнала. когда закончите, положите трубку.')
same => n, Set(RECFILE=/files/common/rec/rec_${STRFTIME(${EPOCH},,%Y-%m-%d_%H-%M-%S)})
same => n, Record(${RECFILE}.wav,,,yk)
same => n, Hangup()
; в принципе, избыточно, но явно: номерные группы раскидываю пр местам назначения
exten => _11XX,1,Dial(${MD110}/${EXTEN},180)
exten => _12XX,1,Dial(${MD110}/${EXTEN},180)
exten => _13XX,1,Dial(IAX2/${EXTEN},180) ; софтфоны и сипфоны
exten => _14XX,1,Dial(${MD110}/${EXTEN},180)
exten => _15XX,1,Dial(${MD110}/${EXTEN},180)
exten => _16XX,1,Dial(${MD110}/${EXTEN},180)
exten => _17XX,1,Dial(SIP/${EXTEN},180) ; шлюз производства
exten => _18XX,1,Dial(${MD110}/${EXTEN},180)
exten => _19XX,1,Dial(${MD110}/${EXTEN},180)
; "быстрый набор" на сотовые
exten => 1001,1,Dial(${MEGAFON}/89311234566,180) ; Павлов
exten => 1002,1,Dial(${MEGAFON}/89212345678,180) ; Чернякова
exten => 1003,1,Dial(${MEGAFON}/89213456789,180) ; Волжанин
exten => 1004,1,Dial(${MEGAFON}/89211345678,180) ; Эльдар
exten => 1005,1,Dial(${MEGAFON}/89211414141,180) ; Ловчиков
exten => 1006,1,Dial(${MEGAFON}/89218484844,180) ; Дмитрий Павлов
exten => 1007,1,Dial(${MEGAFON}/89218585864,180) ; Казимиров
[compatibility] ; переход со старой станции на новую
exten => 1588,1,NOOP(proger)
same => n, Festival('новый номер программистов 15 23')
same => n, Dial(SIP/1523, 180)
same => n, Congestion
; сделать через неделю: оповещение вместо переключения
exten => 1501,1, Dial(SIP/1700, 180)
exten => 1820,1, Dial(SIP/1720, 180)
exten => 1622,1, Dial(SIP/1722, 180)
exten => 1423,1, Dial(SIP/1723, 180)
exten => 1534,1, Dial(SIP/1714, 180)
exten => 1134,1, Dial(SIP/1731, 180)
; ================== DISA todo =====================
[disa]
exten => s,1,Noop(DISA)
same => n, Read(LastThreeDigits,,3,s,1,10) ; ждать тонового ввода трех цифр с таймаутом 10 сек Read(variable[,filename][,maxdigits][,option][,attempts][,timeout])
same => n, GotoIf($[ "${LEN(${LastThreeDigits})}"=="3" ]?dial:bye) ; если набрано другое число цифр, то положить трубку
same => n(dial), Set(NumberToDial=${EXTEN}${LastThreeDigits}) ; переменная "NumberToDial" - это набранное число блока (1) и набранные тоном три цифры
same => n, NOOP(DISA: ${NumberToDial} to dial)
same => n, Goto(switching,${NumberToDial},1)
same => n(bye), Hangup()
================= CALL RECORDING todo =================
[callrecorder]
exten => record,1,NOOP(CALL RECORDING)
same => n, Set(RECFILE=/files/common/rec/${STRFTIME(${EPOCH},,%Y-%m-%d_%H-%M-%S)}-${CALLERID(num)}
same => n, MixMonitor(${RECFILE}.wav)
same => n, Return
; =================== ОПТОВИКИ ==========================================
[opt_ivr]
exten => s,1,Noop(OPT IVR GREETING)
;same => n, Gosub(record_call,1)
same => n(replay), Wait(1)
same => n, Background(/files/asterisk/alaw/irina_hello2,m)
same => n, Background(/files/asterisk/alaw/irina_press2,m)
same => n, GotoIfTime(9:00-18:00,mon-fri,*,*?workday:weekend)
same => n(weekend), NOOP('OPT IVR S:weekend')
same => n, Background(/files/asterisk/alaw/irina_office_off_now)
same => n, Background(/files/asterisk/alaw/irina_call_worktime)
same => n, Background(/files/asterisk/alaw/irina_office_workhours)
same => n, Background(/files/asterisk/alaw/irina_disa)
same => n, Wait(10)
same => n, Playback(/files/asterisk/alaw/irina_bye)
same => n, Hangup()
same => n(workday), NOOP('OPT IVR S:workday')
same => n, Background(/files/asterisk/alaw/irina_press4560,m)
same => n(disa), NOOP('OPT IVR S:disa')
same => n, Background(/files/asterisk/alaw/irina_disa)
same => n, WaitExten(10)
same => n, Goto(0,1)
exten => 1,1,NOOP(OPT IVR DISA)
same => n, Read(LastThreeDigits,,3,s,1,10) ; ждать тонового ввода трех цифр с таймаутом 10 сек Read(variable[,filename][,maxdigits][,option][,attempts][,timeout])
same => n, GotoIf($[ "${LEN(${LastThreeDigits})}"=="3" ]?dial:bye) ; если набрано другое число цифр, то положить трубку
same => n(dial), Set(NumberToDial=${EXTEN}${LastThreeDigits}) ; переменная "NumberToDial" - это набранное число блока (1) и набранные тоном три цифры
same => n, NOOP(OPT IVR DISA: ${NumberToDial} to dial)
same => n, Goto(switching,${NumberToDial},1)
same => n(bye), Hangup()
exten => 2,1,NOOP(OPT IVR FAX)
same => n, Set(FNAME=${STRFTIME(${EPOCH},,%Y-%m-%d_%H-%M-%S)}-${CALLERID(num)}-${CALLERID(dnid)})
same => n, ReceiveFax(/files/faxes/${FNAME}.tif)
same => n, System(/bin/cp "/files/faxes/${FNAME}.tif" /files/opt)
same => n, System(echo HELLO|/usr/bin/mailx -v -r "zak@microsoft.ru" -s "OPT FAX ROBOT ${CALLERID(num)}" -S smtp="relay.peterstar.net" -a /files/faxes/${FNAME}.tif zak@microsoft.ru)
same => n, Hangup()
exten => 4,1,NOOP(OPT IVR TRANSFER TO BUH)
same => n, Playback(/files/asterisk/alaw/irina_transfer2)
same => n, Dial(${MD110}/1600&${MD110}/1601&${MD110}/1402&${MD110}/1403,30,m)
same => n, Goto(s,replay)
exten => 5,1,NOOP(OPT IVR TRANSFER TO GARANT)
same => n, Playback(/files/asterisk/alaw/irina_transfer2)
same => n, Dial(${MD110}/1501,30,m)
same => n, Goto(s,replay)
exten => 6,1,NOOP(OPT IVR TRANSFER TO LOGIST)
same => n, Playback(/files/asterisk/alaw/irina_transfer2)
same => n, Dial(${MD110}/1503,30,m)
same => n, Goto(s,replay)
exten => 0,1,NOOP(OPT IVR TRANSFER TO OPERATOR)
same => n, Playback(/files/asterisk/alaw/irina_transfer2)
same => n, Dial(${MD110}/1220,15,m)
same => n, Dial(${MD110}/1221,15,m)
same => n, Playback(/files/asterisk/alaw/irina_noanswer)
same => n, Wait(2)
same => n, Goto(s,replay)
exten => record_call,1,NOOP(CALL RECORDING)
same => n, Set(RECFILE=/files/common/opt_${STRFTIME(${EPOCH},,%Y-%m-%d_%H-%M-%S)}-from-${CALLERID(num)})
same => n, MixMonitor(${RECFILE}.wav)
same => n, Return
; =============== ЛЕСОПИЛКА ======================
; голосовое меню лесопилки
[lesopilka_ivr]
exten => _XXXXXXX,1,Noop(lesopilka)
same => n, Answer() ; снимаем трубку
;same => n, Gosub(callrecorder,record,1) ; debug purpose
same => n, Wait(1) ; здесь пауза, чтобы не проглатывались первые звуки
; здесь определены номера телефонов и транки, через которые
; эти номера будут набраны
same => n, Set(losevo=${MEGAFON}/3453454)
same => n, Set(sosnovo=${MEGAFON}/5345256)
same => n, Set(pole=${MEGAFON}/9345345)
same => n, Set(manager=${MD110}/1480&${MD110}/1229) ; todo: сделать по очереди!
; если пн-сб, 10-20 часов - переход на метку workday (рабочий день)
; иначе на метку offtime (нерабочее время)
same => n, GotoIfTime(10:00-20:00,mon-sat,*,*?workday:offtime)
; нерабочее время: проигрываем звонящему сообщение и кладем трубку
same => n(offtime), NOOP('OFFTIME')
;same => n, Set(CDR(userfield)=offtime)
same => n, Background(/files/asterisk/alaw/lesopilka-off,m)
same => n, Hangup()
; рабочий день:
; звоним в каждый офис по 12 секунд
; вместо гудков проигрываем музыку группы lesopilka (определена в musiconhold.conf)
; если никто не ответил - пробуем опять дозвониться
same => n(workday), NOOP('WORKDAY')
;same => n, Dial(${losevo}&${sosnovo}&${pole},16,m(manager))
same => n,Set(CDR(userfield)=3453454)
same => n,Dial(${losevo},12,m(lesopilka))
same => n,Set(CDR(userfield)=5345256)
same => n,Dial(${sosnovo},12,m(lesopilka))
same => n,Set(CDR(userfield)=9345345)
same => n,Dial(${pole},12,m(lesopilka))
same => n,Set(CDR(userfield)=1480-1229)
same => n,Dial(${manager},12,m(lesopilka))
same => n,Goto(workday)
; =============== РОЗНИЦА ======================
[roznica_ivr]
exten => s,1,Noop(ROZNICA)
;same => n, Gosub(record_call,1)
same => n(replay), Wait(1)
same => n, Background(/files/asterisk/alaw/roznica-greeting,m)
same => n, GotoIfTime(9:00-19:00,mon-fri,*,*?workday:offtime)
same => n(offtime), NOOP('OFFTIME')
same => n, Background(/files/asterisk/alaw/roznica-offtime,m)
same => n, Background(/files/asterisk/alaw/roznica-schedule,m)
same => n, Background(/files/asterisk/alaw/roznica-website,m)
same => n, Wait(1)
same => n, Background(/files/asterisk/alaw/roznica-press2,m)
same => n, Background(/files/asterisk/alaw/roznica-disa,m)
same => n, Wait(10)
same => n, Hangup()
same => n(workday), NOOP('OPT IVR S:workday')
same => n, Background(/files/asterisk/alaw/roznica-disa,m)
same => n, Background(/files/asterisk/alaw/roznica-press2,m)
same => n, Background(/files/asterisk/alaw/roznica-press3,m)
same => n, Wait(3)
same => n, Goto(0,1)
exten => 1,1,NOOP(DISA)
same => n, Read(LastThreeDigits,,3,s,1,10) ; ждать тонового ввода трех цифр с таймаутом 10 сек Read(variable[,filename][,maxdigits][,option][,attempts][,timeout])
same => n, GotoIf($[ "${LEN(${LastThreeDigits})}"=="3" ]?dial:bye) ; если набрано другое число цифр, то положить трубку
same => n(dial), Set(NumberToDial=${EXTEN}${LastThreeDigits}) ; переменная "NumberToDial" - это набранное число блока (1) и набранные тоном три цифры
same => n, NOOP(DISA: ${NumberToDial} to dial)
same => n, Goto(switching,${NumberToDial},1)
same => n(bye), Hangup()
exten => 3,1,NOOP(ROZNICA SALES)
same => n, Playback(/files/asterisk/alaw/roznica-transer)
same => n, Dial(${MD110}/1274&${MD110}/1275&${MD110}/1276&${MD110}/1250,30,m)
same => n, Goto(s,replay)
exten => 0,1,NOOP(ROZNICA TRANSFER TO OPERATOR)
same => n, Playback(/files/asterisk/alaw/roznica-transfer-operator)
same => n, Dial(${MD110}/1280,15,m)
same => n, Dial(${MD110}/1281,15,m)
same => n, Wait(2)
same => n, Goto(s,replay)
Задан: 2016-04-07 23:08:17 +0400
Просмотрен: 1,094 раз
Обновлен: Apr 07 '16
Проект компании "АТС Дизайн"
Asterisk® и Digium® являются зарегистрированными торговыми марками компании
Digium, Inc., США.
IP АТС Asterisk распространяется под лицензией
GNU GPL.
это бизнес предложение? "лучше" чего? быстрее? проще? меньше обращений к диску? разумнее? диалплан фиговый. почитайте книжки, extensions.conf.sample
meral ( 2016-04-08 00:34:32 +0400 )редактироватьМягко говоря - нахальненько .
zzuz ( 2016-04-08 00:44:34 +0400 )редактироватьФиговый - понятно. Что именно фигово?
likov ( 2016-04-08 11:28:49 +0400 )редактироватьНет модульности, нет ясности, зачемто длинные пути файлов(хотя достаточно сделать один симлинк), нет анализа резултатов вызова абонента перед вызовом следующего, callerid секция выполняется попорядку вместо использования callerid matching. ну и пользователь хочет дорогой експертный совет получить бесплатно, причем не уточняет критерия и вылаживает простыню на прочтение которой 10 минут уходит, что тоже немаловажно.
meral ( 2016-04-09 03:45:06 +0400 )редактировать