; 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()