; extensions.conf ; $Id: extensions.conf,v 1.1.1.1 2026/07/27 21:03:28 dev Exp $ ; ; 設定ファイル「extensions.conf」に記述された「ダイヤルプラン」の一部を指します。 ; ダイヤルプランは、Asteriskのすべての動作を制御・実行するための基本計画(マスタープラン)です。 ; これらは必ずしも物理デバイスと結びついているわけではなく、 ; 自動応答(IVR)メニューや会議通話(カンファレンスブリッジ)機能などにも利用されます。 ; つまり、ダイヤルプランは着信や発信がどのように処理・ルーティングされるかを制御するものであり、 ; PBXを介したすべての接続の挙動をここで設定します。 [globals] INTERNAL_DIAL_OPT=,30 COMMAND_SYSLOG=/usr/bin/logger ; === 光電話 外線着信 === [from-hikari] exten => s,1,Set(__DIRECTION=INBOUND) same => n,NoOp(*** outside -> inside ***) same => n,Set(SRCNUM=${CALLERID(num)}) same => n,NoOp(${SRCNUM}) same => n,Set(DSTNUM=${CUT(CUT(PJSIP_HEADER(read,To),@,1),:,2)}) same => n,NoOp(${DSTNUM}) same => n,Set(CDR(userfield)=${DSTNUM}) ; --- ブラックリストチェック --- same => n(blacklist_chk),NoOp(*** BlackList Check ***) same => n,Gosub(app-blacklist-check,s,1) same => n,GotoIf($["${BLACK_FLAG}"="1"]?blacklisted:splist_chk) same => n(blacklisted),Answer same => n,Set(BLDEST=${DB(blacklist/dest)}) same => n,ExecIf($["${BLDEST}"=""]?Set(BLDEST=app-blackhole,hangup,1)) same => n,GotoIf(${LEN(${BLDEST})}?${BLDEST}:app-blackhole,zapateller,1) same => n,Hangup() ; --- 特番チェック --- same => n(splist_chk),NoOp(*** SPList Check ***) same => n,Gosub(app-whitelist-check,s,1) same => n,Set(SPNUM_FLAG=0) same => n,Set(SLDEST="") same => n,Gosub(app-caller-check,${SRCNUM},1) same => n,GotoIf($["${SPNUM_FLAG}"="0"]?select) same => n,GotoIf($["${WHITE_FLAG}"="1"]?select) same => n(splisted),Answer same => n,GotoIf(${LEN(${SLDEST})}?${SLDEST}:app-blackhole,zapateller,1) same => n,Hangup() ; --- 着信番号毎に処理振り分け --- same => n(select),Goto(${DSTNUM},1) exten => _0001234567,1,Goto(DSTNUM011,receive01,1) exten => _0001234568,1,Goto(DSTNUM021,receive02,1) exten => 3,1,Goto(DSTNUM011,receive01,1) [DSTNUM011] exten => receive01,1,NoOp(**** Main TELNumber ****) same => n,Hangup() [DSTNUM021] ; --- FAX受信 --- exten => receive02,1,NoOp(**** Sub FaxNumber ****) same => n,Set(FAXOPT(ecm)=yes) same => n,Set(FAXOPT(headerinfo)=0924095147) same => n,Set(FAXOPT(localstationid)=0924095147) same => n,Set(FAXOPT(maxrate)=14400) same => n,Set(FAXOPT(minrate)=2400) same => n,Set(FAXFILE=${EPOCH}.tif) same => n,NoOp(**** RECEIVING FAX : ${FAXFILE} ****) same => n,ReceiveFAX(/var/spool/asterisk/faxin/${FAXFILE}) same => n,Hangup() ; Hangup. exten => h,1,NoOp(rec-fax: Hangup ) same => n,NoOp(FAX Status: ${FAXSTATUS}) same => n,NoOp(FAXOPT(ecm): ${FAXOPT(ecm)}) same => n,NoOp(FAXOPT(filename): ${FAXOPT(filename)}) same => n,NoOp(FAXOPT(headerinfo): ${FAXOPT(headerinfo)}) same => n,NoOp(FAXOPT(localstationid): ${FAXOPT(localstationid)}) same => n,NoOp(FAXOPT(maxrate): ${FAXOPT(maxrate)}) same => n,NoOp(FAXOPT(minrate): ${FAXOPT(minrate)}) same => n,NoOp(FAXOPT(pages): ${FAXOPT(pages)}) same => n,NoOp(FAXOPT(rate): ${FAXOPT(rate)}) same => n,NoOp(FAXOPT(remotestationid): ${FAXOPT(remotestationid)}) same => n,NoOp(FAXOPT(resolution): ${FAXOPT(resolution)}) same => n,NoOp(FAXOPT(faxdetect): ${FAXOPT(faxdetect)}) same => n,NoOp(FAXOPT(status): ${FAXOPT(status)}) same => n,NoOp(FAXOPT(statusstr): ${FAXOPT(statusstr)}) same => n,NoOp(FAXOPT(error): ${FAXOPT(error)}) same => n,System(/opt/asterisk-tools/bin/fax2pdf.pl -f /var/spool/asterisk/faxin/${FAXFILE} --from=${CALLERID(num)} --to=${DSTNUM} --status=${FAXSTATUS} --err="${FAXOPT(error)}") same => n,Hangup() [DSTNUM022] ; --- FAX受信 (iaxmodem/HylaFAX) === exten => receive02,1,Dial(IAX2/iaxmodem) same => n,Hangup [app-caller-check] ; --- 特番ルール --- ; ホワイトリスト自体のfuncは無し ; AsteriskのDB_EXISTS関数は、AstDB(Asterisk内部データベース)に特定のキーが存在するかを確認し、存在すれば1、存在しなければ0を返します。この関数は、キーが存在する場合、その値を${DB_RESULT}変数に自動的にセットするため、確認と値の取得を同時に行える便利なダイヤルプラン関数です ; (使用例) ; same => n,Set(Exists=${DB_EXISTS(family/key)}) ; same => n,GotoIf($[${Exists} = 1]?found:notfound) ; ; パターンマッチ文字 先頭に"_" (アンダーバー)を付けると、パターンマッチとなる ; X : 0-9 ; Z : 1-9 ; N : 2-9 ; . : 1文字以上の任意の文字や数字(ワイルドカード) ; ! : 0文字以上の任意の文字や数字(最短一致ワイルドカード。マッチした時点で評価を確定) ; ; [注意] ; パターンマッチで文字数(桁数)までは見ない ; 例) _0800. なら、0800123 でも 08001 でも、08001234567890 でもマッチする ; 非通知着信 exten => anonymous,1,NoOp(*** CallNumer No CallerID ***) same => n,Set(SPNUM_FLAG=1) same => n,ExecIf($[${SLDEST}=""]?Set(SLDEST=app-blackhole,186announce,1)) same => n,Return() ; 0120/0800 フリーダイヤル exten => _0120.,1,Goto(_0800.,fdial) exten => _0800.,1,Goto(_0800.,fdial) same => n(fdial),NoOp(*** CallNumer 0120/0800 ***) same => n,Set(SPNUM_FLAG=1) same => n,ExecIf($[${SLDEST}=""]?Set(SLDEST=app-blackhole,kotei-announce,1)) same => n,Return() ; 0570 ナビダイヤル exten => _0570.,1,NoOp(*** CallNumer 0570 ***) same => n,Set(SPNUM_FLAG=1) same => n,ExecIf($[${SLDEST}=""]?Set(SLDEST=app-blackhole,no-service,1)) same => n,Return() ; 050 IP電話番号 exten => _050.,1,NoOp(*** CallNumer 050 ***) same => n,Set(SPNUM_FLAG=1) same => n,ExecIf($[${SLDEST}=""]?Set(SLDEST=app-blackhole,busy,1)) same => n,Return() ; 060,070,080,090 携帯番号 (設定見合わせ中) ;exten => _060Z.,1,Goto(_090Z.,ktai) ;exten => _070Z.,1,Goto(_090Z.,ktai) ;exten => _080Z.,1,Goto(_090Z.,ktai) ;exten => _090Z.,1,Goto(_090Z.,ktai) ;same => n(ktai),NoOp(*** CallNumer 060/070/080/090 ***) ;same => n,Set(SPNUM_FLAG=1) ;same => n,ExecIf($[${SLDEST}=""]?Set(SLDEST=app-blackhole,busy,1)) ;same => n,Return() ; 国際電話 exten => _ZXXXX.,1,NoOp(*** CallNumer International ***) same => n,Set(SPNUM_FLAG=1) same => n,ExecIf($[${SLDEST}=""]?Set(SLDEST=app-blackhole,no-service,1)) same => n,Return() ; 固定電話( 1桁目:0 2~4桁目:1-9 5桁目以降:0-9 の計10桁) exten => _0ZZZXXXXXX,1,NoOp(*** CallNumer normal 10 ***) same => n,Set(SPNUM_FLAG=0) same => n,Set(SLDEST="") same => n,Return() ; テスト用 exten => _Z,1,NoOp(*** CallNumer Test ***) same => n,Set(SPNUM_FLAG=1) same => n,ExecIf($[${SLDEST}=""]?Set(SLDEST=app-blackhole,reject-call,1)) same => n,Return() ; キャッチオール ルート (一番最後に評価されるはず) ; このconfファイルの書き順では評価されず、ルールに従って順番が並び変えられる。 ; 並び替え後の順番は、asterisk CLI より、「dialplan show app-caller-check」にて確認の事。 ; 並び替えルールは、 ; https://docs.asterisk.org/Configuration/Dialplan/Contexts-Extensions-and-Priorities/ ; ・Dialplan search order を参照 exten => _X.,1,NoOp(*** Ext... ***) same => n,Set(SPNUM_FLAG=0) same => n,Set(SLDEST="") same => n,Return() ; === 内線設定 === [from-internal] ; --- 内線から外線の規制 --- ; 暫定 全ての発信を禁止 exten => _X.,1,Set(__DIRECTION=OUTGOING) same => n,NoOp(*** inside -> outside ***) same => n,Hangup() [app-whitelist-check] exten => s,1,NoOp(*** WhiteList Check ***) same => n,Set(WHITELIST_CHK=1) same => n,Set(Exists=${DB_EXISTS(whitelist/${CALLERID(num)})}) same => n,ExecIf($[${Exists} = 1]?Set(WHITE_FLAG=1):Set(WHITE_FLAG=0)) same => n,NoOp(WHITE_FLAG => ${WHITE_FLAG}) same => n,Return() [app-blacklist-check] exten => s,1,NoOp(*** BlackList Check ***) same => n,Set(BLACKLIST_CHK=1) same => n,ExecIf($["${BLACKLIST()}"="1"]?Set(BLACK_FLAG=1):Set(BLACK_FLAG=0)) ;same => n,ExecIf($["${BLACKLIST()}"="1"]?Set(BLACK_FLAG=1)) same => n,NoOp(BLACK_FLAG => ${BLACK_FLAG}) same => n,Return() [app-blackhole] exten => busy,1,Noop(Blackhole No.3: Busy) same => n,Progress same => n,Busy(20) same => n,Hangup() exten => ring,1,Noop(Blackhole No.6: Ring) same => n,Answer same => n,Playtones(ring) same => n,Wait(300) same => n,Hangup() exten => kotei-aanounce,1,Noop(Blackhole No.2: Kotei-Announce) same => n,Answer same => n,Wait(1) same => n,Zapateller() same => n,Playback(kotei-announce) same => n,Hangup() exten => no-service,1,Noop(Blackhole No.1: No service) same => n,Answer same => n,Wait(1) same => n,Zapateller() same => n,Playback(ss-noservice) same => n,Hangup() exten => reject-call,1,Noop(Blackhole No.4: Reject calls) same => n,Answer same => n,Wait(1) same => n,Zapateller() same => n,Playback(no-connect) same => n,Hangup() exten => 186announce,1,Noop(Blackhole No.5: 186 Announce) same => n,Answer same => n,Wait(1) same => n,Zapateller() same => n,Playback(186Announce) same => n,Hangup()