對於使用 DDNS 的 Trunk,當對方主機的 IP 變更後,該 Trunk 總是呈現 UNREACHABLE 狀態,即使 DNS 記錄已經被更新了。
Ans: 將以下程式碼,使用 Cron 定時執行它。此程式在運作時不會對線上的通話有任何影響
檔名:ast-fix-ddns.sh
reference to undefined name 'syntax' Exception of type 'MindTouch.Deki.Script.Runtime.DekiScriptUndefinedNameException' was thrown. (click for details)Callstack:
at VoIP/IP_PBX/軟體式_IP_PBX/Asterisk_-_免費_IP_PBX_網路電話交換平台/Tips/使用_DDNS_的問題
MindTouch.Deki.Script.Runtime.DekiScriptUndefinedNameException: reference to undefined name 'syntax' Exception of type 'MindTouch.Deki.Script.Runtime.DekiScriptUndefinedNameException' was thrown.
at MindTouch.Deki.Script.Compiler.DekiScriptExpressionEvaluation.Visit (MindTouch.Deki.Script.Expr.DekiScriptVar expr, DekiScriptExpressionEvaluationState state) [0x00000] in <filename unknown>:0
at MindTouch.Deki.Script.Expr.DekiScriptVar.VisitWith[DekiScriptExpressionEvaluationState,Range] (IDekiScriptExpressionVisitor`2 visitor, DekiScriptExpressionEvaluationState state) [0x00000] in <filename unknown>:0
at MindTouch.Deki.Script.Compiler.DekiScriptExpressionEvaluation.Evaluate (MindTouch.Deki.Script.Expr.DekiScriptAccess expr, DekiScriptExpressionEvaluationState state, Boolean evaluateProperties) [0x00000] in <filename unknown>:0
at MindTouch.Deki.Script.Compiler.DekiScriptExpressionEvaluation.Visit (MindTouch.Deki.Script.Expr.DekiScriptAccess expr, DekiScriptExpressionEvaluationState state) [0x00000] in <filename unknown>:0
at MindTouch.Deki.Script.Expr.DekiScriptAccess.VisitWith[DekiScriptExpressionEvaluationState,Range] (IDekiScriptExpressionVisitor`2 visitor, DekiScriptExpressionEvaluationState state) [0x00000] in <filename unknown>:0
at MindTouch.Deki.Script.Compiler.DekiScriptExpressionEvaluation.Visit (MindTouch.Deki.Script.Expr.DekiScriptCall expr, DekiScriptExpressionEvaluationState state) [0x00000] in <filename unknown>:0
at MindTouch.Deki.Script.Expr.DekiScriptCall.VisitWith[DekiScriptExpressionEvaluationState,Range] (IDekiScriptExpressionVisitor`2 visitor, DekiScriptExpressionEvaluationState state) [0x00000] in <filename unknown>:0
at MindTouch.Deki.Script.Compiler.DekiScriptExpressionEvaluation.Visit (MindTouch.Deki.Script.Expr.DekiScriptSequence expr, DekiScriptExpressionEvaluationState state) [0x00000] in <filename unknown>:0
at MindTouch.Deki.Script.Expr.DekiScriptSequence.VisitWith[DekiScriptExpressionEvaluationState,Range] (IDekiScriptExpressionVisitor`2 visitor, DekiScriptExpressionEvaluationState state) [0x00000] in <filename unknown>:0
at MindTouch.Deki.Script.Compiler.DekiScriptExpressionEvaluation.Visit (MindTouch.Deki.Script.Expr.DekiScriptReturnScope expr, DekiScriptExpressionEvaluationState state) [0x00000] in <filename unknown>:0
Notes:
1. PEER, 使用 DDNS 的 Trunk Name。
2. ASTCMD, 系統上 asterisk 指令路徑。
3. NSCMD, 系統上 nslookup 指令路徑。
Update:
2009/8/30
- 解析 IP 時若系統無 nslookup 指令會使用 ping 指令取代 (此法可用於 embedded system)
Cron table 設定每10分鐘執行
#>crontab -e
*/10 * * * * /root/bin/ast-fix-ddns.sh > /dev/null 2>&1
Notes: 指令的路徑請自行修改。
自己的主機使用 Dynamic IP,只要 IP 變更,所有 SIP Trunk 都會無法連結
寫一個 Cron job 定時偵測自己的外部 IP 是否已變更,若有變更時,自動重啟 asterisk 服務即可。重啟服務的期間會終止所有通話功能
技巧提示:
EXTIP=$(wget -q -O - http://checkip.dyndns.com|cut -b77-92|tr -d "</body>");echo $EXTIP
或
EXTIP=$(wget -q -O - http://www.neorouter.com/ip.php|tr -d "</body>");echo $EXTIP
- 修改為 static IP 模式時,系統要作 sip reload;若修改為 dynamic IP 模式,系統要作服務重啟。
- 以上若選擇前者,為了不會對系統原始設計架構有任何影響,將新 IP 寫入一個新檔 sip_externip.conf,然後在 sip.conf 使用 include 方式套用。
參考詳細資訊
謝謝。
KK